約瑟夫環 C語言 單迴圈鍊錶

2021-07-28 21:19:59 字數 1049 閱讀 4664

/*---------約瑟夫環---------*/

/*---------問題描述---------*/

/*編號為1,2,…,n的n個人圍坐一圈,每人持乙個密碼(正整數)。

一開始任選乙個正整數作為報數上限值m,

從第乙個人開始自1開始順序報數,報到m時停止。

報m的人出列,將他的密碼作為新的m值,從他的下乙個人開始重新從1報數,

如此下去,直至所有人全部出列為止。試設計乙個程式求出列順序。*/

/*---------問題分析---------*/

/*n個人圍坐一圈,且不斷有人出列,即頻繁刪除,應用單迴圈鍊錶。

有因為報數的過程是計數的過程,每個資料結點計1,因此不帶頭結點合適。

又因為第一次報數的上限是任選的正整數,有可能報到第乙個人時出列,為刪除第乙個結點,

須知其前驅結點的位置,即尾結點的位置,因此應設尾指標,不設頭指標*/

#include#includetypedef struct lnodelnode,*linklist;

void creatlist(linklist &l)

l=(linklist)malloc(sizeof(lnode)); //建立第乙個結點,輸入第乙個人的資訊

l->num=1;

printf("請輸入第1個人的密碼:");

scanf("%d",&l->key);

p=l;//p指向目前鍊錶的尾結點,之後新建結點均插入表尾

for(i=2;i<=n;i++)

p->next=l; //尾結點的next指向表首結點,構成迴圈鍊錶

l=p; //l指向尾結點,即鍊錶為設尾指標的鍊錶

}void joseph(linklist &l)

q=p->next;

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

p->next=q->next;

key=q->key;

free(q);

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

}int main()

約瑟夫環問題(單迴圈鍊錶實現)

大致思路 1.利用尾插法建立乙個迴圈鍊錶 建表成功後刪除頭結點 2.核心演算法 生成乙個work指標,每走到約定的step 1的位置時停止,利用pdel指標標記後繼結點,迴圈釋放pdel,直到work work next停止 include include include using namespa...

單迴圈鍊錶 C語言

include include typedef int elemtype typedef int status typedef struct node listnode typedef listnode linklist 初始化單向迴圈鍊錶 void initlist linklist l 判斷單向...

c語言單迴圈鍊錶

ifndef sclist h define sclist h include include include define elemtype int typedef struct node node,pnode typedef struct list list node buynode elemt...