#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); } 另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
本文名称:单向循环链表(约瑟夫环)-创新互联
URL链接:http://www.cdkjz.cn/article/ccdcii.html