关于删除链表中的节点

时间:2014-02-19 06:31:52

标签: c linked-list

以下代码未编译(代码是部分/修改代码,原因显而易见)

    typedef struct l_list{
           int value;
           struct l_list *next;
    }list; // given

    void delete(list **head, int value){ //given
         ...         
         free(current); // segmentation fault
         ...
     }

    int main() /// given for testcase
    {  
               list listg[2];

              // initialized 2 struct  and link them with each other using next pointer one after another (think like arrayed linked list)

               delete(&listg, 3);
    } 
  

error: cannot convert list (*)[2] {aka l_list (*)[2]} to list** {aka l_list**} for argument 1 to void delete(list**, int)

问题1:编译帮助。请指教!

问题2:如果我们必须如上所述实现删除,在函数中如何释放数组列表中的指针? (如何删除分段错误?)

3 个答案:

答案 0 :(得分:2)

请注意listg数组list 然后,&listg是指向list 数组的指针。

delete()期望指向第一个参数中指向list 的指针。因此,您的类型不匹配,从而导致编译错误。这可以通过实际传入指向list的指针的地址来纠正。

list listg[5] = {
    { 1, &listg[1] },
    { 2, &listg[2] },
    { 3, &listg[3] },
    { 4, &listg[4] },
    { 5, 0 } };
list *listp = listg;
delete(&listp, 3);

不允许您对free()(或其中一个兄弟姐妹)未返回的指针值调用malloc()。这意味着您无法在自动或静态内存上调用free(),也不能在动态分配中调用地址。但是,您可以从列表中删除与3关联的节点。

通常通过操作节点的next指针来实现节点移除,该指针位于要从其当前值移除的节点之前,并且移向要移除的节点之后的节点。您将需要代码(可能是某种循环)来标识要删除的节点以及前一个节点来完成此操作。如果您需要删除列表的第一个元素,可以通过将列表的头部更改为列表中的下一个项目来完成。

答案 1 :(得分:0)

此:

list listg[5];

不是由next指针串联在一起的5个节点的列表。这是一个包含五个列表的数组。 (而“list”对于该结构来说是一个非常具有误导性的名称 - “节点”会更好。)我不知道你期望delete做什么(因为你没有向我们展示delete() 1}}),但该函数的签名与您给出的不匹配。

我不知道“数组列表”是什么意思。你的意思是一系列的名单?并且“数组列表中的指针”是指指向这种数组元素的指针吗?释放这样一个指针意味着什么?

答案 2 :(得分:0)

修复样本(数组版本)

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

typedef struct l_list{
    int value;
    struct l_list *next;
}list;

void delete(list **head, int value){
    list *current, *previous = NULL;

    for (current = *head; current != NULL; previous = current, current = current->next){
        if (current->value == value){
            break;
        }
    }

    if (current != NULL){
        if (previous == NULL){
            *head = current->next;
        } else{
            previous->next = current->next;
        }
    }
    return;
}

void print(list *head){
    while(head){
        printf("%d ", head->value);
        head = head->next;
    }
    printf("\n");
}

int main() { 
    list listg[5];
    listg[0].value = 1;
    listg[0].next = listg + 1;
    listg[1].value = 3;
    listg[1].next = NULL;

    list *head = &listg[0];
    print(head);
    delete(&head, 3);
    print(head);
    return 0;
}