替换链接列表中的节点值

时间:2011-11-23 23:16:40

标签: 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( strcmp(s->name,name) == 0) {
                s->value = b;
            }
            s=s->next;
        }
        return s;
    }
    return NULL;
}

此处,name是搜索关键字,b是s-> value的新值。为什么s->值不能改变?在那个函数之后,输出很奇怪。我无法理解,发生了什么。

3 个答案:

答案 0 :(得分:2)

您需要使用strcmp测试字符串的相等性,如下所示。在您的代码中,您正在测试两个指针是否相等 [related post]

#include <string.h>

if(strcmp(s->name, name) == 0) { // if both strings are equal
    s->value = b;
}

您的退货声明的位置很有趣。您将返回已更改的最后一个项目的地址,这可能是不受欢迎的。

根据@Matthew Iselin的评论,将您的循环更改为以下内容:

while(s != NULL) {
    ...
}

如果您将根节点设置为函数的返回值,则在循环链接列表后s将始终为NULL,因此该函数将始终返回NULL

答案 1 :(得分:1)

  • 像Tim解释的字符串比较
  • 您比较while循环中的下一个状态,然后处理当前状态。即您无法更改列表中最后一个条目的值,因为您在设置新值之前中止while循环。

答案 2 :(得分:0)

你已经获得了关于循环的帮助,所以我会尝试留下什么。

您确定s-&gt;名称和名称都已正确分配内存吗?并且两者都是相同的长度并且正确地终止。 strcmp()函数表示所有这些都是真的,可以给出equal响应,并为任何响应分配内存和空终止。

如果你的结果很有趣,可能会有某些内存泄漏。尝试使用最大字符数的strncmp进行比较,看看会发生什么。