C语言链表销毁的问题

这个程序运行到销毁那个函数总是出错,请大家帮忙解决一下,谢谢!#include<stdio.h>#include<stdlib.h>typedefstructLNode{... 这个程序运行到销毁那个函数总是出错,请大家帮忙解决一下,谢谢!
#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);
}
展开
 我来答
拥云庄主
推荐于2017-10-05 · TA获得超过2501个赞
知道小有建树答主
回答量:672
采纳率:100%
帮助的人:418万
展开全部

你这个销毁函数本身没有问题,它是正确的,问题产生的根源在你的链表生成函数。

你的链表生成函数的入参是一个指针,作为形参,你能改变它指向的东西,但是不能改变形参本身体。也就是说,你在链表创建函数类生成了链表,但是出了这个函数,实参并没有指向你生成的这个链表。你的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

temp2000
2013-01-31 · TA获得超过483个赞
知道小有建树答主
回答量:564
采纳率:100%
帮助的人:347万
展开全部
#include<stdio.h>
#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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
占座专用ID
2013-01-31 · TA获得超过235个赞
知道小有建树答主
回答量:217
采纳率:0%
帮助的人:200万
展开全部
#include<stdio.h>
#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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
90后小白110
2013-01-31 · 超过25用户采纳过TA的回答
知道答主
回答量:194
采纳率:0%
帮助的人:59.7万
展开全部
链表要销毁的话这样样写
LinkList P=pHead->pNext //你的头结点pHead随意定义
LinkList q;
while( p != NULL)
{
q->pNext = p->pNext;
free(p);
p=q;
}
追问
能不能按照我写的给我写一个void DestoryList_L(LNode* L)函数?谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式