数据结构实验一
##约瑟夫环(C语言实现循环单链表)
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct List{
int data;
struct List *next;
}list;
list *CreateList(int n){//创建单循环链表
int i;
list *temp,*head;
head = (list*)malloc(sizeof(list));
head->data=1;//第一个人
head->next=NULL;
temp=head;
for(i =2;i <=n;i++){
list *s=(list*)malloc(sizeof(list));
s->data=i;
s->next=NULL;
temp->next=s;
temp=temp->next;
}
temp->next=head;//首尾相连
return head;
}
void findAndDelete(list * head,int s,int m){//查找并删除
list *tail = head;//找到链表第一个节点的上一个节点,为删除操作做准备
list *p = head;
while(tail->next != head)
{
tail = tail->next;
}
while(p->data != s){//找到第s个人
tail = p;
p=p->next;
}
//从第k个人开始,只有当p-next==p时,说明链表中除了p节点外都出去了
while(p->next != p){
int i;
for(i=1;i<m;i++){//找到p后第m个人
tail = p;
p=p->next;
}
tail->next = p->next;//删除p节点
printf("%d ",p->data);
free(p);
p = tail->next;
}
//最后只剩一个人
printf("%d",p->data);
free(p);
}
int main(){
int n,s,m,i;
list *head;
printf("请分别输入圆桌上的人数n,从第s人开始报数,报到数字m的人出列:");
scanf("%d,%d,%d",&n,&s,&m);//n个人,从第s个人开始报数,数到第m个人出列
//s+m-1出列,输出出队顺序
//1.创建由n个节点组成的不带头结点的单循环链表
head = CreateList(n);
printf("约瑟夫出队列顺序:");
//2.找循环链表中的第s个结点
//3.求第m个应出列的元素删除它
findAndDelete(head,s,m);
}