调试没错误,一运行就不行!!!!#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;
}}

解决方案 »

  1.   

    void deleteafter(linklist *p,linklist **head)//删除前续节点
    {
    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;
    }
      

  2.   

    不好意思,有几句不对
    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;
    }

    }