在文本文件中扫描到链接列表

我只是在学习链接列表,我必须做一个包含许多部分的任务,但我已经开始了,我需要做的第一件事是将输入文件读入链表。 部分文件是:

George Washington, 2345678 John Adams, 3456789 Thomas Jefferson, 4567890 James Madison, 0987654 James Monroe, 9876543 John Quincy Adams, 8765432

并包含总共26行。

我现在要做的只是简单地在文件中读取。 我尝试使用此代码(现在在main中)

 #include  #include  struct node{ char name[20]; int id; struct node *next; }*head; int main(void){ struct node *temp; temp = (struct node *)malloc(sizeof(struct node)); head = temp; FILE *ifp; ifp = fopen("AssignmentOneInput.txt", "r"); int c = 0; while(cname); fscanf(ifp, "%d", &temp->id); printf("%d\n", c); temp = temp->next; c++; } 

对于输出,我知道扫描了第一个名称和第一个ID,因为c的值显示为0(现在我任意使用c的值来控制fscanf)。 但在那之后,程序崩溃了。 所以问题必须是temp = temp->next; 它汇编很好。

我对链接列表很新,所以我真的不知道我在做什么。

非常感谢您的帮助!

在以下行中,您已为列表的单个元素(一个struct node )分配了足够的空间,并将head指针指向它:

 temp = (struct node *)malloc(sizeof(struct node)); head = temp; 

稍后您将值读入此元素的nameid字段:

 fscanf(ifp, "%s", &temp->name); fscanf(ifp, "%d", &temp->id); 

但是temp->next指的是什么? 你到目前为止只为一个元素分配了空间。 在将每个后续元素添加到列表中时,需要为每个后续元素分配空间。

编辑:正如下面指出的@ merlin2011,这个答案将简单地帮助您解决程序崩溃,但不会完全让您的程序正常运行。 但是,希望你能够在没有崩溃的情况下更好地调试它。

主要问题当然是temp = temp->next将temp设置为next ,从未初始化,导致代码被seg。 下一个循环出错。

有链表问题和输入问题。 建议在找到好的数据之前不要分配空间。

temp_head开始。 代码仅使用temp_headnext字段。

 struct node temp_head; temp_head.next = NULL; struct node *p = &temp_head; 

每当代码读取行数据时,建议使用fgets()读取 ,然后扫描缓冲区。

 char buf[100]; while (fgets(buf, sizeof buf, ifp) != NULL) { struct node nbuf; 

使用sscanf()扫描缓冲区。 使用'%[^,]'读取直到','

  if (2 != sscanf(buf, " %19[^,],%d", nbuf.name, &nbuf.id)) { break; // Invalid data encountered } nbuf.next = NULL; // Code does not allocate data until good data was found p->next = malloc(sizeof *(p->next)); if (p->next == NULL) break; // OOM p = p->next; *p = nbuf; // Copy the data } head = temp_head.next; 

笔记:

temp = (struct node *)malloc(sizeof(struct node)); 不需要。

考虑这种分配方式: temp = malloc(sizeof *temp) ,IMO更容易编码,维护更少。

fscanf(ifp, "%s", &temp->name); fscanf(ifp, "%d", &temp->id); 有3个问题:字符串输入没有限制,不需要和无法检查扫描结果。 注意上面的代码使用(2 != sscanf(buf, " %19[^,], %d", nbuf.name, &nbuf.id) ,它将字符串输入限制为19个char (为终止'\0'留出空间'\0' ,当字段是数组时,不使用& ,并检查是否成功扫描了2个字段。

main()结束之前,代码应该释放分配的数据。

首先,由于你是用C编写的,所以没有必要使用malloc

其次,您必须自己为每个新节点分配内存。

第三,数组的名称已经衰减到一个指针,所以你不应该使用它,因为那样你就会得到一个指向你不想要的指针。

最后,您需要修复scanf语法以处理字段中的空格。

 #include  #include  #include  struct node{ char name[20]; int id; struct node *next; }*head; int main(void){ struct node *temp; temp = malloc(sizeof(struct node)); temp->next = NULL; head = temp; FILE *ifp; ifp = fopen("AssignmentOneInput.txt", "r"); int c = 0; char buffer[1024]; memset(buffer, 0, 1024); while(c<5){ fgets(buffer, 1024, ifp); sscanf(buffer, "%19[^,], %d", temp->name, &temp->id); printf("%d %s %d\n",c, temp->name, temp->id); temp->next = malloc(sizeof(struct node)); temp = temp->next; temp->next = NULL; c++; } }