【问题标题】:Reading in and displaying a linked lists via a text file通过文本文件读入和显示链表
【发布时间】:2015-02-08 23:05:41
【问题描述】:

我正在尝试读取链接列表中的文本文件并成功显示它。但是我不断收到对应于 (head==NULL) 的“List is Empty”消息,而我可以通过使用 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");
}

【问题讨论】:

    标签: c pointers linked-list fopen


    【解决方案1】:

    在您提供的代码中,您永远不会向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

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多