#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;
}
假设输入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才行~~~
p=p->next,实际上还是第二个元素的next,而第二个元素已经释放了,p指向的是一个未知的区域~~
该如何解决这个问题呢?谢谢!!!
@宋天一:
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; } }
用这个函数进行替换你的代码~~
@星空雾雨: 上面的循环条件改一下:while(head->next!=NULL)
@星空雾雨: 谢谢,我用了一个循环加了一个计数的从头又重新跑到了删除的位置,这样就解决了
j=1;
while(j<i)
{
q=q->next;
j++;
}不过算法不如你的简练。