C語言(順序表)實現約瑟夫問題

約瑟夫問題是個有名的問題: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);
}

希望能幫助到各位瀏覽者

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章