#include<iostream>
using namespace std;
struct Node //循环节点的定义
{
int number; //编号
Node *next;
};
Node *CreateList( Node *L,int &n,int &m);//约瑟夫环函数
void Joseph(Node *L,int n,int m);//输出每次出列号数函数
Node *DeleteList(Node *L,int i,Node *q);//寻找每次出列人的号数
int LengthList(Node *L);//计算环上的所有人数函数
int main()//主函数
{
Node *L;
L=NULL;//初始化尾指针
int n,m;
cout<<"请输入人数N:";
cin >>n;//环的长度
if(n<1){cout <<"请输入正整数!";}//人数异常处理
else
{
cout <<"请输入所报数M:";
cin >>m;
if (m<1){cout <<"请输入正整数!";}//号数异常处理
else
{
L=CreateList (L,n,m);//重新给尾指针赋值
Joseph(L,n,m);
}
}
// system ("pause");
return 0;
}
Node *CreateList (Node *L,int &n,int &m)//一个约瑟夫环(尾插法)
{
Node *q;
for(int i=1;i<=n;i++)
{
Node *p;
p=new Node ;
p->number =i;
p->next =NULL;
if(i==1)L=q=p;//工作指针的初始化
else
{
q->next =p;
q=q->next;
}
}
q->next=L;
if(L!=NULL){return (L);}//返回尾指针
else cout <<"尾指针异常!"<<endl;//尾指针异常处理
}
void Joseph(Node *L,int n,int m)//每次出列的人
{
int k;
cout<<"请输入第一个报数人:";
cin>>k;
if(k<1||k>n){cout <<"请输入1-"<<n<<"之间的数"<<endl;}
else
{
cout <<"\n出列顺序:\n";
for(int i=1;i<n;i++)
{
Node *q=new Node;
if(i==1)q=DeleteList(L,k+m-1,q);//第一个出列人的号数
else q=DeleteList(L,m,q);
cout<<"号数:"<<q->number <<endl;
delete q;//释放出列人的储存空间
}
cout <<"最后一个出列号数是:"<<L->number <<endl ;//输出最后出列人的号数
}
}
Node *DeleteList(Node **L,int i,Node *q)//寻找每次出列的人
{
if(i==1)i+=LengthList(*L);//顺序依次出列情况的处理方式
Node *p;
p=*L;
int j=0;
while(j<i-2){p=p->next ;j++;}
q=p->next;
return (q);
}
int LengthList (Node *L)//计算环上的人数
{
if(L){cout <<"尾指针错误!"<<endl;}//异常处理
else
{
int i=1;
Node *p=L->next;
while (p!=L)
{
i++;
p=p->next;
while(p!=L)
{
i++;
p=p->next;
}
return (i);
}
}
}
DeleteList没有函数体---错误提示是这么个意思,但我编译你的代码没有这个错误,尝试把DeleteList放到Joseph函数前试试吧
某函数没有绝对的return语句--CreateList和LengthList函数最后都要有个return NULL或者return 0啥的