C 编辑链接列表中的节点第2部分

C 编辑链接列表中的节点第2部分,c,linked-list,C,Linked List,与我以前的职位相关。在编辑节点时,我已完成以下步骤: 编辑目标节点数据 删除目标节点 重新插入目标节点 问题是,我无法在节点顶部重新插入它,如下所示 std1 90 -> std 2 50 -> std3 20 -> NULL 我把std3编辑成100。结果是这样的 std2 50 -> std3 20 -> NULL 简而言之,我无法将其放回顶部节点。重新插入顶部节点以外的任何位置都可以正常工作。如果头部节点为97%,而通过的节点为97%,则会出现问题。

与我以前的职位相关。在编辑节点时,我已完成以下步骤:

  • 编辑目标节点数据
  • 删除目标节点
  • 重新插入目标节点
  • 问题是,我无法在节点顶部重新插入它,如下所示

    std1 90 -> std 2 50 -> std3 20 -> NULL
    
    我把std3编辑成100。结果是这样的

       std2 50 -> std3 20 -> NULL
    

    简而言之,我无法将其放回顶部节点。重新插入顶部节点以外的任何位置都可以正常工作。

    如果头部节点为97%,而通过的节点为97%,则会出现问题。你需要说

    while (curr_std != NULL && to_add->grade <= curr_std->grade){
    
    将评估为真,并且

    prev = cur;
    
    将永远不会被调用,使
    prev
    =null。那么当你到达

    prev->next = cur->next;
    
    您有一个空引用。您需要显式测试添加到head节点;这是它自己的特例

    scanf("%d", &(cur->grade));
    if (prev == null) {  // you matched the head
        head = cur->next;
    }
    else {
        prev->next = cur->next;
    }
    

    编辑
    在代码中,添加到头部时,尚未将头部设置为指向新节点。您将返回旧头,它现在指向列表中的第二个节点。尝试:

    while (curr_std != NULL && to_add->grade < curr_std->grade){
        prev_std = curr_std;
        curr_std = curr_std->next;
    }
    
    //  if you're adding to the head, you didn't go into the above loop
    //  curr_std is still pointing to head in this case
    if (curr_std == head) {
        head = to_add
    }
    else {
        prev_std->next = to_add;
    }
    
    to_add->next = curr_std;
    return head;
    
    while(curr\u std!=NULL&&to\u add->gradegrade){
    前标准=当前标准;
    当前标准=当前标准->下一步;
    }
    //如果你要添加到头部,你没有进入上面的循环
    //在这种情况下,curr_std仍然指向头部
    如果(当前标准==水头){
    头=要添加
    }
    否则{
    上一步标准->下一步=添加;
    }
    添加->下一步=当前标准;
    回流头;
    
    什么不起作用?插入错误的位置,未插入,其他条目丢失,分段错误,…?如果插入的学生与其他学生成绩相同,则会中断。insert\U student中的while循环未执行,因此对prev\U std->next的赋值将失败,因为prev\U std仍然为空。insert_student中的一个条件需要包括“=”以及小于或大于。我认为如果正在编辑“head”节点本身,也会出现问题:节点删除会破坏列表,因为“head”没有更新为指向cur->next。在调用insert_student()之前,在这里执行
    prev->next=cur->next-您需要检查cur==head
    是否正确,如果正确,则更新head。一般来说,如果你给出一个具体的场景,会很有帮助:现有的列表内容,你如何编辑哪个学生,然后列表包含什么。@Lars谢谢。我忽略了它。谢谢你名单上的名字/等级是什么?你要换哪个等级?你要把它改成什么样的价值?看到上面的编辑,我又发现了一个问题。@James B。。我的问题是我无法在上面的示例中在顶部节点上重新插入它。。。节点的其余部分工作正常。。除了顶部节点。谢谢你是的,这是第三个问题,我没听清楚。更新了我的答案。我看到的前两个问题仍然适用。很好!我想现在的问题是:人们如何发现这种问题好问题!我想部分是因为经验。。。你做这些练习是为了学习“头部节点总是一个特例”。除此之外,跟踪代码中的问题的最佳方法是提供数据集、所有可能的组合(添加到头部、添加到尾部、添加到中间、编辑/删除头部等),并询问自己“我的代码在每一步都在做什么?”。当我遇到一个失败的条件时,我会打印出我的代码,并为边距中的每一步写入每个变量的值。像这样的问题是一个很好的批判性思维练习!
    while (curr_std != NULL && to_add->grade < curr_std->grade){
        prev_std = curr_std;
        curr_std = curr_std->next;
    }
    
    //  if you're adding to the head, you didn't go into the above loop
    //  curr_std is still pointing to head in this case
    if (curr_std == head) {
        head = to_add
    }
    else {
        prev_std->next = to_add;
    }
    
    to_add->next = curr_std;
    return head;