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;