1. 程式人生 > >單循環鏈表 解決約瑟夫環的問題

單循環鏈表 解決約瑟夫環的問題

malloc 表示 重復 printf 約瑟夫 ext std head eof

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

#include<stdio.h>
#include<malloc.h>
typedef struct node{
int num;
struct node* next;
}Node;

Node *creat(int n){
Node *p,*q,*head;
p=(Node *)malloc(sizeof(Node));
head = p;
p->num = 1;
for(int i=2;i<=n;i++){
q=(Node *)malloc(sizeof(Node));
q->num = i;
p->next = q;
p = q;
}

p->next = head; //最後一個節點的指針指向頭指針,形成循環

return head;
}

void link_process(Node *head,int k,int m){
Node *p =head,*temp;
while(p->num!=k) //使當前指針移動到k的位置
p=p->next;

while(p->next!=p) //p->next == p 時表明這個鏈表中只剩下一個節點了,結束循環
{
for(int i=1;i<m;i++){
temp = p;
p=p->next;
}
printf("%d",p->num);

temp->next = p->next;
free(p);
p=temp->next;
}

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

int main(){

int n,m,k;
scanf("%d%d%d",&n,&k,&m);

Node *head = creat(n);

link_process(head,k,m);


return 0;

}

單循環鏈表 解決約瑟夫環的問題