求猴王问题,删除已报数的结点出问题了,求帮忙!!
#include<iostream.h>typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkList;
void InitList(LinkList *&L)
{
L=new LinkList;
L->next=L;
}
////////////////////////////////////////////
//1)尾插法建表
void CreateListR(LinkList *&L,ElemType a[],int n)
{
LinkList *s,*r;
int i;
L=new LinkList;
r=L;
for(i=0;i<n;i++)
{
s=new LinkList;
s->data=a[i];
r->next=s;
r=s;
}
r->next=L;
}
////////////////////////////////////////////
//2)销毁线性表
void DestroyList(LinkList *&L)
{
LinkList *p=L,*q=p->next;
while(q!=L)
{
delete p;
p=q;
q=p->next;
}
delete p;
}
////////////////////////////////////////////
//3)删除数据元素
int ListDelete(LinkList *&L,int i,ElemType &e)
{
int j=0;
LinkList *p=L,*q;
while(j<i-1 && p->next!=L)
{
j++;
p=p->next;
}
if(p==L)
return 0;
else
{
q=p->next;
if(q==L) return 0;
e=q->data;
p->next=q->next;
delete q;
return 1;
}
}
////////////////////////////////////////////
//4)选择猴王
void Select(LinkList *L,int n,int k,int m)
{
LinkList *p=L,*q,*r; //定义3个指针,p指针指向头结点
ElemType e;
int i,j;
for(i=0;i<k;i++)
p=p->next; //p指针指向起始报数结点
q=p->next; //q指针指向起始报数结点的下一结点
delete p; //删除报到的结点
cout<<"猴子"<<k<<"出列"<<endl;
while(q!=L) //当q指针指向头结点
{
for(i=0;i<m-1;i++) //执行报数m-1次的循环
{
q=q->next; //q指针指向下一结点
if(q==L)
q=q->next;
j=q->data;
}
r=q;
q=q->next;
delete r;
cout<<"猴子"<<j<<"出列"<<endl;
}
}
////////////////////////////////////////////
//以下为主函数代码
void main()
{
LinkList *y;
ElemType e;
ElemType a[10]={1,2,3,4,5,6,7,8,9,10};
InitList(y);
cout<<"1)初始化单链表完毕!"<<endl;
cout<<endl;
CreateListR(y,a,10);
cout<<"2)已经创建了一个单链表!"<<endl;
cout<<endl;
cout<<"3)求猴王:"<<endl;
Select(y,10,3,3);
DestroyList(y);
}