我的任务是将文件读入链表。该文件包含一个名称和一个字母,指示如何处理名称,从列表中添加或删除。该文件采用以下格式:
Kathy a
Beverly a
查克
Radell 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 %s\n", 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("%s\n", tempname);
printf("%s\n", 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);
}
答案 0 :(得分: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
。
使用您的代码,添加似乎工作正常,并且通过我的更改,删除看起来没问题。