0

ここには2つの構造があります。メインのリンクリストは単語です。単語リストの各ノードには意味があります

typedef struct node{
  char word[20];
  struct node2 *meaning;
  struct node *next;
}word;

typedef struct node2{
  char meaning[100];
  struct node2 *next;
}means;

私の問題は、複数の意味を追加できないことです。意味を 1 つだけ追加できますが、追加しようとすると、前の意味が上書きされてしまいます。どうすればよいですか? これが私が意味を追加する方法です

word *tmp2=(*head);
means *tmp3;
tmp3=(means *)malloc(sizeof(means));
if(tmp2==NULL){
  printf("\n**List still empty, add a word**\n");
  return;
}
do{
  if(strcmp(tmp2->word,ins)==0){
    tmp2->meaning=tmp3;
    strcpy(tmp3->meaning,mea);
    tmp3->next=NULL;
    printf("\n**You have successfully added a meaning**\n");
    return;
  }
  tmp2=tmp2->next;
}while(tmp2!=NULL);
printf("\n**Word is not on the list, cannot add meaning**\n");
return;
4

3 に答える 3

1

あなたがするとき

tmp2->meaning=tmp3;
strcpy(tmp3->meaning,mea);
tmp3->next=NULL;

構造体の単語要素の意味を上書きし、その次を NULL に設定すると、以前の tmp2-> 意味が永久に失われます。

以前の意味の上に簡単に追加できます。

tmp3->next = tmp2->meaning;
strcpy(tmp3->meaning, mea);
tmp2->meaning = tmp3;

意味を表示したい場合:

void display_meanings_of(word *w)
{
  means *m;

  m = w->meaning;
  if (m)
    printf("Meanings of the word %s:\n", w->word);
  else
    printf("The word %s has no meaning.\n", w->word);
  while (m)
  {
    printf(" - %s\n", m->meaning);
    m = m->next;
  }
}
于 2012-10-15T07:39:24.497 に答える
0

あなたが書いているこの関数のパラメータは何ですか? (*頭)とは?「イン」とは何ですか?「めあ」とは?

メモリを解放せずに malloc の後にチェックして戻るのは良い考えではないと思います。空のリストに意味を追加し続けると、最終的にヒープがメモリ不足になります。

word *tmp2=(*head);
means *tmp3;
tmp3=(means *)malloc(sizeof(means));
if(tmp2==NULL){
  printf("\n**List still empty, add a word**\n");
  return;
}

提案:

word *tmp2=(*head);
means *tmp3;
if(tmp2==NULL){
  printf("\n**List still empty, add a word**\n");
  return;
}
// if tmp2 is not null then we malloc
tmp3=(means *)malloc(sizeof(means));
于 2012-10-15T09:03:50.630 に答える
0

これがあなたの問題です:

tmp2->meaning=tmp3;
strcpy(tmp3->meaning,mea);
tmp3->next=NULL;

最初の行は既存のポインターを上書きするだけで、最後の行でnextポインターをに設定します。NULL

代わりに、新しい意味をリストにリンクする必要があります。これは、ポインターを作成するときに に設定tmp2->meaningすることによって行われ、次のようなものを使用しますNULLword

tmp3->next = tmp2->meaning;
tmp2->meaning = tmp3;

strcpy(tmp3->meaning, mea);

Nowtmp3は常にリストの先頭に置かれ、前の head をtmp3->next指すようにするか、前の headNULLがなかった場合。

編集:意味を表示する機能:

void show_meanings(word *w)
{
    int i;
    means *m;
    for (m = w->meaning, i = 1; m != NULL; m = m->next, i++)
        printf("Meaning %d: %s\n", i, m->meaning);
}
于 2012-10-15T07:39:55.707 に答える