0

作为现在过期的作业的一部分,我要从文本文件中读取搜索词列表并将它们存储在内存中以进行搜索。我决定使用链表来存储术语,我的结构节点实现(存储在 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 函数会将存储在所有节点中的术语更新为最近的术语(包括根节点)。结果是正确数量的节点,但它们都在 someNode->term 中存储“Neptune”。

我在 c 中看到的链表实现的所有插入到链表末尾的实现都遵循我的逻辑,所以我无法理解这个奇怪的更新是如何发生的,更不用说修复它的方法了。任何帮助将不胜感激!

4

2 回答 2

1

您只是sterm每次分配,所有分配都指向同一个原始缓冲区。每次都需要复制一份。

像这样使用strdup

rootNode->term=strdup(sterm)

 newNode->term= strdup(sterm);
于 2013-11-05T16:39:49.513 回答
1

您需要为每个sterm. 如果您重用相同的内存位置,它们都将具有相同的值,如果您更改一个,您将全部更改它们(因为它们是相同的)。

于 2013-11-05T16:38:33.503 回答