1. 程式人生 > >約瑟夫環-順序表實現

約瑟夫環-順序表實現

題目: 約瑟夫環的一種描述為 編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。 一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。 報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直到所有人全部出列為止。

測試資料: n=7,7個人的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序應為6,1,4,7,2,3,5,) n=9,9個人的密碼依次為:4,3,7,1,5,6,3,8,2,首先m值為4(正確的出列順序應為4,5,1,7,2,8,3,6,9,)

編譯環境:VC 6.0

typedef struct
{
    int *elem;
    int length;
    int listsize;
}Sqlist;
int initList(Sqlist &list)
{
    list.elem=new int[MAXSIZE];
    if(!list.elem)
        exit(OVERFLOW);
    list.length=0;
    list.listsize=MAXSIZE;
    return OK;
}
int ListInsert(Sqlist &list,int i,int
num) { int *newbase; if(i<1)return ERROR; if(list.length==list.listsize)//即將超越陣列大小時重新動態分配陣列大小 { newbase=(int*)realloc(list.elem,(list.listsize+listIncrement)*sizeof(int)); if(!newbase) exit(OVERFLOW); list.elem=newbase; list.listsize+=listIncrement; } list
.elem[i-1]=num; ++list.length; return OK; } int locateElem(Sqlist list) { int outNum=0,shunxu=0; while(outNum<list.length) { if(list.elem[(shunxu+list.length)%list.length]!=0) sx++; if(sx==m) { m=list.elem[(shunxu+list.length)%list.length]; list.elem[(shunxu+list.length)%list.length]=0; printf("%d,",(shunxu+list.length)%list.length+1); sx=0; outNum++; } shunxu++; } return 0; } void printList(Sqlist list)/*用於測試資料是否儲存入順序表*/ { for(int k=0;k<list.length;k++) printf("%d ",list.elem[k]); } int main() { Sqlist list1; int flag; int num,count=0; flag=initList(list1); printf("請輸入若干密碼,並以%d結束:",num_stop); scanf("%d",&num); count++; if(num==num_stop) printf("出列人數為0!"); else { while(num!=-1) { flag=ListInsert(list1,count,num); scanf("%d",&num); count++; } do{ printf("請輸入m值:"); scanf("%d",&m); }while(m<=0); //printList(list1);printf("\n"); printf("出列順序為:"); flag=locateElem(list1); } printf("\n"); return 0; }