对于初学者来说,似乎有一个错字
int from_file_to_list(File *fp, Data **list) {
^^^^
应该有
int from_file_to_list(FILE *fp, Data **list) {
^^^^
我有这个函数可以创建一个包含数据的链表
文本文件,它返回列表中的链接数,它可以工作
很好,
你错了。该函数具有未定义的行为。在此声明中
int from_file_to_list(File *fp, Data **list) {
Data *p;
int cnt = 0;
*list = p;
//..
您将未初始化的指针 p 分配给了指针 *list。也就是退出函数后main中的指针list会有这个不确定的值。
函数至少可以定义如下方式
#include <stdlib.h>
#include <string.h>
//...
size_t from_file_to_list( FILE *fp, Data **list )
{
size_t cnt = 0;
int date;
int temperature;
char day[11];
while ( fscanf( fp, "%d" "%s" "%d", &date, day, &temperature ) == 3 &&
( *list = malloc( sizeof( Data ) ) ) != NULL )
{
( *list )->date = date;
( *list )->temperature = temperature;
strcpy( ( *list )->day, day );
( *list )->next = NULL;
list = &( *list )->next;
++cnt;
}
return cnt;
}
或者在从文件创建新列表之前释放列表会更好
size_t from_file_to_list( FILE *fp, Data **list )
{
while ( *list )
{
Data *tmp = *list;
*list = ( *list )->next;
free( tmp );
}
size_t cnt = 0;
int date;
int temperature;
char day[11];
while ( fscanf( fp, "%d" "%s" "%d", &date, day, &temperature ) == 3 &&
( *list = malloc( sizeof( Data ) ) ) != NULL )
{
( *list )->date = date;
( *list )->temperature = temperature;
strcpy( ( *list )->day, day );
( *list )->next = NULL;
list = &( *list )->next;
++cnt;
}
return cnt;
}
如果您将编写一个单独的函数来清除列表,例如
void clear( Data **list )
{
while ( *list )
{
Data *tmp = *list;
*list = ( *list )->next;
free( tmp );
}
}
那么上面的函数可以这样写
size_t from_file_to_list( FILE *fp, Data **list )
{
clear ( list );
size_t cnt = 0;
int date;
int temperature;
char day[11];
while ( fscanf( fp, "%d" "%s" "%d", &date, day, &temperature ) == 3 &&
( *list = malloc( sizeof( Data ) ) ) != NULL )
{
( *list )->date = date;
( *list )->temperature = temperature;
strcpy( ( *list )->day, day );
( *list )->next = NULL;
list = &( *list )->next;
++cnt;
}
return cnt;
}