C 从链接列表的中间删除节点

C 从链接列表的中间删除节点,c,pointers,linked-list,C,Pointers,Linked List,我正在尝试创建一个链接列表。每个节点将保存一个结构和一个指向下一个节点的指针。当试图从列表中间删除节点时,程序会由于分段错误而停止。我试过几种不同的方法来解决这个问题。这里是我尝试使用的算法,在迭代到我想要删除的节点之后 1.将上一个节点的“下一个”指针设置为要删除的节点之后的节点 // example node_t *current = head; while(current->next != NULL) { if(current->next->b.y <= 5

我正在尝试创建一个链接列表。每个节点将保存一个结构和一个指向下一个节点的指针。当试图从列表中间删除节点时,程序会由于分段错误而停止。我试过几种不同的方法来解决这个问题。这里是我尝试使用的算法,在迭代到我想要删除的节点之后

1.将上一个节点的“下一个”指针设置为要删除的节点之后的节点

// example
node_t *current = head;
while(current->next != NULL) {
    if(current->next->b.y <= 5) {
        current->next = current->next->next; // first idea, didn't work
    }
    current = current->next;
}
//示例
节点_t*电流=头部;
while(当前->下一步!=NULL){
如果(当前->下一步->b.y下一步=当前->下一步->下一步;//第一个想法不起作用
}
当前=当前->下一步;
}
这个,不起作用。所以我把它调整到

1.创建一个指向名为temp的节点的指针

2.将要删除的节点复制到temp中

3.将上一个节点的“下一个”指针设置为临时节点的“下一个”指针

4.自由温度

// example
node_t *current = head;
while(current->next != NULL) {
    if(current->next->b.y <= 5) {
        node_t *temp;
        temp = current->next;
        current->next = temp->next;
        free(temp);
    }
    current = current->next;
}
//示例
节点_t*电流=头部;
while(当前->下一步!=NULL){
如果(当前->下一步->下一步;
当前->下一步=临时->下一步;
免费(临时);
}
当前=当前->下一步;
}

它仍然不起作用。我真的不知道出了什么问题,因为在我看来它在语法上是非常正确的。我知道我一定是把初始化指针或删除节点的方法搞砸了。如果有人能告诉我为什么代码不起作用,我会非常感激,这样我就可以修复它了。

如评论中所述,您只需检查
current
以及
current->next
是否不为空

#include <stdio.h>
#include <stdlib.h>

typedef struct node_t
{
    struct node_t *next;
    int data;
} node_t;

static void add_node(node_t **head, int value);
static void free_list(node_t **head);
static void dump_list(node_t *head);

int main(void)
{
    node_t *head = 0;
    add_node(&head, 3);
    add_node(&head, 6);
    add_node(&head, 9);
    add_node(&head, 4);
    add_node(&head, 8);
    add_node(&head, 2);
    dump_list(head);

    node_t *current = head;
    while (current != NULL && current->next != NULL)
    {
        if (current->next->data <= 5)
        {
            current->next = current->next->next;
        }
        current = current->next;
    }
    dump_list(head);
    free_list(&head);
    dump_list(head);

    return 0;
}

static void add_node(node_t **head, int value)
{
    node_t *node = malloc(sizeof(*node));
    node->data = value;
    node->next = *head;
    *head = node;
}

static void dump_list(node_t *head)
{
    char const *pad = "";
    while (head != 0)
    {
        printf("%s %d", pad, head->data);
        pad = " ->";
        head = head->next;
    }
    putchar('\n');
}

static void free_list(node_t **head)
{
    while (*head != 0)
    {
        node_t *next = (*head)->next;
        free(*head);
        *head = next;
    }
}
#包括
#包括
类型定义结构节点
{
结构节点*next;
int数据;
}节点t;
静态无效添加节点(节点**头,int值);
静态无空洞列表(节点**头);
静态无效转储列表(节点头);
内部主(空)
{
节点头=0;
添加_节点(&head,3);
添加_节点(&head,6);
添加_节点(&head,9);
添加_节点(&head,4);
添加_节点(&head,8);
添加_节点(&head,2);
倾销清单(标题);
节点_t*电流=头部;
while(当前!=NULL&¤t->next!=NULL)
{
如果(当前->下一步->数据下一步=当前->下一步->下一步;
}
当前=当前->下一步;
}
倾销清单(标题);
自由_列表(&head);
倾销清单(标题);
返回0;
}
静态无效添加节点(节点**头,int值)
{
node_t*node=malloc(sizeof(*node));
节点->数据=值;
节点->下一步=*头部;
*头部=节点;
}
静态无效转储列表(节点头)
{
字符常量*pad=“”;
while(头!=0)
{
printf(“%s%d”,pad,head->data);
pad=“->”;
头部=头部->下一步;
}
putchar('\n');
}
静态无空洞列表(节点**头)
{
而(*头!=0)
{
node_t*next=(*head)->next;
自由(*头);
*头=下一个;
}
}
这会崩溃,直到
while
循环被更改为同时检查
current
current->next
。问题是,如果删除最后一个节点,
current
将被分配为NULL,然后无法取消引用


注意:上面的代码没有检查malloc()的返回值,但不这样做既懒惰又糟糕。

您能显示节点结构吗?如果输入时
head==NULL
,两个片段都有问题。此外,您也不处理需要删除head节点的情况(所以<代码>头> B.Y.JoaNehan-LeffffLi我害怕考虑这个列表有一个渗透的“头”节点,它实际上不是列表中的“部分”;过度暴露的(和imnSo不值钱的)。设计,由于某种原因,在学术界受到重击。或者,它只是一个bug=P@JonathanLeffler是的,头部是列表中永久的一部分。我给它一个永久的y值99,并在我的代码中更新y值的部分跳过头部。我认为这是错误的,我会更改它,以便头部也被使用。谢谢。