我这里有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;
答案 0 :(得分:2)
当你这样做时
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;
}
}
答案 1 :(得分:1)
这是你的问题:
tmp2->meaning=tmp3;
strcpy(tmp3->meaning,mea);
tmp3->next=NULL;
第一行只是覆盖现有指针,并在最后一行将next
指针设置为NULL
。
相反,您需要将新意义链接到列表中。这是通过在创建tmp2->meaning
指针时将NULL
设置为word
来完成的,并使用类似
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);
}
答案 2 :(得分:1)
您正在撰写此功能的参数是什么? 什么是(*头)?什么是“ins”?什么是“mea”“?
我认为在没有释放内存的情况下检查并返回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));