【发布时间】:2019-09-08 09:18:09
【问题描述】:
我是一名 C 编程的学生,我现在只是学习基础知识。我需要编写一个函数,在输入中给出一个链表,将包含 5 和 3 的倍数的节点放在列表的末尾。我正在尝试一种递归方法,但程序崩溃了。 练习指南说我不能删除节点然后在列表末尾重新创建它们。我必须修改指针。
编辑:调试器说这是一个分段错误问题。
这里有调试错误的图像,输入中给出了这个列表 (15 -> 7 -> 2 -> 1 -> 30 -> 25 -> 10): segfaultdebug
//typenode is a type I defined for linked list nodes
typenode *mul5e3coda(typenode *head){
typenode *temp2=head;
if((head->val%3==0)&&(head->val%5==0)&&head!=NULL){
while(temp2->next!=NULL){
temp2=temp2->next;
}
temp2->next=head;
head=head->next;
temp2->next->next=NULL;
head->next=mul5e3coda(head->next);
}
else{
while(((head->val%3!=0)||(head->val%5!=0))&&head!=NULL){
head=head->next;}
if((head->val%3==0)&&(head->val%5==0)&&head!=NULL){
head=mul5e3coda(head);
}
}
return head;
}
【问题讨论】:
-
您能否提供一个minimal reproducible example 来方便地提供一个填充列表以供使用并演示您观察到的错误?
-
不要试图同时做太多事情。我建议您创建一个函数来从列表中删除选定的节点。第二个函数将节点添加到列表的末尾。然后你可以使用这些函数。
-
另外,现在是学习如何使用调试器捕获崩溃、如何定位代码中发生崩溃的位置以及如何在崩溃。
-
@Someprogrammerdude 我无法添加或删除节点,我必须修改指针。我使用 CodeBlocks 作为 IDE...如何使用调试器? 15 -> 7 -> 2 -> 1 -> 30 -> 25 -> 10 就是一个例子。输出应该是 7 -> 2 -> 1 -> 25 -> 10 -> 15 -> 30
-
@pochopsp 移动节点意味着将其从列表中删除,然后将其(同一节点)添加到列表中的不同位置。没有其他办法了。据我所知,指导方针说您不能删除和重新创建节点,这与删除和添加完全不同。举例来说,将一本书移动到书架上的不同位置通常需要删除和添加。要删除和重新创建,您必须撕碎这本书,然后打印一份新副本。这是你的锻炼不希望你做的事情。
标签: c linked-list