2014-02-18 81 views
0

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

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.将先前节点的'下一个'指针设置为临时'下一个'指针。

4.free临时

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

你可以显示node_t结构吗? – Coconop

+0

如果入口处有'head == NULL'这两个片段都有问题。此外,你不处理你需要删除头节点的情况(所以'head-> by <= 5'。你是否浏览了页面右边的相关问题以寻求帮助? –

+0

@JonathanLeffler I因为某种原因,在学术界受到重创的过度曝光(和imnsho毫无价值)设计,或者它只是一个bug而已= P – WhozCraig

回答

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()返回,但不这样做是懒惰和坏。