C語言程序設計-猴子選大王[鏈表應用]

2032 猴子選大王

Descriptionnode

有N只猴子,從1~N進行編號。它們按照編號的順時針方向排成一個圓圈,而後從第一隻猴子開始報數。第一隻猴子報的第一個數字爲1,之後每隻猴子報的數字都是它們前面猴子所報數字加1。若是一個猴子報的數字是M,則該猴子出列,下一個猴子從新從1開始報數,直到全部猴子都出列爲止,最後一個出列的猴子勝出。你的任務是對於給定猴子數量和報數上限值M,肯定出可以被選做大王的猴子的編號。測試

Inputspa

第一行爲一個整數N,表示測試數據的組數,接下來的N行中每行包含兩個整數,第一個數是猴子的個數,第二個數是報數上限值M(M>1),兩數之間由空格分隔。指針

Outputcode

輸出共N行,每行爲對應輸入行獲勝猴子的編號。blog

Sample Inputip

2get

8 5io

5 8class

Sample Output

3

1

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

/* 定義鏈表節點類型 */
typedef struct node
{
    int data;
    struct node *next;
}linklist;

int creat(int n, int m)
{
 linklist *head, *p, *s, *q;
 int i,  total;
 /* 建立循環鏈表,頭節點也存信息 */
    head = (linklist*) malloc(sizeof(linklist));
    p = head;
    p->data = 1;
    p->next = p;
    /* 初始化循環鏈表 */
    for (i = 2; i <= n; i++)
    {
        s = (linklist*) malloc(sizeof(linklist));
        s->data = i;
        s->next = p->next;
        p->next = s;
        p = p->next;
    }

    p = head;

    /* 保存節點總數 */
    total = n;

    q = head;
    /* 只剩一個節點時中止循環 */
    while (total != 1)
    {
        /* 報數過程,p指向要刪除的節點 */
        for (i = 1; i < m; i++)
        {
            p = p->next;
        }

        /* q 指向 p 節點的前驅 */
        while (q->next != p)
        {
            q = q->next;
        }
        /* 刪除 p 節點 */
        q->next = p->next;
        /* 保存被刪除節點指針 */
        s = p;
        /* p 指向被刪除節點的後繼 */
        p = p->next;
        /* 釋放被刪除的節點 */
        free(s);
        /* 節點個數減一 */
        total--;
    }
	//free(p);
    /* 打印最後剩下的節點序號 */
	int vsdata=p->data;
	free(p);
	return vsdata;

}
int  main()
{
    int  n[10], m[10];
    /* 讀入問題條件 */
    int k;

    scanf("%d", &k);

	for (int i=0;i<k;i++)
	{
		scanf("%d%d",&n[i],&m[i]);
	}
	for (int ii=0;ii<k;ii++)
	{
		 printf("%d\n",creat(n[ii],m[ii]));
	}

	return 0;
}

轉自:http://www.acmerblog.com/c-programing-2-2508/

相關文章
相關標籤/搜索