C 替换链接列表中的节点值

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(

我有一个链表和一个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->值不能更改?在这个函数之后,输出是奇怪的。我不明白发生了什么。

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



如果将根节点设置为函数的返回值,
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,并将函数中的最后一个return语句更改为
      returns。目前,您正在返回NULL。第二个我不明白。
      s->next!=NULL
      应为
      s!=空
      。此时,您的循环将遍历除最后一个节点外的每个节点。@moses:设置s->value后,
      break,并将函数中的最后一个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) {
          ...
      }