joseph約瑟死亡遊戲-C語言迴圈連結串列的實現
阿新 • • 發佈:2018-12-20
先來看看程式執行的效果
這個 死亡遊戲的大致規則就是:以上面的程式為例,先選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; }