我在创建链接列表时遇到问题:我不知道代码中的错误在哪里,你能帮帮我吗?这是代码:
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 255
struct node {
int info;
struct node *next;
} *head = NULL;
int create(FILE **data){
char read[LENGTH];
printf("Write data file name: ");
scanf("%s", read);
*data = fopen (read, "r");
if (data == NULL) {
printf("Error reading given file.");
}
return 0;
}
int put_Symbols_into_list(FILE *data) {
struct node *new_node, *current;
char c;
printf("Data given: ");
while (!feof(data)){
new_node = (struct node*)malloc(sizeof (struct node));
c = fscanf(data, "%s", &new_node -> info);
printf("%s ", &new_node -> info);
if (head == NULL){
head = new_node;
current = new_node;
} else {
current -> next = new_node;
current = new_node;
}
}
}
int main() {
FILE *data;
struct node *n;
create(&data);
put_Symbols_into_list(data);
//display_List(n);
return 0;
}
我做的步骤:读取字符串的数据文件并将其添加到新节点;如果HEAD节点中没有任何数据,则将读取的数据放入其中;否则把它放在新节点。循环,直到数据文件中没有数据。您可以创建新数据文件并将数据放入其中,例如1 0 1 1 2 3 4 5 6
。
答案 0 :(得分:3)
添加新节点后,您没有将current->next
置为NULL。当您尝试浏览列表时,这会产生问题,因为您不知道它的结束位置。我希望这是你面临的问题。
此外,您还拥有冗余代码,因为current
在添加后始终会指向new_node
。所以你不必把它放在if和else块中。只是一个建议。
答案 1 :(得分:0)
您忘记将最后一个节点指向 NULL 。当您尝试遍历列表并显示它时,这将非常重要。
int put_Symbols_into_list(FILE *data)
{
struct node *new_node, *current;
char c;
printf("Data given: ");
while (!feof(data)){
new_node = (struct node*)malloc(sizeof (struct node));
c = fscanf(data, "%d", &new_node -> info);
printf("%d ", new_node->info);
if (head == NULL){
head = new_node;
current = new_node;
} else {
current->next = new_node;
current = new_node;
new_node->next = NULL; // << added
}
}
return 0;
}
答案 2 :(得分:0)
除上述答案外,您在current
中声明put_Symbols_into_list
为本地变量,而不是初始化current
。每次退出put_Symbols_into_list
时,current
的值都可能会丢失。您需要将current
声明为static struct node *current
,将其作为参数传递,或者全局声明它。我赞成在这种情况下使用静态方法。