请大家看看我写的这个将带头节点的单链表置空的函数错在哪里?

classbee 2003-09-15 12:43:00
请大家看看我写的这个将带头节点的单链表置空的函数错在哪里?
int ClearList(LinkList head)
{
if(!head){printf("空表");return 0;}
LinkList p,q;p=head;
while(p!=NULL){
q=p;
p=p->next;
free(q);}
head=p;
}
请大家看看我写的这个将单链表重置为空表的函数是哪里有问题?为什么我先开始用createList创建一个单链表,再调用这个ClearList函数,在调用ListTraverse函数就会出现
"0x0040e0d3"指令引用的"0xdddddde1"内存。该内存不能为"read"。
我用的是vc++.以下是全部代码:


#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
struct List{
ElemType data;
struct List *next;
};
typedef struct List LNode;
typedef LNode *LinkList;
void CreateList(LinkList head,int n)
{
int i;
LinkList p,q;
q=head;
for(i=1;i<=n;i++){
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=q->next;
q->next=p;
q=p;}
}

int ClearList(LinkList head)
{
if(!head){printf("空表");return 0;}
LinkList p,q;p=head;
while(p!=NULL)
{
q=p;
p=p->next;
free(q);}
head=p;
}
int ListTraverse(LinkList head)
{
int i;
LinkList p;
p=head;
if(p==NULL){printf("空表\n");return 0;}
p=head->next;
for(i=1;p->next!=NULL;i++)
{
printf("%d::%d ",i,p->data);
p=p->next;
}
printf("%d::%d ",i,p->data);
}

void main()
{
LinkList head;
head=NULL;
int n;
printf("想建立的元素个数:");
scanf("%d",&n);
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
CreateList(head,n);
ClearList(head);
ListTraverse(head);
}

...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankzch 2003-09-17
  • 打赏
  • 举报
回复
to楼主:
我把head改为全局变量,在TC2.0下调试没有问题,你应该把主函数里的LinkList head;这个定义去掉,而且各个子函数参数表里的head统统去掉,不然局部变量和全局变量同名会覆盖的
你的ListTraverse中前面有测试空表的语句不错,但是你的程序的问题是:head不为空,而head->next为空(原因与传值不传地址有关),而且你的ListTraverse函数中p=head->next为空,下面的for循环又判断p->next,当然会有问题


classbee 2003-09-17
  • 打赏
  • 举报
回复
to frankzch(西方失败):
非常感谢
我已经在vc++6.0里调试通过。看来还是我c语言的基础不太好,犯了概念上的错误。
skywind 2003-09-16
  • 打赏
  • 举报
回复
你把你照我写的程序贴出来
classbee 2003-09-16
  • 打赏
  • 举报
回复
to frankzch(西方失败):
谢谢你的回帖!
我的ListTraverse中前面有测试空表的语句
p=head;
if(p==NULL){printf("空表\n");return 0;
我刚才找你说的该了head为全局变量,但同样的毛病还是会出现!
frankzch 2003-09-16
  • 打赏
  • 举报
回复
出错的原因就是我上面所说的,不能用引用就把LinkList head改为全局变量好了

我很糊涂:你既然把整个链表都删光光了(ClearList),怎么还要遍历这个链表(ListTraverse),这是个什么意思?

classbee 2003-09-16
  • 打赏
  • 举报
回复
to skywind(今何再):找你这样,还是通不过测试呀!!
to frankzch:我是用c写呀,不用引用。而且你仔细看我的程序就知道,我最后是将head也删除了,并赋值为null
skywind 2003-09-15
  • 打赏
  • 举报
回复
你应该用 ClearList(LinkList* list);传递list的指针

int ClearList(LinkList head)
{
if(!head){printf("空表");return 0;}
LinkList p,q;p=head;
while(p!=NULL){
q=p;
p=p->next;
free(q);}
head=p;
~~~~~~
你在这里head=p,但是这个head只是形参,你应该改写一下
}


int ClearList(LinkList* head)
{
if(!*head){printf("空表");return 0;}
LinkList p,q;p=*head;
while(p!=NULL){
q=p;
p=p->next;
free(q);}
*head=p;
}
这样就可以了
frankzch 2003-09-15
  • 打赏
  • 举报
回复
1、前两个子函数是否应该用引用调用的传值方式?LinkList &head
2、ClearList函数的功能是把函数删光吗?为什么名字不用DeleteList?

出错的原因是ClearList函数把List的所有结点都释放掉了,但是头结点里的next指针没有修改为Null,仍然指向原来的内存,故出现错误

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧