链接列表附加实现在C中更新所有节点值

时间:2013-11-05 16:34:09

标签: c linked-list append c99 dynamic-memory-allocation

作为现在已过期的作业的一部分,我将从文本文件中读取搜索术语列表,并将其存储在内存中以供搜索。我决定使用链表来存储术语,我的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中的链表遵循我的逻辑,所以我无法理解这个奇怪的更新是如何发生的,更不用说一个方法了修理它。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

像这样使用strdup

rootNode->term=strdup(sterm)

 newNode->term= strdup(sterm);