我已经设法从一个文件中读取数据并将它们存储到一个链表中,但问题是我失去了头脑,所以当我试图打印数据时,它会先打印最后一个,然后再打印前一个,以此类推。
文件如下:
汤姆;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设为空,当我阅读时:
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 );

您只需插入链接列表的开头。你需要在开头插入。
头只放一次。在while循环的每个迭代中,每次都要改变头。在开始时只设置一次空检查。要在链接列表的末尾插入,请使用另一个指针端,该指针端存储最后一个节点的地址。

关于c - 如何用C语言保持链接列表的开头?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28616001/

10-12 16:11