#include
创新互联专注于船山网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供船山营销型网站建设,船山网站制作、船山网页设计、船山网站官网定制、重庆小程序开发服务,打造船山网络公司原创品牌,更为您提供船山网站排名全网营销落地服务。
#include
#define N 10
typedef struct node{
int data;
struct node * next;
}ElemSN;
ElemSN*Createlink(int a[],int n){
int i;
ElemSN*h=NULL,*p,*t;
for(i=0;i
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
if(!h)
h=t=p;
else
p->next=h;
t=t->next=p;
}
return t;
}//创建单向循环链表
ElemSN*Fun(ElemSN*t,int s){
int i;
ElemSN*h2=NULL,*t1,*h; //t1是行链表的尾结点指针,h是建立新链表的结点(出约瑟夫环的结点),h2新链表的头结点
while(t-t->next){//截止条件是环中只剩下一个结点,循环结束直接出环
for(i=0;i
t=t->next; //每隔几个结点出环S,指针t的下一个加点就是要出环的结点
h=t->next; //h表示要出环的结点
t->next=h->next;//出环
h->next=NULL;//指针域为空断链,出环的结点和约瑟夫环没有联系
if(!h2)//新链表为空时,头结点h2,尾结点t1,在同一个结点上
h2=t1=h;
else//新链表头结点不空,出环的结点h挂在新链表的尾结点上,尾结点t1后移,继续标志链表的尾结点
t1=t1->next=h;
}
if(!h2)//环中只剩下一个结点,直接出环,判断新链表为空,说明约瑟夫环中只有一个结点
h2=t;//环中的结点直接为新链表的头结点
else{
t1->next=t; //新链表头结点不空,出环的结点直接挂到新链表的尾结点上,
t->next=NULL;//指针域为空,否则新链表中有为结点的next是自己,在尾结点上出现一个环(循环)
}
return h2;
}
void Printlink(ElemSN*h){
ElemSN*p;
for(p=h;p;p=p->next)
printf("%2d\n",p->data);
}
int main(void){
int a[N]={1,2,3,4,5,6,7,8,9,10};
int s;
ElemSN*head;
head=Createlink(a,9);
printf("请输入s=");
scanf("%2d",&s);
head=Fun(head,s);
Printlink(head);
}