約瑟夫問題_單項迴圈連結串列求解
阿新 • • 發佈:2018-12-11
#include "stdio.h" #include "stdlib.h" typedef struct node{ int data; struct node *next; }LNode,*LinkList; //建立一個不帶頭結點的單向迴圈連結串列 並且賦值 LinkList CreatCycleList(int num) { int i=1; LinkList head=NULL,q=NULL,p=NULL; head=(LinkList)malloc(sizeof(LNode)); head->data=0; head->next=NULL; p=head; while(i<num) { q=(LinkList)malloc(sizeof(LNode)); q->data=i; q->next=NULL; p->next=q; p=q; i++; } p->next=head; return head; } int josephus_LinkList (LinkList josephus_Link, int s, int m)//求約瑟夫問題的出列元素序列,入口引數:已經存放資料的連結串列頭指標的地址, //起始位置s,數m ,出口引數:1表示成功,0表示表中沒有元素 { LinkList p,pre; /*p指向當前結點,pre指向其前驅結點*/ int count; if(!josephus_Link) { printf("not exist"); return 0; } /*找第s個元素*/ p= josephus_Link; for(count=1;count<s;count++) /*查詢第s個結點,用p作為第s個結點的指標*/ p=p->next; printf("輸出約瑟夫序列:"); while ( p!=p->next) /*輸出 n-1個元素個結點*/ { for(count=1;count<m;count++) { pre=p; p=p->next; } printf("%d\t", p->data); pre->next=p->next; free(p); p=pre->next; } printf("%d\t",p->data); /*輸出最後一個元素個結點*/ free(p); return 1; } void Display(LinkList head) { LinkList p=head; printf("建立的迴圈連結串列為:\n"); while(p->next!=head) { printf("%d\t",p->data); p=p->next; } printf("%d\n",p->data); } void main() { int s,m; LinkList head=CreatCycleList(9); //建立一個長度為9的迴圈連結串列 Display(head); printf("請輸入起始位置的陣列下標(從0開始):\n"); scanf("%d",&s); printf("請輸入計數步長:\n"); scanf("%d",&m); josephus_LinkList(head,s,m); printf("\n"); }