Как сохранить заголовок связанного списка на языке c?

Мне удалось прочитать данные из файла и сохранить их в связанном списке, но проблема в том, что я потерял голову, поэтому, когда бы я ни пытался напечатать данные, он печатает последнюю, затем предыдущую и так далее.

файл примерно такой:

Том 14;

Sara;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;

когда я использую головку в функции печати, она начинает печатать с последнего элемента, поэтому я предполагаю, что головка не указала на первый элемент, когда я закончил читать данные. Мое решение было использовать другой указатель, поэтому я использовал head2, как это:

я положил head2 = NULL, и при чтении я сделал это:

if(head2==NULL) head2=n;

но опять же, я столкнулся с другой проблемой, потому что, когда я использую head2 в функции печати, он печатает только первый элемент:

Том 14;

Любая помощь по этой проблеме, пожалуйста?

2 ответа

Решение
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. Поставьте нулевую проверку, чтобы установить его только один раз при запуске. Для вставки в конец списка ссылок возьмите другой конец указателя, в котором хранится адрес последнего узла.

Вы могли бы сделать это

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

}
Другие вопросы по тегам