#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指向的是一个未知的区域~~
该如何解决这个问题呢?谢谢!!!
@宋天一:
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++;
}不过算法不如你的简练。