不能释放头结点
/*将集合A和集合B合并到集合C中并按生序排列*/
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode
{
int data;
struct Lnode *next;
}Lnode,*LinkList;
//初始化链表
void InitList(LinkList L)
{
L=(LinkList)malloc(sizeof(Lnode));
if(!L)
printf("分配空间失败!");
L->next=0;
}
//创建链表
void CreateList(LinkList L,int n)
{
int i;
LinkList p,s;
s=L;
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(Lnode));
scanf("%d",&p->data);
p->next=0;
s->next=p;
s=p;
}
}
//显示链表中的数据
void Display(LinkList L)
{
LinkList p;
p=L;
while(p->next!=0)
{
p=p->next;
printf("%d ",p->data);
}
}
/*void DestroyList(LinkList L)
{
LinkList p,q;
p=L;
while(p!=0)
{
q=p;
p=p->next;
free(q);
}
}
void InsertList(LinkList L,int i,int e)
{
LinkList p,q,s;
int j=0;
while(p->next!=0&&j<i-1)
{
q=p;
p=p->next;
j++;
if(j==i)
break;
}
s=(LinkList)malloc(sizeof(Lnode));
s->data=e;
s->next=0;
q->next=s;
s->next=q->next;
}
*/
void Hebing(LinkList A,LinkList B,LinkList C);
void main()
{
int m,n;
Lnode A,B,C;
InitList(&A);
InitList(&B);
InitList(&C);
printf("请输入集合A数据个数:");
scanf("%d",&m);
CreateList(&A,m);
printf("请输入集合B数据个数:");
scanf("%d",&n);
CreateList(&B,n);
Hebing(&A,&B,&C);
Display(&C);
printf("\n");
//free(&B);
//free(&A);
Display(&B);
printf("\n");
Display(&A);
}
void Hebing(LinkList A,LinkList B,LinkList C)
{
LinkList p,q,s;
p=A->next;q=B->next;s=C;
while(p&&q)
{
if(p->data>q->data)
{
s->next=q;
s=q;
q=q->next;
}
else
{
s->next=p;
s=p;
p=p->next;
}
}
while(p)
{
s->next=p;
s=p;
p=p->next;
}
while(q)
{
s->next=q;
s=q;
q=q->next;
A->next=0;
B->next=0;
}
}
//在这个程序中为什么不能释放头结点A和B,free(A)和free(B)会出错误
[解决办法]
单步调试看看
[解决办法]
void main()
{
int m,n;
Lnode A,B,C;
---------------------
A,B,C 已经给出了空间,不是malloc的,当然就不能
free。 也就是说malloc 和free 是成对出现的。
你可能被InitList(LinkList L)迷惑了,在这个函数里
L不是被malloc的吗?是的,可是L与A, B,C没有任何关系。
你可以输出一下A,B,C的地址,再输出一下L的地址,就明白了。
[解决办法]
定义A、B、C的时候用LinkList A吧,或者Lnode *A...使用的时候直接InitList(A);
你那样 Lnode A ,然后直接 free(&A) ,
就像是int a; free(&a);一样
[解决办法]
这个好!
The free function deallocates a memory block ( memblock) that was previously allocated by a call to calloc, malloc, or realloc.