約瑟夫問題是個有名的問題:N個人圍成一圈,從第一個開始報數,第M個將被殺掉,最後剩下一個,其餘人都將被殺掉。例如N=6,M=5,被殺掉的順序是:5,4,6,2,3,1。
環境:DEV C++
下面我們用順序表實現約瑟夫問題,結果圖如下:
用順序表實現約瑟夫問題,完整代碼如下:
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 30
struct SqList
{
int Data[Maxsize];
int length;
};
typedef struct SqList SqList;
void InitList(SqList *&L)
{
L = (SqList *)malloc(sizeof(SqList));
L->length = 0;
}
void CreateList(SqList *&L)
{
int i;
int people;
printf("請輸入隊列總人數:\n");
scanf("%d",&people);
printf("\n");
printf("隊列序號是:\n");
for (i=0; i<people; i++)
{
L->Data[i] = i + 1;
printf("%d ", L->Data[i]);
}
printf("\n");
L->length = people;
}
void DisplayList(SqList *L)
{
int m, i, j;
int k=0;
printf("\n");
printf("請輸入第幾個報數的人出列: \n");
scanf("%d", &m);
printf("\n");
printf("出列次序依次是:\n");
for (i=L->length; i>0; i--)
{
k=(k+m-1)%i;
printf("%d ",L->Data[k]);
for (j=k;j<i-1; j++)
{
L->Data[j] = L->Data[j+1];
}
L->length = L->length - 1;
}
printf("\n");
}
int main()
{
SqList *L;
InitList(L);
CreateList(L);
DisplayList(L);
}
用循環單鏈表實現的約瑟夫問題:
#include<stdio.h>
#include<malloc.h>
struct Node
{
int data;
struct Node *next;
};//建立一個結點結構體
int main()
{
struct Node *head, *s, *q, *t;
int n, m, count=0, i;
printf("輸入總人數 m:\n");
scanf("%d",&m);
printf("\n");
printf("輸入報到第幾個出列 n:\n");
scanf("%d",&n);
for(i=0; i<m; i++)
{
s=(struct Node *)malloc(sizeof(struct Node));
s->data=i+1;
s->next=NULL;
if(i==0)
{
head=s;
q=head;
}
else
{
q->next=s;
q=q->next;
}
}//建立一個不帶頭結點的單鏈表
q->next=head;//將單鏈表組成環狀,形成循環單鏈表
printf("\n");
printf("之前的序列爲:\n");
q=head;
while(q->next!=head)
{
printf("%d ",q->data);
q=q->next;
}//依次輸出結點的值
printf("%d ",q->data);
q=head;
printf("\n");
printf("\n");
printf("依次出列的順序是:\n");
do {
count++;//計數器開始計數
if(count==n-1)
{
t=q->next;
q->next=t->next;//到n前面那個節點停止,然後刪除第n個節點
count=0;//計數器復位
printf("%d ", t->data);//輸出被淘汰的號碼
free(t);//釋放內存,防止內存泄露
}
q=q->next;
}
while(q->next!=q);
printf("\n");
printf("\n");
printf("最後剩下的人是: %d ",q->data);
}
希望能幫助到各位瀏覽者