用清空链表free后为什么会提示堆出错?
#include <stdio.h>
#include <iostream>
using namespace std;
typedef char ElemType;
//定义单链表数据结构
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
//初始化链表
LinkList InitList()
{
//函数功能:初始化链表L
//1、建立头结点,L指向头结点
LinkList head,first,L;
head=(LinkList)malloc(sizeof(Node));
/*first=(LinkList)malloc(sizeof(Node));
first->data='a';
first->next=NULL;*/
head->next=NULL;
L=head;
return L;
}
int AddBeforeList(LinkList *L,ElemType e)
{
//函数功能:在链表前面增加元素(前插法)
//注意*L传入的是链表结构指针
LinkList p,s;
p=*L;//把链表结构指针给p
//前插法不用定位,直接插入
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=NULL;
s->next=p->next;
p->next=s;
return 1;
}
int AddIndexList(LinkList *L,int i,ElemType e)
{
//函数功能:在指定i位位置插入元素E
//注意*L传入的是链表结构指针
LinkList p,s;
p=*L;//把链表结构指针给p
int j=1;
while(p&&j<i)
{
//查找链表的i结点的前一个结点
p=p->next;
j++;
}
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=NULL;
s->next=p->next;
p->next=s;
return 1;
}
int AddAfterList(LinkList *L,ElemType e)
{
//函数功能:在链表前面增加元素(后插法)
//注意*L传入的是链表结构指针
LinkList p,s;
p=*L;//把链表结构指针给p
//while(p)
//{
//查找链表的空结点的前一个结点(不能用data判断因为p->next->data此时没有分配地址,程序出错)
//直接p->next就可以
// if(p->next->data)
// break;
// p=p->next;
//}
while(p)
{
//查找链表的空结点的前一个结点
if(!p->next)
break;
p=p->next;
}
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=NULL;
s->next=p->next;
p->next=s;
return 1;
}
ElemType DelListElem(LinkList *L,int i)
{
//函数功能:删除指定i位位置元素
//注意*L传入的是链表结构指针
LinkList p;
ElemType e;
p=*L;//把链表结构指针给p
int j=1;
while(p&&j<i)
{
//查找链表的i结点的前一个结点
p=p->next;
j++;
}
e=p->data;
p->next=p->next->next;
return e;
}
int ClearList(LinkList *L)
{
//函数功能:释放内存空间
//LinkList p,q;
//p=*L;
//while(p)
//{
// q=p->next;
//free(p);
// p=q;
//}
//(*L)->next=NULL;
free(*L);//此处要传L地址的地址也就是**L
return 1;
}
int main()
{
LinkList L;
LinkList c;
L=InitList();
AddBeforeList(&L,'b');
AddBeforeList(&L,'c');
AddBeforeList(&L,'d');
AddBeforeList(&L,'e');
AddBeforeList(&L,'f');
AddIndexList(&L,3,'A');
AddAfterList(&L,'L');
DelListElem(&L,4);
//释放内存空间使用free后,再创建链表会提示堆错误
ClearList(&L);
L;
AddBeforeList(&L,'b');
//c=InitList();
//AddAfterList(&c,'L');
}