Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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编程。(错误的下一个指针)_C_Linked List_Segmentation Fault_Doubly Linked List - Fatal编程技术网

我有一个问题,在双重链表的C编程。(错误的下一个指针)

我有一个问题,在双重链表的C编程。(错误的下一个指针),c,linked-list,segmentation-fault,doubly-linked-list,C,Linked List,Segmentation Fault,Doubly Linked List,我的代码是这样写的。我想删除应该删除的节点为1 这张照片很有趣。我想删除id为2的节点 我想要这个结果。但是,我的结果有一些错误 这张图片是我代码的结果。调试后,我找到了它出错的原因(*curr5)->prev->next=(*curr5)->next这部分工作得很好。但是,在这部分(*curr5)更改为(*curr5)->next和(*curr5)->next->prev=(*curr5)->prev之后此代码返回分段错误。我不知道为什么会发生这种变化。为了解决这个问题,我添加了(*cu

我的代码是这样写的。我想删除应该删除的节点为1

这张照片很有趣。我想删除id为2的节点

我想要这个结果。但是,我的结果有一些错误


这张图片是我代码的结果。调试后,我找到了它出错的原因<代码>(*curr5)->prev->next=(*curr5)->next这部分工作得很好。但是,在这部分
(*curr5)
更改为
(*curr5)->next
(*curr5)->next->prev=(*curr5)->prev之后此代码返回分段错误。我不知道为什么会发生这种变化。为了解决这个问题,我添加了
(*curr5)=(*curr5)->prev介于
(*curr5)->prev->next=(*curr5)->next之间
(*curr5)->next->prev=(*curr5)->prev。然后,这是一个无限循环。。。我认为我的代码没有错误,但我不知道为什么(*curr5)在
(*curr5)->prev->next=(*curr5)->next之后发生了变化。我需要一些建议。

你把事情弄得比需要的更复杂了。代码似乎要删除列表中设置了
shouldRemove
标志的第一个节点,然后停止。duo链表中的节点管理涉及两个方面:

  • 指引你到达那里的指针
  • 保存该指针的节点(如果有)


值得注意的是,您可以通过删除
中断来删除设置了
shouldRemove
标志的所有节点在上面的循环中。

不相关,您是否打算让此代码声明类型为
struct someEvent*
的全局变量
someEvent
?如果没有(即,如果粘贴到SO时剪掉了typedef),则停止在typedef中隐藏指针;这几乎总是个坏主意。
struct someEvent
{
    int id;
    int shouldRemove;
    struct someEvent *prev;
    struct someEvent *next;
} * someEvent;


struct someEvent *someEventQueue = NULL;


int main(){

struct someEvent **curr5 = &someEventQueue;
                while ((*curr5) != NULL)
                {
                    if ((*curr5)->shouldRemove == 1)
                    {
                        tmpflag = 1;
                        if ((*curr5)->prev == NULL && (*curr5)->next == NULL)
                        {
                            (*curr5) = NULL;
                        }
                        else if ((*curr5)->prev == NULL)
                        {
                            (*curr5) = (*curr5)->next;
                            (*curr5)->prev = NULL;
                            //(*curr5)->prev->next = (*curr5)->next;
                        }
                        else if ((*curr5)->next == NULL)
                        {
                            (*curr5)->prev->next = NULL;
                        }
                        else
                        {
                            (*curr5)->prev->next = (*curr5)->next;
                            (*curr5)->next->prev = (*curr5)->prev;
                        }
                    }
                    if (tmpflag == 1)
                    {

                        break;
                    }

                    curr5 = &(*curr5)->next;
                }



  }
int main()
{
    struct someEvent **curr = &someEventQueue;
    struct someEvent *prev = NULL;

    while (*curr)
    {
        if ((*curr)->shouldRemove)
        {
            struct someEvent *tmp = *curr;
            *curr = tmp->next;
            if (tmp->next)
                tmp->next->prev = prev;

            // added to prevent memory leak. remove if these are
            //  maintained somewhere else.
            free(tmp);

            break;
        }
        else
        {
            prev = *curr;
            curr = &(*curr)->next;
        }
    }
}