1. 程式人生 > >約瑟夫環問題(迴圈連結串列)

約瑟夫環問題(迴圈連結串列)

這是一道比較經典的迴圈連結串列問題,在華為上機筆試中也出現過。

約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。

#include<stdio.h> 
#include <stdlib.h>

typedef struct node//節點存放一個數據和指向下一個節點的指標
{
	int data;
	struct node* pnext;
} Node;

Node *link_create(int n)//建立n個節點的迴圈連結串列
{
	//先建立第1個節點
	Node *p,*q,*head;
	int i ;
	p = (Node *)malloc(sizeof(Node));
	head = p;
	p->data = 1;

	for(i = 2;i<=n;i++)//再建立剩餘節點
	{
		q = (Node *)malloc(sizeof(Node));
		q->data = i;
		p->pnext = q;
		p = q;
	}
	p->pnext = head;//最後一個節點指向頭部,形成迴圈連結串列
	return head;
}

void link_process(Node *head,int k,int m)//從編號為k(1<=k<=n)的人開始報數,數到m的那個人出列;
{
	int i;
	Node *p = head,*tmp1;
	while(p->data != k)//p指向的節點data為k
		p = p->pnext;
	
	while(p->pnext != p)
	{
		for(i=0;i<m;i++)
		{
			tmp1 = p;
			p = p->pnext;
		}
		printf("%d ",p->data);
		tmp1->pnext= p->pnext;
		free(p);
		p = tmp1->pnext;

	}
	printf("%d ",p->data);
	free(p);
}

int main()
{
	
	Node *head = link_create(5);	
	link_process(head,3,1);
	system("pause");
	return 0;
}