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

时间:2015-04-01 21:01:16

标签: c file-io data-structures linked-list

对于作业,我创建了一个程序,其中读取文本文件并用于创建链接列表。在添加完所有元素后,我有问题将列表头部重置回原点。我已经尝试将头指针分配给某个临时指针并在末尾重新分配它,但这只会导致头只指向第一个元素而 - > 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;

2 个答案:

答案 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的添加。