C 删除可被2整除的节点会产生SIGSEGV错误
我试图创建一个函数,该函数删除链表中的所有节点,这些节点的值可以被所选的数字整除 代码如下:C 删除可被2整除的节点会产生SIGSEGV错误,c,debugging,data-structures,linked-list,segmentation-fault,C,Debugging,Data Structures,Linked List,Segmentation Fault,我试图创建一个函数,该函数删除链表中的所有节点,这些节点的值可以被所选的数字整除 代码如下: #include <stdio.h> #include <stdlib.h> //add_beg - adds node at beginning //add_end - adds node at the end //add_at - adds node at the specified index //remove_divisible_by - removes node if
#include <stdio.h>
#include <stdlib.h>
//add_beg - adds node at beginning
//add_end - adds node at the end
//add_at - adds node at the specified index
//remove_divisible_by - removes node if divisible by num (SIGSEGV)
//print_nodes - prints nodes
struct node
{
int value;
struct node *link;
};
typedef struct node node_t;
node_t *head = NULL;
void remove_divisible_by(int num)
{
node_t *temporary = head;
while(temporary != NULL) //ERROR IS PROBABLY HERE
{
if(temporary->link->value % num == 0)
{
temporary->link = temporary->link->link;
}
temporary = temporary->link;
}
}
void add_at(int index, int value)
{
node_t *new_node_ptr = calloc(sizeof(node_t),1);
new_node_ptr->value = value;
node_t *temporary = head;
while(index>1)
{
temporary = temporary->link;
index--;
}
new_node_ptr->link = temporary->link;
temporary->link = new_node_ptr;
}
void add_beg(int value)
{
node_t *new_node_ptr = malloc(sizeof(node_t));
new_node_ptr->value = value;
new_node_ptr->link = head;
head = new_node_ptr;
}
void add_end(int value)
{
node_t *new_node_ptr;
new_node_ptr = malloc(sizeof(node_t));
new_node_ptr->value = value;
new_node_ptr->link = NULL;
if(head == NULL)
{
head = new_node_ptr;
return;
}
node_t *temporary;
temporary = head;
while(temporary->link != NULL) temporary = temporary->link;
temporary->link = new_node_ptr;
}
void print_nodes(node_t *head)
{
node_t *temporary;
temporary = head;
while(temporary != NULL)
{
printf("%d ",temporary->value);
temporary = temporary->link;
}
}
int main()
{
add_end(2);
add_end(3);
add_end(5);
add_beg(1);
add_at(3,4);
remove_divisible_by(2);
print_nodes(head);
return 0;
}
#包括
#包括
//add_beg-在开始处添加节点
//add_end-在末尾添加节点
//add_at-在指定索引处添加节点
//remove_divisible_by-如果可被num整除,则移除节点(SIGSEGV)
//打印节点-打印节点
结构节点
{
int值;
结构节点*链接;
};
类型定义结构节点;
节点头=空;
void remove_可除_by(int num)
{
节点_t*临时=头部;
while(temporary!=NULL)//此处可能有错误
{
如果(临时->链接->值%num==0)
{
临时->链接=临时->链接->链接;
}
临时=临时->链接;
}
}
void add_at(int索引,int值)
{
node_t*new_node_ptr=calloc(sizeof(node_t),1);
新建节点\u ptr->value=value;
节点_t*临时=头部;
而(索引>1)
{
临时=临时->链接;
索引--;
}
新建节点\u ptr->link=临时->链接;
临时->链接=新建节点\u ptr;
}
void add_beg(int值)
{
node_t*new_node_ptr=malloc(sizeof(node_t));
新建节点\u ptr->value=value;
新建节点->链接=头部;
head=新节点ptr;
}
void add_end(int值)
{
节点\u t*新节点\u ptr;
new_node_ptr=malloc(sizeof(node_t));
新建节点\u ptr->value=value;
新建节点\u ptr->link=NULL;
if(head==NULL)
{
head=新节点ptr;
返回;
}
节点_t*临时;
临时=人头;
而(临时->链接!=NULL)临时->链接;
临时->链接=新建节点\u ptr;
}
无效打印节点(节点头)
{
节点_t*临时;
临时=人头;
while(临时!=NULL)
{
printf(“%d”,临时->值);
临时=临时->链接;
}
}
int main()
{
添加_端(2);
添加_端(3);
添加_端(5);
加上(1);;
在(3,4)处添加_;
移除可被(2)整除的_;
打印节点(头);
返回0;
}
该错误似乎出现在函数remove\u divisible\u by
发生了什么:
如果我想删除可被2整除的节点,我会得到一个SIGSEGV错误。
如果我想删除列表中的最后一个节点(在本例中,是可以被5整除的数字),它就可以工作
另一方面,如果我在remove\u divisible\u by
函数中写入while(temporary->link!=NULL)
,删除可被数字2整除的节点实际上是可行的,但是如果我想删除最后一个节点(可被5整除的节点),我会收到一个SIGSEGV错误
我的问题是,究竟为什么会发生这种情况,我该如何解决它
if (temporary->link->value % num == 0)
{
temporary->link = temporary->link->link;
}
。。。您正在检查的不是当前节点(临时
),而是下一个节点(临时->链接
),该节点可能不存在(即临时->链接
为空
),因此您的错误
始终使用循环中的当前节点。只有在循环结束时才需要使用
temporary->link
,才能切换到下一个节点(temporary=temporary->link
。while循环应该检查temporary
和temporary->link
都不为空。while(临时!=NULL | |临时->链接!=NULL)
似乎不起作用编辑:它起作用了,我只是个哑巴。它是&
,而不是|
试试&
而不是谢谢,它现在起作用了。如果你有时间,你能解释一下问题是什么吗?我想如果你在列表的开头放一个2,你会发现你还有另一个bug需要修复。我正在和下一个点头一起工作因为这就是我解决这个问题的方法:如果我使用我当前所在的节点,那么我想不出将过去的节点链接到下一个节点的方法(从而从列表中删除当前节点).我无法返回您仍然可以将上一个节点存储在类似于临时
的变量中。在任何情况下,您都无法逃避检查该节点是否存在(即不为NULL)。此外,正如@user3386109所述,您没有处理当前节点这一事实使您错过了第一个节点。谢谢。这是最好的解决方案,只需创建另一个变量。最后一件事:您应该free()
删除的节点,因为它们是calloc()
'ed。否则您将出现所谓的内存泄漏。