C语言链表销毁的问题
#include<stdio.h>#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreatList_L(LinkList L, int n);void DestoryList_L(LNode* L);
int main(){
LNode list;
CreatList_L(&list,3);
DestoryList_L(&list);
}
void CreatList_L(LinkList L, int n){
LNode *p,*r;
int i;
L=(LinkList)malloc(sizeof(struct LNode));
if(L==NULL)
exit(1);
L->next=NULL;
p=r=L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
for(p=L->next;p!=NULL;p=p->next)
printf("%-5d",p->data);
printf("\n");
}
void DestoryList_L(LNode* L){
LNode *p;
int n=0;
while(L)
{
p=L;
L=L->next;
free(p);
n++;
}
printf("%d\n",n);
} 展开
你这个销毁函数本身没有问题,它是正确的,问题产生的根源在你的链表生成函数。
你的链表生成函数的入参是一个指针,作为形参,你能改变它指向的东西,但是不能改变形参本身体。也就是说,你在链表创建函数类生成了链表,但是出了这个函数,实参并没有指向你生成的这个链表。你的list仅仅是一个链表元素,你的程序里,它并不是动态生成的,而是一个局部变量,这时候你去free释放它,就会报错。
修改很简单,把创建函数参数改成指向指针的指针。如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreatList_L(LinkList *L, int n);//参数改成LinkList 的指针,对链表元素来说,就是指针的指针
void DestoryList_L(LNode* L);//正确的,不需要修改
int main()
{
//LNode list;//这个可以不要
LNode *pList = NULL;//直接声明一个
指针就可以 ,调用CreatList_L之后,pList 就会指向你动态生成的链表了。
CreatList_L(&pList,3); //传入指针地址
DestoryList_L(pList);
}
void CreatList_L(LinkList *L, int n) {
LNode *p,*r;
int i;
*L=(LinkList)malloc(sizeof(struct LNode)); //注意要对L解引用
if(*L==NULL)
exit(1);
(*L)->next=NULL;
p=r=(*L);
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
for(p=(*L)->next;p!=NULL;p=p->next)
printf("%-5d",p->data);
printf("\n");
}
void DestoryList_L(LNode* L)
{
LNode *p; int n=0;
while(L)
{
p=L;
L=L->next;
free(p);
n++;
}
printf("%d\n",n);
}
运行截图:
你的n输出有问题,应该是n-1
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
LNode* CreatList_L(LinkList L, int n);//修改返回类型
void DestoryList_L(LNode* L);
int main()
{
LNode * list; //用指针
list=CreatList_L(list,3);//接收返回的头指针
DestoryList_L(list);
return 0;
}
LNode* CreatList_L(LinkList L, int n)//修改返回类型
{
LNode *p,*r;
int i;
L=(LinkList)malloc(sizeof(struct LNode));
if(L==NULL)
exit(1);
L->next=NULL;
p=r=L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
p->next=NULL;
r->next=p; r=p;
}
for(p=L->next;p!=NULL;p=p->next)
printf("%-5d",p->data); printf("\n");
return L;//返回
}
void DestoryList_L(LNode* L)
{
LNode *p;
int n=0;
while(L)
{
p=L;
L=L->next;
free(p);
n++;
}
printf("%d\n",n);
}
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreatList_L(LinkList &L, int n);
//如果你想要main函数里面的list在CreatList_L函数中初始化这里就需要使用引用,
//否则就要把list的初始化放到main里面去
void DestoryList_L(LNode* L);
int main(){
LNode *list; //用指针,不然CreatList_L函数执行后list的值并不能保留
CreatList_L(list,3);
DestoryList_L(list);
}
void CreatList_L(LinkList &L, int n){
LNode *p,*r;
int i;
L=(LinkList)malloc(sizeof(struct LNode));
if(L==NULL)
exit(1);
L->next=NULL;
p=r=L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
for(p=L->next;p!=NULL;p=p->next)
printf("%-5d",p->data);
printf("\n");
}
void DestoryList_L(LNode* L){
LNode *p;
int n=0;
while(L)
{
p=L;
L=L->next;
free(p);
n++;
}
printf("%d\n",n);
}
LinkList P=pHead->pNext //你的头结点pHead随意定义
LinkList q;
while( p != NULL)
{
q->pNext = p->pNext;
free(p);
p=q;
}
能不能按照我写的给我写一个void DestoryList_L(LNode* L)函数?谢谢!