无法创建单链表

时间:2014-12-15 20:00:41

标签: c nodes singly-linked-list

我在创建链接列表时遇到问题:我不知道代码中的错误在哪里,你能帮帮我吗?这是代码:

#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

3 个答案:

答案 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,将其作为参数传递,或者全局声明它。我赞成在这种情况下使用静态方法。