資源描述:
《數(shù)據(jù)結(jié)構(gòu)約瑟夫環(huán)實驗報告》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、《數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計》約瑟夫環(huán)實驗報告——實驗一專業(yè):物聯(lián)網(wǎng)工程班級:物聯(lián)網(wǎng)1班學(xué)號:15180118姓名:劉沛航一、實驗?zāi)康?、熟悉VC環(huán)境,學(xué)習(xí)使用C語言利用鏈表的存儲結(jié)構(gòu)解決實際的問題。2、在編程、上機(jī)調(diào)試的過程中,加深對線性鏈表這種數(shù)據(jù)結(jié)構(gòu)的基本概念理解。3、鍛煉較強的思維和動手能力和更加了解編程思想和編程技巧。二、實驗內(nèi)容1、采用單向環(huán)表實現(xiàn)約瑟夫環(huán)。請按以下要求編程實現(xiàn):①從鍵盤輸入整數(shù)m,通過create函數(shù)生成一個具有m個結(jié)點的單向環(huán)表。環(huán)表中的結(jié)點編號依次為1,2,……,m。②從鍵盤輸入整數(shù)s(1<=s<=m)和n,從環(huán)表的第s個結(jié)點開始計數(shù)為1,當(dāng)計數(shù)到第n個結(jié)點時,
2、輸出該第n結(jié)點對應(yīng)的編號,將該結(jié)點從環(huán)表中消除,從輸出結(jié)點的下一個結(jié)點開始重新計數(shù)到n,這樣,不斷進(jìn)行計數(shù),不斷進(jìn)行輸出,直到輸出了這個環(huán)表的全部結(jié)點為止。例如,m=10,s=3,n=4。則輸出序列為:6,10,4,9,5,2,1,3,8,7。三、程序設(shè)計1、概要設(shè)計為了解決約瑟夫環(huán)的問題,我們可以建立單向環(huán)表來存儲每個人的信息(該人的編號以及其下一個人的編號),及結(jié)點,人后通過查找每個結(jié)點,完成相應(yīng)的操作來解決約瑟夫問題。(1)抽象數(shù)據(jù)類型定義ADTJoh{數(shù)據(jù)對象:D=數(shù)據(jù)關(guān)系:R1=基本操作:create(&J,n)操作結(jié)果:構(gòu)造一個有n個結(jié)點的單向環(huán)表J。show(J)初始條件:
3、單向環(huán)表J已存在。操作結(jié)果:按順序在屏幕上輸出J的數(shù)據(jù)元素。calculate(J,s,n)初始條件:單向環(huán)表J已存在,s>0,n>0,s<環(huán)表結(jié)點數(shù)。操作結(jié)果:返回約瑟夫環(huán)的計算結(jié)果。}ADTJoh(2)宏定義#defineNULL0#defineOK1#defineERROR-1(3)主程序流程開始輸入數(shù)據(jù)(m,s,n)創(chuàng)建環(huán)表輸出建立好的環(huán)表計算處理輸出結(jié)果結(jié)束(4)模塊調(diào)用關(guān)系程序分為下述模塊:1)主函數(shù)模塊——執(zhí)行輸入調(diào)用其他的功能函數(shù)2)創(chuàng)建環(huán)表模塊——創(chuàng)建單向環(huán)表3)計算處理模塊——計算出要出列的標(biāo)號并輸出4)顯示模塊——輸出建立好的環(huán)表調(diào)用關(guān)系如下:主函數(shù)模塊創(chuàng)建環(huán)表模塊
4、顯示模塊計算處理模塊2、詳細(xì)設(shè)計(1)數(shù)據(jù)類型設(shè)計typedefintElemType;//元素類型typedefstruct{ElemTypedata;structJoh*next;}Joh,*LinkList,*p;//結(jié)點類型,指針類型(2)操作算法Statuscreate(LinkList&J,intn){//創(chuàng)建一個有n個結(jié)點的單向環(huán)表if(n<=0)returnERROR;//n<0錯誤J=(LinkList)malloc(sizeof(J));J->data=1;J->next=J;//建立第一個結(jié)點for(inti=n;i>1;--i){p=(LinkList)mallo
5、c(sizeof(J));p->data=i;p->next=J->next;J->next=p;//插入到表頭}returnOK;}//createvoidshow(LinkListJ){//主要的操作函數(shù)//順序輸出環(huán)表J的結(jié)點p=J;printf("%d",p->data);p=p->next;while(p!=J){//循環(huán)終止條件printf("%d",p->data);p=p->next;}}//showvoidcalculate(LinkListJ,ints,intn){p=J;Joh*head=p;//聲明結(jié)點while(p->data!=s){p=p->next;hea
6、d=p;}//尋找起始結(jié)點while(p->next!=p){//終止條件for(inti=0;inext;}printf("%d",p->data);head->next=p->next;//刪除已輸出結(jié)點p=head->next;}if(n!=1)printf("%d",p->data);elseprintf("");}//calculate(3)主函數(shù)代碼intmain(){//主函數(shù)Joh*J;intm,s,n;printf("Thenumofnodeis:");scanf("%d",&m);create(J,m
7、);//創(chuàng)建單向環(huán)表Jshow(J);//輸出J的數(shù)據(jù)printf("");printf("Thefirstnodewhichyouwantis:");scanf("%d",&s);printf("Theinternalwhichyouwantis:");scanf("%d",&n);calculate(J,s,n);//計算并輸出結(jié)果return0;}//main四、程序調(diào)試分析1、細(xì)節(jié)決定成敗,編程最需要的是嚴(yán)謹(jǐn),如何的嚴(yán)謹(jǐn)