C语言链表 删除

Python012

C语言链表 删除,第1张

struct LNode * delete(LNode * head)

{

    LNode * node = head

    LNode ** parent = &head

    double min, max

    printf("请输入min和max: ")

    scanf("%lf %lf", &min, &max)

    while (node)

    {

        // 大于min和小于max,则删除节点

        if (node->data > min && node->data < max)

        {

            *parent = node->next

    // 如果你的LNode是malloc出来的,需要free(node)

    node = *parent

}

else

{

    node = node->next

    parent = &node->next

}

    }

    return head

    // 这个逻辑不需要给你太多注释,你只需要拿一支笔,手动画一个3个节点的链表,    

    // 然后从函数执行开始,一步一步去推怎么执行的就懂了。

    // 至于你的程序的错误,没帮你看

}

所谓链表,就是用指针将内存中动态分配的结点空间,链接起来成一个表。

所以,建表的过程即是每次为新结点分配内存;因此,释放空间的话,也要从头到尾,一个一个结点的释放,这样才能全部释放掉。

这段代码释放了整个链表空间内存;while循环的作用是从头到尾释放后续结点,如果直接free(pHead)则后面的结点将无法找到,那么造成内存空间泄露。

另外,你的while循环存在一个错误,假设释放了倒数第一个结点后,pHead指向最后一个结点,而最后一个结点的next为NULL,那么这样最后一个结点也没有释放掉,while就退出了。

while循环应该更正为:

while(pHead != NULL)  

{  

    pNext = pHead->next

    free(pHead)  

    pHead = pNext    

}

原始核心代码是有一些问题的。

修改如下:

#include <stdio.h>

#include <stdlib.h>

typedef struct dubnode

{

int data

struct dubnode *prior,*next

}

node,*dublink

void creat(dublink *L,int n)

{

int i

dublink p,q=NULL

for(i=1i<=n++i)

{

p=(dublink)malloc(sizeof(node))

p->data=i

p->next=NULL

p->prior=q

if(q)

q->next=p

if(q == NULL) *L=p

q=p

}

}

void print(dublink L)

{

dublink p = L

while(p)

{

printf("%5d",p->data)

p=p->next

}

printf("\n")

}

void insert(dublink *L,int i,int e)

{

dublink p = *L,s

int j = 1

while(p&&j<i)

{

p=p->next

++j

}

if(!p||j>i)

printf("error")

else

{

s=(dublink)malloc(sizeof(node))

s->data=e

s->prior=p->prior

if(p->prior)

p->prior->next=s

else *L = s

s->next=p

p->prior=s

}

}

void de(dublink *L,int i)

{

dublink p = *L,s

int j = 1

while(p&&j<i)

{

p=p->next

++j

}

if(!p||j>i)

printf("error")

else

{

s=p

if(p->prior)

p->prior->next=p->next

else

*L=p->next

p->next->prior=p->prior

free(s)

}

}

int main()

{

dublink l

int i, e

printf("input element number:")

scanf("%d",&i)

creat(&l,i)

printf("the org list is \n")

print(l)

printf("input the number to insert:")

scanf("%d",&e)

printf("input the index to insert:")

scanf("%d",&i)

insert(&l, i, e)

printf("after insert, the list is \n")

print(l)

printf("input the index to delete:")

scanf("%d",&i)

de(&l, i)

printf("after delete, the list is \n")

print(l)

return 0

}