c语言如何保持链表的头部?
how to keep the head of a linked list in c language?
我已经设法从文件中读取数据并将它们存储到链表中,但问题是我失去了理智,所以每当我尝试打印数据时,它都会打印最后一个,然后再打印前一个等等。
文件是这样的:
汤姆;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
对这个问题有什么帮助吗?
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 );
您只是在 link 列表的开头插入。您需要在开头插入。
只设置一次头部。对于 while 循环的每次迭代,您每次都在换头。放置一个空检查以在开始时仅设置一次。为了插入到 link 列表的末尾,取另一个指针 end 存储最后一个节点的地址。
你可以这样做
#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);
}
}
我已经设法从文件中读取数据并将它们存储到链表中,但问题是我失去了理智,所以每当我尝试打印数据时,它都会打印最后一个,然后再打印前一个等等。
文件是这样的:
汤姆;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
对这个问题有什么帮助吗?
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 );
您只是在 link 列表的开头插入。您需要在开头插入。 只设置一次头部。对于 while 循环的每次迭代,您每次都在换头。放置一个空检查以在开始时仅设置一次。为了插入到 link 列表的末尾,取另一个指针 end 存储最后一个节点的地址。
你可以这样做
#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);
}
}