从文件创建链表并重置头部

Creating linkedlist from file and resetting the head

对于一项作业,我正在创建一个程序,其中读取文本文件并用于创建链表。添加所有元素后,我在将列表的头部重置回其原始点时遇到问题。我已经尝试将 head 指针分配给某个临时指针并在最后重新分配它,但这只会导致 head 仅指向第一个元素并且 ->next 为空。

我的代码:

int Counter = 0;

FILE * fileReader;

Food * newElement = malloc(sizeof(Food));
Food * ListHead;
Food * originalPointer;

char * fileOutput=malloc(sizeof(char)*1000);
char * Token;

char * name=malloc(sizeof(char)*1000);

char * foodGroup=malloc(sizeof(char)*1000);
double calories=0;
char type;

fileReader = fopen(filename,"r");

 do
 {
     if (Counter == 1)
     {
        originalPointer = ListHead;
     }  

    Counter = Counter + 1;

    fgets(fileOutput,200,fileReader);

    Token = strtok(fileOutput,",");
    strcpy(name,Token);

    Token = strtok(NULL,",");
    strcpy(foodGroup,Token);

    Token = strtok(NULL,",");
    calories = atof(Token);

    Token = strtok(NULL,",");

    type = *Token;      

    newElement = createRecord(name,foodGroup,calories,type);

    newElement->next = ListHead;    
    ListHead = newElement;


}while (fgets(fileOutput,200,fileReader)!=NULL);    

return ListHead;

如果我对你的问题的理解正确,你可以使用 rewind() 在文件被读取后将其重置为原始点。

所以我认为您对链表通常的工作方式有点困惑。通常,链表的头 属性 指向添加的第一个条目,然后永远不会改变。您可能还有一个尾巴 属性 指向最后添加的条目,以便更快地添加新条目。在你上面的代码中,你所说的头部实际上就像一条尾巴。所以当然,你失去了链表的头。

我会将您的代码稍微更改为:

int Counter = 0;

FILE * fileReader;

Food * newElement = malloc(sizeof(Food));
Food * ListHead = NULL;
Food * ListTail = NULL;

char * fileOutput=malloc(sizeof(char)*1000);
char * Token;

char * name=malloc(sizeof(char)*1000);

char * foodGroup=malloc(sizeof(char)*1000);
double calories=0;
char type;

fileReader = fopen(filename,"r");

do
{
    Counter = Counter + 1;

    fgets(fileOutput,200,fileReader);

    Token = strtok(fileOutput,",");
    strcpy(name,Token);

    Token = strtok(NULL,",");
    strcpy(foodGroup,Token);

    Token = strtok(NULL,",");
    calories = atof(Token);

    Token = strtok(NULL,",");

    type = *Token;      
    newElement = createRecord(name,foodGroup,calories,type);

    if (ListHead == NULL) { ListHead = newElement; }
    newElement->next = NULL;
    if (ListTail != NULL) { ListTail->next = newElement; }
    ListTail = newElement;

}while (fgets(fileOutput,200,fileReader)!=NULL);    
return ListHead;

这为您提供了列表头和尾。 ListHead 只为第一个 newElement 设置一次,并且仍然是您的列表头。 ListTail 为第一个 newElement 获取它的第一组,并随着新元素的添加逐渐移动 "down the list"。