【问题标题】:how to keep the head of a linked list in c language?c语言如何保持链表的头部?
【发布时间】:2023-03-27 06:18:02
【问题描述】:

我已经设法从一个文件中读取数据并将它们存储到一个链表中,但问题是我失去了头,所以当我尝试打印数据时,它会打印最后一个,然后是前一个,等等开。

文件是这样的:

汤姆;14

萨拉;19

这是我用来读取数据的代码:

   if ( f != NULL ) {
    while ( fgets( buffer, sizeof( buffer ), f ) != NULL ) {
        person*n= (person*) malloc( sizeof( process ) );

        name = strtok( buffer, ";\n\r\t" );
        strcpy( n->NAME, name);

        age= strtok( NULL, ";\n\r\t" );
        n->AGE= atoi(age);
        n->next= head;
        head = n;
    }

    fclose( f );

输出是这样的:

萨拉; 19

汤姆;14

当我在打印函数中使用 head 时,它会从最后一个元素开始打印,所以我的猜测是当我完成读取数据时 head 并没有指向第一个元素。我的解决方案是使用另一个指针,所以我像这样使用 head2:

我把 head2 = NULL,当阅读时我这样做了:

if(head2==NULL) head2=n;

但我又遇到了另一个问题,因为当我在打印函数中使用 head2 时,它只打印第一个元素:

汤姆;14

请帮忙解决这个问题?

【问题讨论】:

  • malloc 返回的演员表中似乎缺少一个括号;是这样吗?
  • 这不是您“丢失了头指针”的问题。问题是您要插入到列表的前面,所以当您从前面读取它时,您会以相反的顺序访问元素。您可以尝试插入到后面(O(n) 天真地为每个元素,或者 O(1) 通过在每次插入后保存尾指针有点诡计)。或者,您可以尝试编写一个递归遍历函数,从后到前打印元素(类似于if (node == 0) return; recursive_print(node->next); printf(/* whatever */, node->data);。)
  • @TheParamagneticCroissant 我确实做了反向打印功能,但我需要打印头来实现其他功能
  • @alex 为什么是“但是”?说反向打印功能不需要改变,燃烧或神奇地隐藏你的头指针......
  • 这只有在head 是一个全局变量时才有效。如果head 作为函数参数传递(您没有发布足够的代码供我们查看),或者在函数中声明,那么head 的新值将在函数返回时丢失。

标签: c list linked-list


【解决方案1】:
if ( f != NULL ) {
while ( fgets( buffer, sizeof( buffer ), f ) != NULL ) {
    person*n= (person*) malloc( sizeof( process ) );

    name = strtok( buffer, ";\n\r\t" );
    strcpy( n->NAME, name);

    age= strtok( NULL, ";\n\r\t" );
    n->AGE= atoi(age);
    n->next= NULL;
    //note from here
    if(end!=NULL)
        end->next=n;
    end=n;
    if(head==NULL)  
        head = n;
}

fclose( f );

您只是在链接列表的开头插入。您需要在开头插入。 只设置一次头部。对于 while 循环的每次迭代,您每次都在换头。放置一个空检查以在启动时仅设置一次。为了在链表的末尾插入另一个指针 end 存储最后一个节点的地址。

【讨论】:

    【解决方案2】:

    你可以这样做

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    
    typedef struct yourstruct * PtrToStruct;
    
    struct yourstruct
    {
      char NAME[512];
      int Age;
      PtrToStruct Next;
    };
    
    void Insert(PtrToStruct);
    void ReadFromFile(PtrToStruct);
    
    
    int  main ()
    {
      struct yourstruct  head;  // using the dummy element 
      head.Next = NULL;
    
      ReadFromFile(&head);      //sending address of dummy element
    
    
     return 0;
    }
    
    void ReadFromFile(PtrToStruct P)
    {
    
     FILE *dat;
     char name[512];
     PtrToStruct temp;
     char buffer[512];
    
     printf("\nEnter the name of file");
     scanf(" %s", name);
    
     dat = fopen(name, "r");
    
     if (NULL == dat)
        printf("\n Does not exist");
     else
     {
        while(fgets( buffer, sizeof( buffer ), dat ) != NULL )
        {
            temp = (PtrToStruct)malloc(sizeof(struct yourstruct));
    
            name = strtok( buffer, ";\n\r\t" );
            strcpy( temp->NAME, name);
    
            age= strtok( NULL, ";\n\r\t" );
            temp->Age= atoi(age);
    
            temp->Next = P->Next;
            P->Next= temp;
            P = temp;
        }
    
        fclose(dat);
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2014-05-07
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多