通过文本文件读入和显示链接列表

时间:2015-02-08 23:05:41

标签: c pointers linked-list fopen

我正在尝试读取链接列表中的文本文件并成功显示它。但我一直得到" List is Empty"对应于(head == NULL)的消息,而我可以通过在read函数中使用puts(id-> ...)参数成功读取和打印文件一次,但是我无法将显示函数作为我上面提到过。

    struct node
    {
        char name[50];
        int id;
        struct node *next;
    } *head;

    int main()
    {
        int i,num;
        struct node *r;
        head=NULL;
        readfile(*r);
        while (1)
        {
            printf("\nList Operations\n");
            printf("============\n");
            printf("1.Insert\n");
            printf("2.Display\n");
            printf("3.Delete by ID\n");
            printf("4.Delete by Name\n");
            printf("5.Exit\n");
            printf("Enter your choice: ");

            if (scanf("%d", &i) <= 0){
                printf("Enter only an integer\n");
                exit(0);
            } else {
                switch(i)
                {
                     case 1:
                        if(head==NULL)
                        {
                            printf("List is Empty\n");
                        }
                        else
                        {
                            printf("Element in the list are: ");
                        }
                        display(r);
                        break;
                    case 2: 
                        return 0;
                    default:
                        printf("Invalid Choice\n");
                 }
         }
}

void readfile(struct node *r)
{
    r=head;

    char str[50];
    int id;
    FILE *ifp=fopen("One.txt","r");
    while (fgets(str,50,ifp)!=NULL){
        r =(struct node *)malloc(sizeof(struct node));
        char *token=strtok(str,",");
        strcpy(r->name,token);
        puts(r->name);
        token=strtok(NULL,"\n");
        r->id=token;
        puts(r->id);
        r->next=NULL;
        r=r->next;
        }
}

void display(struct node *r)
{
    r = head;
    if(r == NULL)
    {
        return;
    }
    while(r != NULL)
    {
        printf("Student %s has id %d.\n", r->name,r->id);
        r = r->next;

    }
    printf("\n");
}

1 个答案:

答案 0 :(得分:0)

在您提供的代码中,您永远不会为head分配或分配任何内容。我想你需要在某处添加代码

if (head == NULL) {
    head = r;
}

if (head == NULL) {
    head = (struct node *)malloc(sizeof(struct node));
    // and initialize it with something
}

另外,我建议您创建更多常规功能,例如add_node,就像这样

void add_node( struct node *r ) {
    if(head == NULL) {
        head = r;
    } else {
        struct node* n = head;
        while(n->next != NULL) { // go to the end of the list
        }
        r->next = NULL; // to be sure this will be end of list
        n->next = r;
    }
}

然后在readfile读取数据中,创建新节点并将其传递给add_node