首页 新闻 赞助 找找看

c语言中链表里free()问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-10-28 16:26
#include <stdio.h>
#include<stdlib.h>
typedef int  ElemType;//元素类型
typedef  struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList linkList(){//初始化链表
LinkList p;
p=(LNode *)malloc(sizeof(LNode));
p->next=NULL;
return p;
}
int creatList(LNode *a)//创建链表
{
LinkList p=a;
while(p->next!=NULL) p=p->next;
p->next=(LNode *)malloc(sizeof(LNode));
if(p->next==NULL) return 0;
p=p->next;
scanf("%d",&p->data);
p->next=NULL;
return 1;


}
int insertList(LinkList p,int i,ElemType b)//插入链表一个节点
{
LinkList f;int a=1;
p=p->next;
while(p!=NULL&&a<i){
a++;
if(a==i) break;
p=p->next;


}
if(p!=NULL)
{
f=p->next;
p->next=(LNode *)malloc(sizeof(LNode));
p=p->next;
p->data=b;
p->next=f;
return 1;
}
return 0;
}
int deleteList(LinkList head,int i)//删除链表中的一个节点
{
LinkList f,p;
int a=1;p=head;
while(p->next!=NULL&&a<i){
p=p->next;
a++;
}
if(p->next!=NULL&&a==i){
f=p->next;
p->next=f->next;
free(f);//在删除偶数节点函数执行的时候有这一句就错误
return 1;
}
return 0;
}
void deleteOdd(LinkList p)//删链表中的偶数节点
{
LinkList head=p;
int i=1;
p=p->next;
while(p!=NULL)
{
if((p->data%2)==0){
deleteList(head,i);}
 else i++;
 p=p->next;
}
}
void displayList(LNode *p){//显示链表中的数据
p=p->next;
while(p)
{
printf("%d   ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
int k;int i,j;
LinkList p=linkList();//初始化一个链表
for(i=0;i<5;i++)//创建一个链表
creatList(p);
/*for(int j=0;j<5;j++)
{
scanf("%d",&k);
deleteList(p,k);
displayList(p);
}*/
deleteOdd(p);//删除偶数节点
displayList(p);//显示
return 0;
}
宋天一的主页 宋天一 | 初学一级 | 园豆:184
提问于:2012-10-28 14:37
< >
分享
最佳答案
0

假设输入1,2,3,4,5
deletodd删除2时,指针p指向第2个元素,deleteList(head,2)中删除了第二个元素,
deleteodd中的p=p->next,实际上还是第二个元素的next,而第二个元素已经释放了,报访问非法,
而且你这个程序,这两个函数deletodd,deleteList中的i也无法同步,删除4时,对deletodd中i是4
而对deleteList中i是3才行~~~

收获园豆:20
星空雾雨 | 菜鸟二级 |园豆:311 | 2012-10-28 15:44

p=p->next,实际上还是第二个元素的next,而第二个元素已经释放了,p指向的是一个未知的区域~~

星空雾雨 | 园豆:311 (菜鸟二级) | 2012-10-28 15:48

该如何解决这个问题呢?谢谢!!!

宋天一 | 园豆:184 (初学一级) | 2012-10-28 15:54

@宋天一: 

View Code
void deleteOdd(LinkList p)//删链表中的偶数节点
{
LinkList head=p;
while(p->next!=NULL)
{
p=head->next;
if((p->data%2)==0)
{
head->next=p->next;
free(p);
}
else
head=p;
}
}

用这个函数进行替换你的代码~~

星空雾雨 | 园豆:311 (菜鸟二级) | 2012-10-28 16:08

@星空雾雨: 上面的循环条件改一下:while(head->next!=NULL)

星空雾雨 | 园豆:311 (菜鸟二级) | 2012-10-28 16:12

@星空雾雨: 谢谢,我用了一个循环加了一个计数的从头又重新跑到了删除的位置,这样就解决了

j=1;
while(j<i)
{
q=q->next;
j++;
}不过算法不如你的简练。

宋天一 | 园豆:184 (初学一级) | 2012-10-28 16:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册