【问题标题】:Editing a node in a Linked list Part2编辑链表中的节点第 2 部分
【发布时间】:2010-12-09 17:09:55
【问题描述】:

与我之前的帖子Editing a node in a Linked list 相关。我在编辑节点时完成了以下步骤:

  1. 编辑目标节点数据
  2. 移除目标节点
  3. 重新插入目标节点

问题是我无法将它重新插入到节点的顶部,如下所示....

std1 90 -> std 2 50 -> std3 20 -> NULL

我把std3编辑成100,结果会是这样的

   std2 50 -> std3 20 -> NULL

简而言之,我不能把它放回顶部节点。重新插入除顶部节点以外的任何地方都可以正常工作。

【问题讨论】:

  • 什么不起作用?插入错误的地方,没有插入,其他条目丢失,分段错误,...?
  • 如果您要插入一个与另一个成绩相同的学生,则中断。您在 insert_student 中的 while 循环不会执行,因此对 prev_std->next 的分配将失败,因为 prev_std 仍然为 NULL。 insert_student 中的条件之一需要包含“=”以及小于或大于
  • 我认为如果 'head' 节点本身正在被编辑也会存在问题:节点删除会破坏列表,因为 'head' 没有更新为指向 cur->next 。
  • 在调用 insert_student() 之前,您执行prev->next = cur->next; ... - 您需要检查是否cur == head 并更新 head 如果这是真的。一般来说,如果你给出一个具体的场景会很有帮助:现有的列表内容,你如何编辑哪个学生,然后列表包含什么。
  • @Lars 谢谢。我忽略了它。谢谢

标签: c linked-list


【解决方案1】:

如果头节点为 97%,而您传递的节点为 97%,则会出现问题。你需要说

while (curr_std != NULL && to_add->grade <= curr_std->grade){

如果您正在编辑的学生是第一个节点,您也会遇到问题,因为:

while((cur != NULL) && (strcmp(cur->name,temp) != 0)){

将评估为真,并且

prev = cur;

永远不会被调用,留下prev = null。然后当你到达

prev->next = cur->next;

你有一个空引用。您需要显式测试添加到头节点;这是它自己的特殊情况。

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;

【讨论】:

  • 列表中的姓名/等级是什么,你要改什么等级?您将其更改为什么值?请参阅上面的编辑,我发现了另一个问题。
  • @James B.. 我的问题是我无法将它重新插入到顶部节点上,如上例所示......节点的其余部分工作正常......除了顶部节点。谢谢
  • 是的,这是我没有发现的第三个问题。更新了我的答案。我看到的前两个问题仍然适用。
  • 好收获!我认为现在的问题变成了:如何找到这种问题? :)
  • 好问题!我认为部分是经验......你做这些练习是为了学习“头节点总是一个特例”之类的东西。除此之外,追踪代码中问题的最佳方法是提供数据集,所有可能的组合(添加到头部,添加到尾部,添加到中间,编辑/删除头部等) ) 并问自己“我的代码在每一步都在做什么?”。当我遇到一个失败的条件时,我会打印出我的代码,并为页边距的每一步写入每个变量的值。像这样的问题是批判性思维的一个很好的练习!
猜你喜欢
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多