作为现在已过期的作业的一部分,我将从文本文件中读取搜索术语列表,并将其存储在内存中以供搜索。我决定使用链表来存储术语,我的struct node(存储在myheader.h中)的实现如下所示:
struct Node{
char * term;
int termLength;
struct Node *next;};
要将rootNode保存为列表的头部,我有一个单独的函数来创建它,名为startList,定义如下:
struct Node * startList(char * sterm){
struct Node * rootNode;
rootNode=(struct Node *)malloc(sizeof(struct Node));
assert(rootNode != NULL);
memset(rootNode,0,sizeof(struct Node));
rootNode->term=sterm;
rootNode->termLength = strlen(sterm);
rootNode->next=NULL;
return rootNode;
}
这似乎工作正常,当我尝试在这个rootNode上添加一个新节点时出现麻烦,这应该是用这个函数完成的:
void insert_another_node( struct Node * headNode, char * sterm){
struct Node * newNode = (struct Node *) malloc(sizeof(struct Node));
newNode->term=sterm;
newNode->next=NULL;
newNode->termLength=strlen(sterm);
while (headNode->next != NULL){
headNode=headNode->next;}
headNode->next=newNode;
}
这个函数都在for循环中调用:
while ((fgets(search_wrd,41,list)) != NULL){
strtok(search_wrd, "\n");
if (count==0){
rootNode=startList(search_wrd);}
else{
insert_another_node(rootNode,search_wrd);}
count++;
}
fclose(list);
}
假设我正在尝试将行星列表存储在此列表中,最后一颗行星是海王星。 insert_another_node函数将存储在所有节点中的术语更新为最近的术语(包括rootNode)。结果是正确的节点数量,但它们都存储了#14; Neptune"在someNode-> term。
所有插入到链接列表实现的结尾我已经看到c中的链表遵循我的逻辑,所以我无法理解这个奇怪的更新是如何发生的,更不用说一个方法了修理它。任何帮助将不胜感激!
答案 0 :(得分:1)
您需要为每个sterm
分配新内存。如果您重复使用相同的内存位置,它们将具有相同的值,如果您更改了一个,您将全部更改它们(因为它们是相同的)。
答案 1 :(得分:1)
您每次只分配sterm
,所有分配都指向同一个原始缓冲区。你每次都需要复制一份。
像这样使用strdup
:
rootNode->term=strdup(sterm)
和
newNode->term= strdup(sterm);