【发布时间】:2023-03-27 06:18:02
【问题描述】:
我已经设法从一个文件中读取数据并将它们存储到一个链表中,但问题是我失去了头,所以当我尝试打印数据时,它会打印最后一个,然后是前一个,等等开。
文件是这样的:
汤姆;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
请帮忙解决这个问题?
【问题讨论】:
-
malloc返回的演员表中似乎缺少一个括号;是这样吗? -
这不是您“丢失了头指针”的问题。问题是您要插入到列表的前面,所以当您从前面读取它时,您会以相反的顺序访问元素。您可以尝试插入到后面(
O(n)天真地为每个元素,或者O(1)通过在每次插入后保存尾指针有点诡计)。或者,您可以尝试编写一个递归遍历函数,从后到前打印元素(类似于if (node == 0) return; recursive_print(node->next); printf(/* whatever */, node->data);。) -
@TheParamagneticCroissant 我确实做了反向打印功能,但我需要打印头来实现其他功能
-
@alex 为什么是“但是”?说反向打印功能不需要改变,燃烧或神奇地隐藏你的头指针......
-
这只有在
head是一个全局变量时才有效。如果head作为函数参数传递(您没有发布足够的代码供我们查看),或者在函数中声明,那么head的新值将在函数返回时丢失。
标签: c list linked-list