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