約瑟夫環問題(迴圈連結串列)
阿新 • • 發佈:2019-01-10
這是一道比較經典的迴圈連結串列問題,在華為上機筆試中也出現過。
約瑟夫環是一個數學的應用問題:已知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; }