Как сохранить заголовок связанного списка на языке 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);
}
}