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 関数は、すべてのノードに格納されている用語を最新の用語 (rootNode を含む) に更新します。結果は適切な数のノードになりますが、それらはすべて「Neptune」を someNode->term に格納します。

c の連結リストで見た連結リストの実装の最後への挿入はすべて私のロジックに従っているため、この奇妙な更新がどのように行われているか理解できず、それを修正する方法は言うまでもありません。どんな助けでも大歓迎です!

4

2 に答える 2

1

それぞれに新しいメモリを割り当てる必要がありますsterm。同じメモリ位置を再利用すると、それらはすべて同じ値になり、1 つを変更するとすべてが変更されます (それらは同じであるため)。

于 2013-11-05T16:38:33.503 に答える
1

sterm毎回割り当てているだけで、すべての割り当ては同じ元のバッファを指しています。毎回コピーが必要です。

strdup次のように使用します。

rootNode->term=strdup(sterm)

 newNode->term= strdup(sterm);
于 2013-11-05T16:39:49.513 に答える