单向循环链表(约瑟夫环)

发布时间:2020-05-08 08:14:42 作者:闫宝通
来源:网络 阅读:1600

#include<stdio.h>

#include<stdlib.h>

#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<N;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<s-1;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);

}


推荐阅读:
  1. 约瑟夫环
  2. 单向循环链表

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

单向循环 链表 约瑟夫环

上一篇:hadoop单机及伪分布式

下一篇:VI(visual edit) 初体验

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》