对于作业,我创建了一个程序,其中读取文本文件并用于创建链接列表。在添加完所有元素后,我有问题将列表头部重置回原点。我已经尝试将头指针分配给某个临时指针并在末尾重新分配它,但这只会导致头只指向第一个元素而 - > next是null。
我的代码:
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;
答案 0 :(得分:1)
如果我正确理解了您的问题,您可以使用rewind()将文件重置为原始点。
答案 1 :(得分:1)
所以我认为你对链表通常如何工作有点困惑。通常,链表有一个head属性,指向添加的第一个条目,然后永远不会更改。您可能还有一个tail属性,指向添加的最后一个条目,以便更快地添加新条目。在上面的代码中,你所谓的头部实际上就像一个尾巴。当然,你正在失去链表的头部。
我会将您的代码稍微更改为:
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的第一个集合,并逐步向下移动#34;随着newElements的添加。