鏈表實現約瑟夫環


前幾天考網管的時候用到了數據結構課本,想當年那么頭疼的一本書,現在突然覺得挺有意思的,就想回過頭來看看。今天周六,上午無聊的在實驗室待着,下午來的時候拿起了數據結構的課本。第一章鏈表中有一個很著名的約瑟夫環的問題,想當年也是老師留的題目之一,當時這一塊有好多問題,包括結構體的定義,包括malloc函數的使用,包括鏈表的構造和實現。下午就重新對這一塊進行了學習。

約瑟夫問題的一種描述是:編號為12nn個人按順時針方向圍坐一圈,每人持一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計一個程序求出出列順序。 基本要求 利用單向循環鏈表存儲結構模擬此過程,按照出列的順序印出各人的編號。 測試數據 M的初值為20n=77各人的密碼依次為3172484。

主要用到的知識:線性表的鏈式表示,單向循環表。

下面是我的代碼:

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

typedef struct Lnode{
int code;
struct Lnode *next;
int number;
}Lnode,*LinkList;//先定義結構體鏈表,每個結構體存儲密碼和下一個人的指針,定義一個結構體變量和指針變量


//創建7個人的鏈表


LinkList InitLinkList(int number)
{
int n;

LinkList L,p,header;

header=(LinkList)malloc(sizeof(Lnode));//用來保存第一個人的指針




L=(LinkList)malloc(sizeof(Lnode));//保存頭結點




for(int i=0;i<number;i++)
{
p=(LinkList)malloc(sizeof(Lnode));
printf("請輸入密碼");
scanf("%d",&n);
p->code=n;
p->number=i+1;
L->next=p;
L=p;
if(i==0)
header=L;//此時header指向第一個人

}
//結束之后將最后一個指針指向第一個人
L->next=header;

return header;

}



int main()
{
int number,m,a;
LinkList header;

printf("請輸入人數");

scanf("%d",&number);
printf("請輸入初始密碼");
scanf("%d",&m);
header=InitLinkList(number);



while(number>0)
{
a=m%number;
if(a<2)
a=a+number;

for(int i=0;i<a-2;i++)
{

header=header->next;


}

printf("%d",header->next->number);//header對應的下一個節點就是要刪除的節點

m=header->next->code;//將這個節點對應的密碼置為m


header->next=header->next->next;//

header=header->next;


number--;


}

return 0;

}
現在寫這個程序基本沒什么難度了,當初也是費了很大功夫也沒搞定。想想有些曾經以為很難的事情,再回過頭去做好像也不是很難了。今天非常巧合的遇到了本科舍友大黃同學,聽他說本科學了四年的游泳也沒學好,反倒是最近重新去學,感覺也不是那么難了。不僅學習,生活也是這樣,所以遇到事情,不要急,說不定在將來的某一天,你就找到了解決的辦法了。



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com