0

我这里有两个结构。主链表是单词。单词列表的每个节点都有意义

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;

您覆盖了结构的 word 元素中的含义,并将其 next 设置为 NULL,因此您永远失去了之前的 tmp2->meaning。

您可以轻松地将其添加到前面的含义之上:

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

这是你的问题:

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);

现在tmp3将始终放在列表的头部,并tmp3->next指向前一个头部,或者NULL如果没有前一个头部。

编辑:查看含义的功能:

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 回答
0

你写的这个函数的参数是什么?什么是(*头)?什么是“ins”?什么是“米”?

我认为在 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 回答