从链表中间删除节点

时间:2014-02-18 14:32:21

标签: c pointers linked-list

我正在尝试创建链接列表。每个节点都将包含一个结构和一个指向下一个节点的指针。尝试从列表中间删除节点时,程序会因分段错误而停止。我尝试过几种不同的方式。在迭代到我想要删除的节点之后,这是我尝试使用的算法。

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;
}

这个,没用。所以我把它调整为

1.创建一个指向名为temp。

的节点的指针

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

3.设置前一个节点的'next'指针指向temp的'next'指针。

4.free temp

// 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;
}

它仍然不起作用。我真的不知道出了什么问题,因为对我而言,它似乎非常合理。我知道我必须搞砸了如何初始化指针,或者如何删除节点。如果有人能告诉我为什么代码不能正常工作,我真的会感到沮丧。所以我可以解决它。

1 个答案:

答案 0 :(得分:0)

如评论中所述,您只需检查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;
    }
}

此问题崩溃,直到while循环更改为同时检查currentcurrent->next。问题是,如果删除最后一个节点,current将被指定为NULL,然后您就不能取消引用。

注意:上面的代码不会检查malloc()的回复,但不这样做既懒又坏。