C 替换链接列表中的节点值
我有一个链表和一个setter函数C 替换链接列表中的节点值,c,linked-list,setter,C,Linked List,Setter,我有一个链表和一个setter函数 struct my_struct { int value; int type; char *name; struct my_struct *next; }; struct my_struct *setValue(struct my_struct *s, char *name, int b) { if(s!=NULL) { while(s != NULL) { if(
struct my_struct {
int value;
int type;
char *name;
struct my_struct *next;
};
struct my_struct *setValue(struct my_struct *s, char *name, int b) {
if(s!=NULL) {
while(s != NULL) {
if( strcmp(s->name,name) == 0) {
s->value = b;
}
s=s->next;
}
return s;
}
return NULL;
}
这里,name是搜索关键字,b是s->value的新值。为什么s->值不能更改?在这个函数之后,输出是奇怪的。我不明白发生了什么。您需要测试字符串的相等性,如下所示。在代码中,您正在测试两个指针是否相等
如果将根节点设置为函数的返回值,
s
在循环链接列表后将始终为NULL
,因此函数将始终返回NULL,您需要测试字符串是否相等,如下所示。在代码中,您正在测试两个指针是否相等
如果将根节点设置为函数的返回值,s
在链接列表中循环后将始终为NULL
,因此函数将始终返回NULL
- 像Tim解释的字符串比较
- 比较while循环中的下一个状态,然后处理当前状态。也就是说,您不能更改列表中最后一个条目的值,因为您在设置新值之前中止了while循环
- 像Tim解释的字符串比较
- 比较while循环中的下一个状态,然后处理当前状态。也就是说,您不能更改列表中最后一个条目的值,因为您在设置新值之前中止了while循环
您已经获得了有关循环的帮助,因此我将尝试剩下的内容
您确定s->name和name都已正确分配内存吗?并且两者的长度相同,并且正确地以null结尾。
strcmp()
如果你有有趣的结果,可能是某个地方有内存泄漏。请尝试使用最大字符数进行比较,看看发生了什么。您已经获得了有关循环的帮助,因此我将尝试剩余的内容
您确定s->name和name都已正确分配内存吗?并且两者的长度相同,并且正确地以null结尾。strcmp()
如果你有有趣的结果,可能是某个地方有内存泄漏。尝试使用最大字符数进行比较,看看会发生什么。我不理解第二个。s->next!=NULL
应为s!=空
。此时,您的循环将遍历除最后一个节点外的每个节点。@moses:设置s->value后,break从循环中选择code>,并将函数中的最后一个return语句更改为returns代码>。目前,您正在返回NULL。第二个我不明白。s->next!=NULL
应为s!=空
。此时,您的循环将遍历除最后一个节点外的每个节点。@moses:设置s->value后,break从循环中选择code>,并将函数中的最后一个return语句更改为returns代码>。现在,你返回空值。我根据你关于strcmp的回答编辑了这个问题。但问题是,s->value仍然不能更改。我在列表中添加了四个名为p的节点。然后我调用setValue(struct my_struct*p,“name_here”,new_value)。我再次显示列表。但最近刚刚添加的是在列表中。名单的长度是1。让我们根据你对strcmp的回答来编辑这个问题。但问题是,s->value仍然不能更改。我在列表中添加了四个名为p的节点。然后我调用setValue(struct my_struct*p,“name_here”,new_value)。我再次显示列表。但最近刚刚添加的是在列表中。列表的长度是1。让我们看看为什么这个函数返回一个总是空的指针?它应该返回什么?为什么这个函数返回一个总是空的指针?它应该返回什么?
#include <string.h>
if(strcmp(s->name, name) == 0) { // if both strings are equal
s->value = b;
}
while(s != NULL) {
...
}