gpt4 book ai didi

c - 读取文件 c 的链表问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:59:04 25 4
gpt4 key购买 nike

我尝试从一个文件设计一个链表,但是在设置链表的“第一个节点”时出现了一些问题。链表的数据结构如下图所示: Data structure of linled list

在我的代码中,我放置了两种类型的结构,一种用于名称,另一种用于分数,如下所示:

typedef struct nodeScore{

int score;
struct nodeScore* nextScore;

}nodeScore;

typedef struct nodeName{

char* firstName;
char* lastName;

nodeScore* nextScore;
struct nodeName* nextName;

}nodeName;

还有一个函数可以从文件中逐行读取分数,(每行包含'First name','Last name'和最多4个'scores'),并返回链表的头部:

nodeName* storeFile(const char* fileName, nodeName* nodeN){

FILE *pFile = fopen(fileName, "r");

char input[512];

char* firstName;
char* lastName;
int score;

int line=0;

nodeName* prevName;
nodeScore* prevScore;

while(fgets(input, 512, pFile)){

printf("Line %d now.\n", ++line);

nodeName* ptrN = (nodeName*)malloc(sizeof(nodeName));//allocate for new node name.

firstName = strtok(input, " ");//first space for first name.
ptrN->firstName = firstName;

lastName = strtok(NULL, " ");//second space for last name.
ptrN->lastName = lastName;

if(line == 1){
prevName = ptrN;
nodeN = ptrN;//allocate nodeN the return value to the first line, first node of the linked list.

}else{
prevName->nextName = ptrN;
prevName = ptrN;

}


ptrN->nextName = NULL;
ptrN->nextScore = NULL;

while(score = atoi(strtok(NULL, " \n"))){//store multiple scores until next char is space or next new line.

if(ptrN->nextScore == NULL){//if no link to another score.
nodeScore* ptrS = (nodeScore*)malloc(sizeof(nodeScore));//allocate for new score node.

ptrN->nextScore = ptrS;
ptrS->score = score;
ptrS->nextScore = NULL;
prevScore = ptrS;//record latest 'tail' of linked list.


}else{
nodeScore* ptrS = (nodeScore*)malloc(sizeof(nodeScore));

prevScore->nextScore = ptrS;
ptrS->score = score;
ptrS->nextScore = NULL;
prevScore = ptrS;//record latest 'tail' or linked list.

}


}//done the loop for storing multi-scores.

}//done the loop for reading lines from file.

return nodeN;
}

最后是主要功能:

int main(){
char file1[]={"HW5_26.txt"};
nodeName* n1;

printf("\nStart reading file '%s' and store it into linked-list.\n\n", file1);

n1 = storeFile(file1, n1);

printf("%s", n1->firstName);//try to see who's the first person(1st node, should be Albert Einstein), here is when I'm confused.

return 0;
}

在我的返回值的最后,我总是得到'Sarah'最后一个节点的结果,但是,我已经设置了一个'if filter'来使返回值只从第一个节点开始一行数据,我不知道是哪里出了问题,如果有人能给我一些建议或想法,我将不胜感激,谢谢。

txt文件是这样的:

Albert Einstein 52 67 63 
Steve Abrew 90 86 90 93
David Nagasake 100 85 93 89
Mike Black 81 87 81 85
Andrew Dijkstra 90 82 95 87
Joanne Nguyen 84 80 95 91
Chris Walljasper 86 100 96 89
Fred Albert 70 68
Dennis Dudley 74 79 77 81
Leo Rice 95
Fred Flinstone 73 81 78 74
Frances Dupre 82 76 79
Dave Light 89 76 91 83
Hua Tran 91 81 87 94
Sarah Trapp 83 98 94 93

还有我的标题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

最佳答案

问题是你如何使用strtok和返回的指针:

firstName = strtok(input, " ");//first space for first name.
ptrN->firstName = firstName;

指针firstName 将是指向数组input 的指针。数组 input 在整个循环中是相同的,这意味着所有名称的所有指针都将指向同一个数组。 的意思是,一旦 storeFile 函数返回,这些指针就会失效,因为数组将不再存在,使用这些指针将导致 未定义的行为

有两种可能的解决方案:一种是使用例如strdup 复制字符串。另一种是在名称结构中使用数组,并复制字符串。

请注意,strdup 不是标准的 C 函数,但几乎所有系统都有它。另请注意,它将使用 malloc 动态分配内存,因此您需要在释放节点之前释放字符串。

关于c - 读取文件 c 的链表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40716679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com