链接列表的每个节点具有相同的字符串
我试图做一个链接列表,其中每个节点存储一个字符串,但我有一个问题,其中每个节点最终在每个节点中存储相同的确切字符串单节点。在main()的结尾处,我打印出存储在每个节点中的单词,它总是重复为整个列表输入的最后一个字符串。链接列表的每个节点具有相同的字符串
我没有任何线索发生了什么事情,因为如果我将它制作成一串字符,它就可以很好地工作,每个字符都存储在正确的节点中。
#include <stdio.h> #include <string.h>
#include <stdlib.h>
struct wordnode {
char *word;
struct wordnode *next;
};
struct wordnode *link = NULL;
void addword(char *aword);
int main(void) {
char *aword;
int i;
for(i = 0; i < 10; i++) {
scanf(" %s", aword);
addword(aword);
}
printf("\n");
for(; link != NULL; link = link->next) {
printf("|%s ", link->word);
}
printf("|\n");
return 0;
}
void addword(char *aword) {
struct wordnode *cur, *prev, *new_node;
new_node = malloc(sizeof(struct wordnode));
new_node->word = aword;
for(cur = link, prev = NULL; cur != NULL; prev = cur, cur = cur->next) {
;
}
new_node->next = cur;
if(prev == NULL) {
link = new_node;
} else {
prev->next = new_node;
}
}
回答:
char * aword
未被初始化和定位。它应该是:
char aword[100];
(100仅仅是一个数字,数组的大小可以与任意数量的你想要的东西取代它。)
回答:
有在代码中的许多问题。其中一些已经提到。代码将是这样的。代码结尾的解释。
#include <stdio.h> #include <string.h>
#include <stdlib.h>
#define STR2(x) #x
#define STR(X) STR2(X)
#define MAXWORD 10
#define MAXWORDLEN 20
struct wordnode {
char *word;
struct wordnode *next;
};
struct wordnode* addword(char *aword, struct wordnode *link);
void printList(struct wordnode*link);
void freeList(struct wordnode *link);
int main(void) {
char aword[MAXWORDLEN+1];
struct wordnode *link = NULL;
for(size_t i = 0; i < MAXWORD; i++) {
if(scanf("%" STR(MAXWORDLEN) "s", aword[i]) == 1){
link = addword(aword, link);
}
else{
fprintf(stderr, "%s\n","Error in input");
exit(1);
}
}
printList(link);
freeList(link);
return 0;
}
void printList(struct wordnode*link){
while(link){
printf("%s \n", link->word);
link = link->next;
}
}
void freeList(struct wordnode *link){
struct wordnode *temp;
while(link){
temp = link;
link = link->next;
free(temp);
}
}
struct wordnode* addword(char *aword, struct wordnode *link) {
struct wordnode *new_node = malloc(sizeof(struct wordnode));
if(new_node == NULL){
fprintf(stderr, "%s\n", "Error in malloc");
exit(1);
}
new_node->word = strdup(aword);
if(new_node->word == NULL){
fprintf(stderr, "%s\n", "Error in strdup");
exit(1);
}
new_node->next = NULL;
if(link == NULL){
return new_node;
}
struct wordnode *cur = link;
while(cur->next != NULL){
cur = cur -> next;
}
cur->next = new_node;
return link;
}
你想存储一些字符串(nul终止字符数组),然后你想添加它们在列表中。同样从你的示例实现中,你试图将它添加到尾部的列表中。
综上所述 -
scanf
需要一个指针到一些内存在那里可以存储输入的数据。但你的未初始化。其次,你复制字符串的方式,它只是一个浅拷贝(你指的是一些已经存在的内存)。您需要使用
strdup
或malloc - memcpy
或malloc-strcpy
来复制它。如果POSIX
strdup()
不可用,您可以使用Jonathan Leffler提到的内容。在这里您可以看到我们已经使用
freeList()
函数释放了分配的内存。 完成对分配的内存的处理后,释放内存。请勿施放返回值
malloc
。同时检查
malloc
是否成功检查它的返回值。您已将列表头用作全局变量。这里不需要。
回答:
您还没有为字符串分配内存。因此aword
将包含垃圾值,并将其传递给scanf
是未定义的行为。假设aword
有0x7fffe4e0cdf0
,并且您的scanf
将字符串存储在地址0x7fffe4e0cdf0
,并将此地址传递给addword
函数,并且您的结构成员word
也将使用相同的值进行更新。下一个scanf还将新值存储在aword
指向的同一内存中,并传递给该函数。因此,所有链接列表中的word
都指向相同的内存位置。理想的解决方案是为正在扫描的每个字符串分配内存并将其传递给“addword”函数。
以上是 链接列表的每个节点具有相同的字符串 的全部内容, 来源链接: utcz.com/qa/261395.html