数据结构约瑟夫环c++程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//2014113214徐福辉
#include
#include
#include
#define ListSize 100
typedefint DataType;
typedefstruct Node
{
DataType data;
struct Node *next;
}ListNode,*LinkList;
LinkList CreateCycList(int n);//创建一个长度为n的循环单链表
void Josephus(LinkList head,int n,int m,int s);//在单链表中,报到m的人出列
void DisplayCycList(LinkList head);//输出循环单链表
void main()
{
LinkList h;
int n,s,m;
printf("输入环中人数:");
scanf("%d",&n);
printf("输入开始报数的序号");
scanf("%d",&s);
printf("报数为m的人出列");
scanf("%d",&m);
h=CreateCycList(n);
Josephus(h,n,m,s);
}
void Josephus(LinkList head,int n,int m,int s)//在长度为n的单链表中,从第s个人开始报数,数到m的人出列
{
ListNode *p,*q;
int i;
p=head;
for(i=1;i
{
q=p;
p=p->next;
}
while(p->next!=p)
{
for(i=1;i { q=p; p=p->next; } q->next=p->next;//将p指向的结点删除,也就是报数为m的人出列 printf("%4d\n",p->data); free(p); p=q->next;//p指向下一个结点,重新开始报数 } printf("%4d\n",p->data); } LinkList CreateCycList(int n) { LinkList head=NULL; ListNode *s,*r; int i; for(i=1;i<=n;i++) { s=(ListNode*)malloc(sizeof(ListNode)); s->data=i; s->next=NULL; if(head==NULL) head=s; else r->next=s; r=s; } r->next=head; return head; }