调试没错误,一运行就不行!!!!#include "iostream.h"typedef struct node
{int data;
struct node *next;
} linklist;int main()
{
linklist *creatlistf();linklist *head=creatlistf();void deleteafter(linklist *p,linklist *head);void yuesefu(int m,linklist *head);int val;
cout<<"please enter the first value of m: ";
cin>>val;
yuesefu(val,head);
return 0;
}
linklist *creatlistf()//建立单循环链表
{
int val,n=5,i=0;
linklist *head,*s,*t;
head=0;
cout<<"please input int val : "<<"\n";
cin>>val;
while(i<n)
{s = new linklist;
s->data=val;
s->next=head;
head=s;
cin>>val;
i++;
}
t=head;
while(head->next!=0)
{
head=head->next;}
head->next=t;return t;
}void deleteafter(linklist *p,linklist *head)//删除前续节点
{linklist *r,*t;
t=head;
r=p->next;
p->next=r->next;
delete r;
cout<<"output deleteafter list:"<<"\n";
while(t->next!=head)
{cout<<t->data<<"\n";
t=t->next;
}
cout<<t->data<<"\n";}void yuesefu(int m,linklist *head)
{
int val;
linklist *t,*t1,*t2;//t1保护t的next以便设置下次循环的入口,t2用来保护t的前一个点的
t=head; //地址,一以便使用deleteafter
while(m!=0)
{
t=t->next;
m--;
}
val=t->data;
while(t!=0)
{
while(val!=0)
{
t2=t;//t得前一个点
t=t->next;
val--;
}
val=t->data;
t1=t->next;
deleteafter(t2,head);
t=t1;
}}
{int data;
struct node *next;
} linklist;int main()
{
linklist *creatlistf();linklist *head=creatlistf();void deleteafter(linklist *p,linklist *head);void yuesefu(int m,linklist *head);int val;
cout<<"please enter the first value of m: ";
cin>>val;
yuesefu(val,head);
return 0;
}
linklist *creatlistf()//建立单循环链表
{
int val,n=5,i=0;
linklist *head,*s,*t;
head=0;
cout<<"please input int val : "<<"\n";
cin>>val;
while(i<n)
{s = new linklist;
s->data=val;
s->next=head;
head=s;
cin>>val;
i++;
}
t=head;
while(head->next!=0)
{
head=head->next;}
head->next=t;return t;
}void deleteafter(linklist *p,linklist *head)//删除前续节点
{linklist *r,*t;
t=head;
r=p->next;
p->next=r->next;
delete r;
cout<<"output deleteafter list:"<<"\n";
while(t->next!=head)
{cout<<t->data<<"\n";
t=t->next;
}
cout<<t->data<<"\n";}void yuesefu(int m,linklist *head)
{
int val;
linklist *t,*t1,*t2;//t1保护t的next以便设置下次循环的入口,t2用来保护t的前一个点的
t=head; //地址,一以便使用deleteafter
while(m!=0)
{
t=t->next;
m--;
}
val=t->data;
while(t!=0)
{
while(val!=0)
{
t2=t;//t得前一个点
t=t->next;
val--;
}
val=t->data;
t1=t->next;
deleteafter(t2,head);
t=t1;
}}
{
linklist *r,*t;
r=p->next;
if(r == head)
{
*head = *head->next;
p->next=*head;
}
else
{
p->next=r->next;
} delete r;
cout<<"output deleteafter list:"<<"\n"; t = *head;
while(t->next!=*head)
{
cout<<t->data<<"\n";
t=t->next;
}
cout<<t->data<<"\n";
}
你的函数中传入了头指针,要是删除了头指针后,再调用此函的话,不出错才怪
while(t!=0)
{
while(val!=0)
{
t2=t;//t得前一个点
t=t->next;
val--;
}
val=t->data;
t1=t->next;
deleteafter(t2,head); //这句使得头指针可能会被删除
t=t1;
}
void deleteafter(linklist *p,linklist **head)//删除前续节点
{
if(p == *head)
{
delete p;
*head = NULL; return;
} linklist *r,*t;
r=p->next;
if(r == *head)
{
*head = (*head)->next;
p->next=*head;
}
else
{
p->next=r->next;
} delete r;
cout<<"output deleteafter list:"<<"\n"; t = *head;
while(t->next!=*head)
{
cout<<t->data<<"\n";
t=t->next;
}
cout<<t->data<<"\n";
}void yuesefu(int m,linklist *head)
{
int val;
linklist *t,*t1,*t2;//t1保护t的next以便设置下次循环的入口,t2用来保护t的前一个点的
t=head; //地址,一以便使用deleteafter
while(m!=0)
{
t=t->next;
m--;
}
val=t->data;
while(t!=0 && head)
{
while(val!=0)
{
t2=t;//t得前一个点
t=t->next;
val--;
}
val=t->data;
t1=t->next;
deleteafter(t2,&head);
t=t1;
}
}