1.创建结构体
typedef struct stu
{
int data;
struct stu *next;
}CircNode,*CircList;
2.单循环链表头结点的创建
void InitNode(CircNode*head)
{head=(CircNode*)malloc(sizeof(CircNode));
head->next=head;//单循环链表的构建;
}
3.单循环链表节点的创建
void CreatNode(CircNode*head,int n)
{int i=0;
CircNode*p=head;
for(i=1;i<=n;i++)
{CircNode*s=(CircNode*)malloc(sizeof(CircNode));
s->data=i;
s->next=head;
p->next=s;
p=s;
}
}
5.遍历该链表节点
void PrintNode(CircNode*head)
{CircNode*p=head->next;
while(p!=head)
{
printf("%d ",p->data);
p=p->next;
}
}
6.约瑟夫环的实现
void Josephus(CircNode*head,int s,int m,int n)
{CircNode* p=head->next,*pr=head;//n 为总人数;s为从第几个开始报数;
//m为报数的长度;
int i,j;
for(i=1;i<s;i++)//找到开始报数的人
{
p=p->next;
}
printf("%d\n",p->data);
for(i=0;i<n;i++)
{for(j=1;j<m;j++)
{pr=p;
p=p->next;
if(p==head)
{pr=p;
p=p->next;
}}
printf("%d ",p->data);
pr->next=p->next;
free(p);
p=pr->next;
}
}
其中n为总人数,s为从第几个人开始报数,m为报数的长度,数过m-1后,让第m个链表删除
7.程序代码
#include <stdio.h>
#include <stdlib.h>
typedef struct stu
{
int data;
struct stu *next;
}CircNode,*CircList;
void InitNode(CircNode*head)
{head=(CircNode*)malloc(sizeof(CircNode));
head->next=head;//单循环链表的构建;
}
void CreatNode(CircNode*head,int n)
{int i=0;
CircNode*p=head;
for(i=1;i<=n;i++)
{CircNode*s=(CircNode*)malloc(sizeof(CircNode));
s->data=i;
s->next=head;
p->next=s;
p=s;
}
}
void PrintNode(CircNode*head)
{CircNode*p=head->next;
while(p!=head)
{
printf("%d ",p->data);
p=p->next;
}
}
void Josephus(CircNode*head,int s,int m,int n)
{CircNode* p=head->next,*pr=head;//n 为总人数;s为从第几个开始报数;
//m为报数的长度;
int i,j;
for(i=1;i<s;i++)//找到开始报数的人
{
p=p->next;
}
printf("%d\n",p->data);
for(i=0;i<n;i++)
{for(j=1;j<m;j++)
{pr=p;
p=p->next;
if(p==head)
{pr=p;
p=p->next;
}}
printf("%d ",p->data);
pr->next=p->next;
free(p);
p=pr->next;
}
}
int main() {
int m,s,n;
printf("请输入人数n=");
scanf("%d",&n);
CircNode head;
InitNode(&head);
CreatNode(&head,n);
PrintNode(&head);
printf("\n请输入从第几个开始s=");
scanf("%d",&s);
printf("请输入出局编号m=");
scanf("%d",&m);
Josephus(&head,s,m,n);
return 0;
}