1. 程式人生 > >joseph約瑟死亡遊戲-C語言迴圈連結串列的實現

joseph約瑟死亡遊戲-C語言迴圈連結串列的實現

先來看看程式執行的效果

 這個 死亡遊戲的大致規則就是:以上面的程式為例,先選7個人出來,再給七個人進行編號,選編號為六個人出來,然後順時針(逆時針)每個人開始報數,從1開始,一直數到20,數到20的那個人出局,然後繼續迴圈,直到最後一個人出局

typedef  struct  Lnode
{
    int data;
    struct  Lnode *next;
}joseph;

自定義結構體型別    joseph為結構體變數名

void  Create_List(joseph *L,int n)
{
    int i;
    joseph *p,*s;
    s=(joseph*)malloc(sizeof(joseph));
    s->data=1;
    p=s=L;
    for(i=2;i<=n;i++){
    	s=(joseph*)malloc(sizeof(joseph));
    	s->data=i;
    	p->next=s;
		p=s; 
	}
	p->next=L;
}

建立迴圈連結串列

void  Delete_List(joseph *p,joseph *q)
{
    q-> next= p-> next;
    free(p);
}

刪除節點(本質,釋放記憶體空間)

void josephus ( joseph *L, int s, int m)
{
    joseph *p,*q;
    int i;
    p=L;
    for(i=1;i<=s-1;i++)
	{
		p=p->next;
	}
	q=p->next;
	while(q->next!=p)
		q=q->next;
    while(p->next!=p)
    {
    	for(int j=1;j<m;j++)
    	{
    		q=p;
    		p=p->next;
		 } 
		 printf("%d,",p->data);
		 Delete_List(p,q);
		 p=q->next;
	}
	printf("%d,",p->data);//輸出最後一個節點
	printf("\n"); 
}

輸出結果

完整程式如下,大家可以拿去玩玩

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

typedef  struct  Lnode
{
    int data;
    struct  Lnode *next;
}joseph;

void  Create_List(joseph *L,int n)
{
    int i;
    joseph *p,*s;
    s=(joseph*)malloc(sizeof(joseph));
    s->data=1;
    p=s=L;
    for(i=2;i<=n;i++){
    	s=(joseph*)malloc(sizeof(joseph));
    	s->data=i;
    	p->next=s;
		p=s; 
	}
	p->next=L;
}

void  Delete_List(joseph *p,joseph *q)
{
    q-> next= p-> next;
    free(p);
}


void josephus ( joseph *L, int s, int m)
{
    joseph *p,*q;
    int i;
    p=L;
    for(i=1;i<=s-1;i++)
	{
		p=p->next;
	}
	q=p->next;
	while(q->next!=p)
		q=q->next;
    while(p->next!=p)
    {
    	for(int j=1;j<m;j++)
    	{
    		q=p;
    		p=p->next;
		 } 
		 printf("%d,",p->data);
		 Delete_List(p,q);
		 p=q->next;
	}
	printf("%d,",p->data);//輸出最後一個節點
	printf("\n"); 
}


int  main()
{
    joseph *L=NULL;
    int m,n,s;
    L=(joseph*)malloc(sizeof(joseph));
    L->data=1;
    printf ("請輸入人數、約定編號數,出列值:\n");
    scanf ("%d%d%d", &n, &s, &m);
    if ((m> 1000) || (n> 1000))
        printf ("輸入的人數m,n不合法\n");
    else
        if (s>n) printf ("輸入資料不合法!\n");
        else
        {
            Create_List(L, n);
            printf ("\n");
            josephus(L,s,m);
        }
        getch();
        return 0;
}