Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 - Fatal编程技术网

C 关于删除链接列表中的节点

C 关于删除链接列表中的节点,c,linked-list,C,Linked List,以下代码无法编译(由于明显的原因,代码是部分/修改的代码) 错误:无法将参数1的list(*)[2]{aka l_list(*)[2]}转换为list**{aka l_list**}以使delete无效(list**,int) 问题1:编译帮助。请告知 问题2:如果我们必须如上所述实现delete,那么在函数中如何释放数组列表中的指针?(如何删除分段错误?此: list listg[5]; 不是由其next指针串在一起的5个节点的列表。这是一个由五个列表组成的数组。(对于该结构,“list”是

以下代码无法编译(由于明显的原因,代码是部分/修改的代码)

错误:无法将参数1的list(*)[2]{aka l_list(*)[2]}转换为list**{aka l_list**}以使delete无效(list**,int)

问题1:编译帮助。请告知

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

此:

list listg[5];
不是由其
next
指针串在一起的5个节点的列表。这是一个由五个列表组成的数组。(对于该结构,“list”是一个非常容易引起误解的名称--“node”会更好。)我不知道您希望
delete
对它做什么(因为您没有向我们展示
delete()
),但该函数的签名与您提供的签名不匹配


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

考虑一下
listg
列表的数组

然后,
&listg
是指向
列表数组的指针

delete()
要求在第一个参数中使用指向
列表的指针。因此,存在类型不匹配,从而导致编译器错误。这可以通过实际传入指向
列表的指针地址来纠正

list listg[5] = {
    { 1, &listg[1] },
    { 2, &listg[2] },
    { 3, &listg[3] },
    { 4, &listg[4] },
    { 5, 0 } };
list *listp = listg;
delete(&listp, 3);
不允许对不是由
malloc()
(或其同级之一)返回的指针值调用
free()
。这意味着不能在自动或非静态内存上调用<代码> For(代码)>,也不能在动态分配的中间调用地址。但是,您可以从列表中删除与
3
关联的节点

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

修复示例(数组版本)

#包括
#包括
类型定义结构l_列表{
int值;
结构l_列表*下一步;
}名单;
作废删除(列表**标题,int值){
列表*当前,*上一个=空;
对于(当前=*头部;当前!=NULL;上一个=当前,当前=当前->下一个){
如果(当前->值==值){
打破
}
}
如果(当前!=NULL){
如果(上一个==NULL){
*头部=当前->下一步;
}否则{
上一个->下一个=当前->下一个;
}
}
返回;
}
作废打印(列表*标题){
while(head){
printf(“%d”,头部->值);
头部=头部->下一步;
}
printf(“\n”);
}
int main(){
列表G[5];
listg[0]。值=1;
listg[0].next=listg+1;
listg[1]。值=3;
listg[1].next=NULL;
列表*head=&listg[0];
打印头;
删除(&head,3);
打印头;
返回0;
}

对于Q1:更改
列表列表[5]
列表*listg。指向某个对象的指针与指向某个对象数组的指针不同。如果你只搜索一点,就会有很多重复的地方。@herohuyongtao这是我编译的,我list*listg=malloc(sizeof(list)*5);完全不相关,但您永远不应该使用带前导下划线的全局名称,这些名称由C标准规范保留。如果确保
是免费的,则无法传递
不是第一个的地址
free
是一种可以单独保护的情况。是的,是一组相互链接的节点。当您删除这样一个数组链表中的节点时,您将如何释放该未链接的节点?我必须执行删除操作,因此对链表使用了标准的删除。@codeymodey因为您有一个“节点”数组,所以无法逐个释放它们。当数组超出范围时,它们将自动释放。您应该做的只是取消节点与列表的链接。@JoachimPileborg For Q1:change list listg[5];列出*列表;是这样吗?@codeymodey:很抱歉不得不告诉你,但你似乎对什么是链表有着深刻的误解。此数组中的节点不通过其
next
指针链接在一起;你本可以把它们联系起来,但你没有。它们的
next
指针未初始化,可能指向某个地方或其他地方,可能指向有效的内存地址(包含谁知道的内容),也可能不是。“数组链表”一词毫无意义。你必须回去查阅课本。您还可以验证“free”是指您认为它的功能。我知道如何实现删除。但在正常的删除中,您链接上一个->下一个=当前->下一个;//找到当前节点的位置,然后释放当前节点。但是在这里释放电流会产生一个segmentation faultlistg[5]=malloc(sizeof(list)*5)//仍然是segmentation fault persistory,犯了很多错误。list listg*=malloc(sizeof(list)*5);//释放时存在分段错误我对
free()
s限制的解释更加明确。
list listg[5] = {
    { 1, &listg[1] },
    { 2, &listg[2] },
    { 3, &listg[3] },
    { 4, &listg[4] },
    { 5, 0 } };
list *listp = listg;
delete(&listp, 3);
#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;
}