Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除可被2整除的节点会产生SIGSEGV错误_C_Debugging_Data Structures_Linked List_Segmentation Fault - Fatal编程技术网

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。否则您将出现所谓的内存泄漏。