版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 《數(shù)據(jù)結(jié)構(gòu)》</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 2011年12月18日</p><p> 目 錄</p><p> 1 課程設(shè)計(jì)的目的………………………………………………………………2</p>
2、<p> 2 需求分析………………………………………………………………………2</p><p> 3 課程設(shè)計(jì)報(bào)告內(nèi)容……………………………………………………………3</p><p> 1、概要設(shè)計(jì)……………………………………………………………………3</p><p> 2、詳細(xì)設(shè)計(jì)……………………………………………………………………3<
3、;/p><p> 3、調(diào)試分析……………………………………………………………………x</p><p> 4、用戶手冊(cè)……………………………………………………………………x</p><p> 5、測(cè)試結(jié)果……………………………………………………………………6</p><p> 6、程序清單……………………………………………………………………
4、7</p><p> 4 小結(jié) …………………………………………………………………………10</p><p><b> 課程設(shè)計(jì)的目的</b></p><p> 熟練使用C++編寫程序,解決實(shí)際問(wèn)題;</p><p> 了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,具備初步的獨(dú)立分析和設(shè)計(jì)能力;</p>&
5、lt;p> 初步掌握軟件開(kāi)發(fā)過(guò)程的問(wèn)題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能;</p><p> 提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問(wèn)題的能力;</p><p><b> 需求分析</b></p><p><b> 1、問(wèn)題描述:</b></p><p> 編號(hào)是
6、1,2,……,n的n個(gè)人按照順時(shí)針?lè)较驀蝗?,每個(gè)人只有一個(gè)密碼(正整數(shù))。一開(kāi)始任選一個(gè)正整數(shù)作為報(bào)數(shù)上限值m,從第一個(gè)仍開(kāi)始順時(shí)針?lè)较蜃?開(kāi)始順序報(bào)數(shù),報(bào)到m時(shí)停止報(bào)數(shù)。報(bào)m的人出列,將他的密碼作為新的m值,從他在順時(shí)針?lè)较虻南乱粋€(gè)人開(kāi)始重新從1報(bào)數(shù),如此下去,直到所有人全部出列為止。設(shè)計(jì)一個(gè)程序來(lái)求出出列順序。</p><p><b> 2、要求:</b></p>&
7、lt;p> 利用不帶表頭結(jié)點(diǎn)的單向循環(huán)鏈表存儲(chǔ)結(jié)構(gòu)模擬此過(guò)程,按照出列的順序輸出各個(gè)人的編號(hào)。</p><p><b> 3、測(cè)試數(shù)據(jù):</b></p><p> m的初值為20,n=7 ,7個(gè)人的密碼依次為3,1,7,2,4,7,4,首先m=6,則正確的輸出是什么?</p><p> 輸出形式:建立一個(gè)輸出函數(shù),將正確的輸出序列
8、</p><p> 3、課程設(shè)計(jì)報(bào)告內(nèi)容</p><p><b> 概要設(shè)計(jì):</b></p><p> 在理解了題目后,我先想到的是我們所學(xué)的單鏈表,利用單鏈表先建立循環(huán)鏈表進(jìn)行存貯,建立完循環(huán)鏈表后,我將所要編寫的函數(shù)分為了兩塊,一塊是經(jīng)過(guò)學(xué)過(guò)的單鏈表改編的循環(huán)鏈表的基本操作函數(shù),還有一塊是運(yùn)行約瑟夫環(huán)的函數(shù)。</p>
9、<p><b> 詳細(xì)設(shè)計(jì):</b></p><p> 我先建立一個(gè)結(jié)構(gòu)體,與單鏈表一樣,只是多了一個(gè)存密碼的code域</p><p> struct LinkNode</p><p><b> {</b></p><p> int data; //順序</p>
10、<p> int code; //密碼</p><p> LinkNode *next; </p><p><b> };</b></p><p> 建立一個(gè)類LinkList ,包含的函數(shù):</p><p> LinkList(); //構(gòu)造函數(shù)</p><
11、p> void Creat(const int ); //創(chuàng)建循環(huán)鏈表</p><p> int Delete(LinkNode* ); //刪除報(bào)到數(shù)的結(jié)點(diǎn)</p><p> int Joseph(int ); // 約瑟夫環(huán)</p><p><b> 私有成員是</b></p><p
12、> LinkNode* head; //指向第一個(gè)結(jié)點(diǎn)的指針</p><p> LinkNode* elem; // 同上</p><p> int len; //長(zhǎng)度</p><p> 我定義了一個(gè)elem指針是為了約瑟夫環(huán)里運(yùn)行方便,elem只在約瑟夫環(huán)這個(gè)函數(shù)里用到,其他函數(shù)沒(méi)有特別大的用處。</p><p&
13、gt; 構(gòu)造函數(shù)與書(shū)上的沒(méi)什么大差別,創(chuàng)建循環(huán)鏈表時(shí),要考慮幾個(gè)問(wèn)題,一個(gè)是題目要求是不帶頭結(jié)點(diǎn),所以head指針直接指向了第一個(gè)結(jié)點(diǎn),我在創(chuàng)建鏈表時(shí)把第一個(gè)結(jié)點(diǎn)初始化data為1,表明這個(gè)結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn)。具體如下:</p><p> void LinkList::Creat(const int number) //number為結(jié)點(diǎn)個(gè)數(shù),也就是參與的人數(shù)</p><p>
14、<b> { </b></p><p> if(number==1) //只有一個(gè)人的情況</p><p><b> {</b></p><p> head=elem=new LinkNode; </p><p> head->data=1; </p
15、><p> cout<<"請(qǐng)輸入密碼:"<<endl;</p><p> cin>>head->code;</p><p> head->next=head;</p><p><b> }</b></p><p><b&
16、gt; else</b></p><p><b> {</b></p><p> head=elem=new LinkNode;</p><p> head->data=1; </p><p> cout<<"請(qǐng)依次輸入各個(gè)密碼:"<<end
17、l;</p><p> cin>>head->code;</p><p> LinkNode*q=head;</p><p><b> q=head;</b></p><p> for(int i=1;i<number;i++) //將每個(gè)結(jié)點(diǎn)鏈接上,在鏈接時(shí)填入密碼</p>
18、;<p><b> {</b></p><p> LinkNode*p=new LinkNode;</p><p> p->data=i+1; </p><p> cin>>p->code;</p><p> q->next=p;</p><
19、;p><b> q=p;</b></p><p><b> }</b></p><p> q->next=head; //構(gòu)成循環(huán)鏈表</p><p><b> }</b></p><p> len=number;</p><p
20、><b> }</b></p><p> 在構(gòu)建約瑟夫環(huán)的執(zhí)行函數(shù)時(shí),我首先考慮了遞歸調(diào)用的函數(shù),原本的這個(gè)程序的所有的都定為elemtype類型的,雖然編譯沒(méi)出錯(cuò),但是在連接時(shí)發(fā)生了錯(cuò)誤,在老師的指導(dǎo)下改成了具體的int型。</p><p> int LinkList::Joseph(int m)</p><p><b>
21、; {</b></p><p><b> if(len>1)</b></p><p><b> { </b></p><p> LinkNode *q;</p><p> if(m==1) //在初始報(bào)數(shù)為1的情況下</p><p><
22、b> {</b></p><p><b> q=elem;</b></p><p> int a=q->code; //將選中的結(jié)點(diǎn)的密碼記錄在a中</p><p> elem=elem->next;</p><p> cout<<Delete(q)<<
23、endl; //Delete函數(shù)是為了將已經(jīng)報(bào)過(guò)數(shù)的人刪除Joseph(a); //用已經(jīng)刪除的結(jié)點(diǎn)的存的密碼作為下一次循環(huán)的報(bào)數(shù)值</p><p><b> }</b></p><p> else //一般情況下</p><p><b> {</b></p><p>
24、for(int i=1;i<m;i++)</p><p> elem=elem->next; //找到需要出列的結(jié)點(diǎn)</p><p><b> q=elem;</b></p><p> elem=elem->next; //此處的elem指針指向要?jiǎng)h除的結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn),下次遞歸調(diào)用時(shí)從這里開(kāi)始向下循環(huán)報(bào)數(shù)</
25、p><p> int a=q->code;</p><p> cout<<Delete(q)<<endl;</p><p> Joseph(a);</p><p><b> }</b></p><p><b> }</b></p>
26、;<p> else //在只有一個(gè)結(jié)點(diǎn)的情況下</p><p> cout<<head->data;</p><p><b> }</b></p><p> 最后還有一個(gè)Delete函數(shù),在刪除結(jié)點(diǎn)的時(shí)候要考慮幾個(gè)特殊情況,頭尾結(jié)點(diǎn)。刪除第一個(gè)結(jié)點(diǎn)時(shí),需要將head指針下移,尾結(jié)點(diǎn)的next也要指向
27、第二個(gè)結(jié)點(diǎn);刪除尾結(jié)點(diǎn)時(shí),要將尾結(jié)點(diǎn)前的結(jié)點(diǎn)與第一個(gè)結(jié)點(diǎn)相連。在設(shè)計(jì)這個(gè)函數(shù)時(shí),我只考慮了當(dāng)len大于1的情況,在只剩下一個(gè)結(jié)點(diǎn)時(shí),不必要?jiǎng)h除,直接輸出data的值即可(在約瑟夫函數(shù)中有寫)。具體函數(shù)如下:</p><p> int LinkList::Delete(LinkNode *a) </p><p><b> {</b></p><
28、;p> if(len>1) //只考慮長(zhǎng)度大于1的情況</p><p><b> {</b></p><p> if(head==a)</p><p><b> {</b></p><p> int out=head->data;</p><p>
29、; LinkNode* q=head;</p><p> while(q->next!=head)</p><p><b> {</b></p><p> q=q->next;</p><p><b> }</b></p><p> q->nex
30、t=head->next;</p><p> head=head->next;</p><p><b> delete a;</b></p><p> len--; //用len記錄刪除后的循環(huán)鏈表的長(zhǎng)度</p><p> return out;</p><p><
31、b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> LinkNode* q=head;</p><p> int out=a->data;</p><p> while(q-
32、>next!=a)</p><p><b> {</b></p><p> q=q->next;</p><p><b> }</b></p><p> if(a->next=head) .//刪除的是尾結(jié)點(diǎn)時(shí)(不知道為什么我寫程序里總是編譯出現(xiàn)錯(cuò)誤)</p>
33、<p><b> {</b></p><p> q->next=head; //重新鏈接</p><p><b> delete a;</b></p><p><b> len--;</b></p><p> return out;</p
34、><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> q->next=a->next;</p><p><b> delete a;</b&g
35、t;</p><p><b> len--;</b></p><p> return out;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p&
36、gt;<p><b> }</b></p><p><b> 5、測(cè)試結(jié)果:</b></p><p><b> 6 程序清單:</b></p><p> #include <iostream.h></p><p> struct LinkNo
37、de</p><p><b> {</b></p><p><b> int data;</b></p><p><b> int code;</b></p><p> LinkNode *next;</p><p><b> };&
38、lt;/b></p><p> class LinkList</p><p><b> {</b></p><p><b> public:</b></p><p> LinkList(); </p><p> void Creat(const i
39、nt );</p><p> //~LinkList(); </p><p> int Delete(LinkNode* ); </p><p> int Joseph(int ); </p><p><b> private:</b></p><p> LinkNode
40、* head; </p><p> LinkNode* elem; </p><p> int len; </p><p><b> };</b></p><p> LinkList::LinkList() </p><p><b> {</b>&l
41、t;/p><p> head=elem=NULL;</p><p><b> len=0;</b></p><p><b> }</b></p><p> void LinkList::Creat(const int number) </p><p><b
42、> { </b></p><p> if(number==1)</p><p><b> {</b></p><p> head=elem=new LinkNode; </p><p> head->data=1; </p><p> cout&
43、lt;<"請(qǐng)輸入密碼:"<<endl;</p><p> cin>>head->code;</p><p> head->next=head;</p><p><b> }</b></p><p><b> else</b><
44、;/p><p><b> {</b></p><p> head=elem=new LinkNode;</p><p> head->data=1; </p><p> cout<<"請(qǐng)依次輸入各個(gè)密碼:"<<endl;</p><p>
45、; cin>>head->code;</p><p> LinkNode*q=head;</p><p><b> q=head;</b></p><p> for(int i=1;i<number;i++) </p><p><b> {</b></p&
46、gt;<p> LinkNode*p=new LinkNode;</p><p> p->data=i+1; </p><p> cin>>p->code;</p><p> q->next=p;</p><p><b> q=p;</b></p>
47、<p><b> }</b></p><p> q->next=head;</p><p><b> }</b></p><p> len=number;</p><p><b> }</b></p><p> int L
48、inkList::Delete(LinkNode *a) </p><p><b> {</b></p><p><b> if(len>1)</b></p><p><b> {</b></p><p> if(head==a)</p><
49、;p><b> {</b></p><p> int out=head->data;</p><p> LinkNode* q=head;</p><p> while(q->next!=head)</p><p><b> {</b></p><p&
50、gt; q=q->next;</p><p><b> }</b></p><p> q->next=head->next;</p><p> head=head->next;</p><p><b> delete a;</b></p><p&
51、gt;<b> len--;</b></p><p> return out;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> L
52、inkNode* q=head;</p><p> int out=a->data;</p><p> while(q->next!=a)</p><p><b> {</b></p><p> q=q->next;</p><p><b> }</b&
53、gt;</p><p> q->next=a->next;</p><p><b> delete a;</b></p><p><b> len--;</b></p><p> return out; </p><p><b> }<
54、;/b></p><p><b> }</b></p><p><b> }</b></p><p> int LinkList::Joseph(int m)</p><p><b> {</b></p><p><b> if
55、(len>1)</b></p><p><b> { </b></p><p> LinkNode *q;</p><p><b> if(m==1)</b></p><p><b> {</b></p><p><b&
56、gt; q=elem;</b></p><p> int a=q->code;</p><p> elem=elem->next;</p><p> cout<<Delete(q)<<endl;</p><p> Joseph(a);</p><p><b
57、> }</b></p><p><b> else</b></p><p><b> {</b></p><p> for(int i=1;i<m;i++)</p><p> elem=elem->next; </p><p><
58、b> q=elem;</b></p><p> elem=elem->next;</p><p> int a=q->code;</p><p> cout<<Delete(q)<<endl;</p><p> Joseph(a);</p><p><
59、;b> }</b></p><p><b> }</b></p><p><b> else</b></p><p> cout<<head->data;</p><p><b> }</b></p><p&g
60、t; int main()</p><p><b> {</b></p><p> int num,code;</p><p> cout<<"請(qǐng)輸入人數(shù): ";</p><p> cin>>num; </p><p> LinkList L
61、; </p><p> L.Creat(num);</p><p> cout<<"請(qǐng)輸入第一個(gè)上限數(shù): ";</p><p> cin>>code;</p><p> cout<<"出列順序:"<<endl;</p><p
62、> L.Joseph(code);</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 4、小結(jié)</b></p><p> 一、這次課程設(shè)計(jì)的心得體會(huì)通過(guò)實(shí)踐我的收獲如下:</p>
63、<p> 一開(kāi)始接觸數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)真的挺難的,好多都不會(huì),不是邏輯方面的問(wèn)題,而是不具備動(dòng)手能力,腦子里總有一團(tuán)火,比如對(duì)于這個(gè)題目,一開(kāi)始有很多的想法,想到了從邏輯上怎么實(shí)現(xiàn)他,要編寫哪些程序,但是一到需要編寫了就開(kāi)始為難了,可以說(shuō)是幾乎不知道從哪里入手,參考了書(shū)本里的程序,仿照他的結(jié)構(gòu)一步一步做下來(lái),現(xiàn)在對(duì)于單鏈表的各種操作已經(jīng)算是比較熟練了,讓我知道光有理論知識(shí)還遠(yuǎn)遠(yuǎn)不夠,需要多動(dòng)手,寫的多了自然就能手到擒來(lái)。<
64、;/p><p> 二、根據(jù)我在實(shí)習(xí)中遇到得問(wèn)題,我將在以后的學(xué)習(xí)過(guò)程中注意以下幾點(diǎn):</p><p> 1、認(rèn)真上好專業(yè)實(shí)驗(yàn)課,多在實(shí)踐中鍛煉自己。</p><p> 2、寫程序的過(guò)程中要考慮周到,嚴(yán)密。</p><p> 3、在做設(shè)計(jì)的時(shí)候要有信心,有耐心,切勿浮躁。</p><p> 4、認(rèn)真的學(xué)習(xí)課本知識(shí),
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 約瑟夫環(huán)課程設(shè)計(jì)報(bào)告
- 約瑟夫環(huán)課程設(shè)計(jì)報(bào)告
- 約瑟夫環(huán)-課程設(shè)計(jì)
- 約瑟夫環(huán)問(wèn)題課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(約瑟夫環(huán))
- 數(shù)據(jù)結(jié)構(gòu)--約瑟夫環(huán)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---約瑟夫環(huán)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--約瑟夫環(huán)
- 數(shù)據(jù)結(jié)構(gòu)約瑟夫環(huán)的課程設(shè)計(jì)報(bào)告
- sopc課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- mfc課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- javaweb課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- wed課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- plc課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- eda課程設(shè)計(jì)--eda課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 展示設(shè)計(jì)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 課程設(shè)計(jì)--約瑟夫環(huán)程序設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)_約瑟夫環(huán)_課程設(shè)計(jì)
- 數(shù)電課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
評(píng)論
0/150
提交評(píng)論