从文件创建链表并重置头部
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"。
对于一项作业,我正在创建一个程序,其中读取文本文件并用于创建链表。添加所有元素后,我在将列表的头部重置回其原始点时遇到问题。我已经尝试将 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"。