如何用c语言保持链表的头部?

时间:2015-02-19 20:12:28

标签: c list linked-list

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

文件是这样的:

汤姆; 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

对此问题有任何帮助吗?

2 个答案:

答案 0 :(得分: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循环时,您都会每次都改变头脑。放置一个空检查以在启动时仅设置一次。要在链接列表的末尾插入,请使用另一个指针结束存储最后一个节点的地址。

答案 1 :(得分:0)

你可以这样做

#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);
  }

}