約瑟夫問題_順序表求解
阿新 • • 發佈:2018-12-11
#include "stdio.h" #include "stdlib.h" #define MAXSIZE 100 typedef struct node { int data[MAXSIZE]; int length; }SeqList,*PSeqList; //定義一個順序表 PSeqList Init_SeqList() //順序表初始化 { PSeqList PL=(PSeqList)malloc(sizeof(SeqList)); if(PL) { PL->length=0; return PL; } printf("creat error"); return NULL; } int Insert_SeqList(PSeqList PL,int i,int x) //順序表的插入,i為插入位置(陣列下標,從0開始,下同),x為插入數值 //-2 表不存在,-1 溢位,0 插入位置不合法 ,1插入成功 { int j; if(!PL) { printf("not exist"); return -2; } if(PL->length>=MAXSIZE) { printf("overflow"); return -1; } if(i<0||i>PL->length) { printf("insert illegal"); return 0; } for(j=PL->length-1;j>=i;j--) PL->data[j+1]=PL->data[j]; PL->data[i]=x; PL->length++; return 1; } int Delete_SeqList(PSeqList PL,int i) //順序表的刪除,i為刪除位置(陣列下標),返回-2 表不存在,0,刪除位置不合法,1刪除成功 { int j; if (!PL) { printf("not exist\n"); return -2; } if(i<0||i>PL->length-1) { printf("delete illegal \n"); return 0; } for(j=i;j<PL->length-1;j++) PL->data[j]=PL->data[j+1]; PL->length--; return 1; } int josephus_SeqList(PSeqList josephus_seq, int s, int m) //求解約瑟夫問題的出列元素序列入口引數:已經存放資料的順序表, //起始位置s,數m , 出口引數:1表示成功,0表示表中沒有元素 { int s1,w,i; if(!josephus_seq) { printf("not exist"); return 0; } s1=s; //陣列下標 printf("輸出約瑟夫序列:"); for(i=josephus_seq->length;i>0;i--) { s1=(s1+m-1)%i; w=josephus_seq->data[s1]; printf("%d\t",w); Delete_SeqList(josephus_seq,s1); } return 1; } void main() { int i; int s,m; PSeqList list; list=Init_SeqList(); printf("約瑟夫序列為:\n"); for(i=0;i<9;i++) //順序表賦值 { Insert_SeqList(list,i,i); printf("%d\t",list->data[i]); } printf("\n 請輸入開始計數對應陣列下標:\n"); //輸入計數位置(陣列下標)和技術步長 scanf("%d",&s); printf("請輸入計數步長:\n"); scanf("%d",&m); josephus_SeqList(list,s,m); printf("\n"); }