我的分配是将文件读取到链接列表中。该文件包含一个名称和一个字母,指示如何使用该名称,从列表中添加或删除。该文件以这种格式:
Kathy A
贝弗利A
Chuck A
Radell A
gary a
Roger D
等等...
当我尝试将名称和操作拆分时,问题就会出现。strcmp((甚至无法识别我的代码中的op_code变量。我同时打印了名称和op_code,除非我在op_code附近放一个字符。
这是我的代码:
//Tristan Shepherd
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
char name[42];
struct node *next;
};
void printList(struct node *head)
{
struct node *current = head;
while (current)
{
printf("3 %sn", current->name);
current = current->next;
}
}
void addFront(struct node **head, char *newname)
{
struct node* newnode = (struct node*)malloc(sizeof(struct node));
strcpy(newnode->name, newname);
newnode->next = (*head);
(*head) = newnode;
}
void delete(struct node **head, char *namedelete)
{
struct node* temp = *head, *prev;
if (temp != NULL && temp->name == namedelete)
{
*head = temp->next;
free(temp);
return;
}
while (temp != NULL && temp->name != namedelete)
{
prev = temp;
temp = temp->next;
}
if (temp == NULL) return;
prev->next = temp->next;
free(temp);
}
void readfile(struct node *head)
{
FILE *file = fopen("hw8.data", "r");
char tname[42];
char *tempname = (char*)malloc(42*sizeof(char));
char *op_code = (char*)malloc(1*sizeof(char));
while(fgets(tname, sizeof(tname), file))
{
tempname = strtok(tname, " ");
op_code = strtok(NULL, "n");
printf("%sn", tempname);
printf("%sn", op_code);
if (!strcmp(op_code, "a"))
{
addFront(&head, tempname);
}
else if (!strcmp(op_code, "d"))
{
delete(&head, tempname);
}
}
fclose(file);
printList(head);
}
int main()
{
struct node *head = NULL;
readfile(head);
exit(0);
}
我在readFile()
中看到的唯一问题是内存泄漏。
char *tempname = (char*)malloc(42*sizeof(char));
char *op_code = (char*)malloc(1*sizeof(char));
应该只是
char *tempname;
char *op_code;
strtok()
将字符串分解到位,它不会产生字符串的副本,因此无需分配额外的内存。
我确实在delete()
中看到了一些问题,但是
您应该在这里使用strcmp()
而不是==
,就像您在readfile()
if (temp != NULL && temp->name == namedelete)
while (temp != NULL && temp->name != namedelete)
您也可能需要初始化prev
。
使用您的代码,添加似乎可以正常工作,并且通过我的更改,删除看起来还不错。