

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 課程名稱 數(shù)據(jù)結(jié)構(gòu) </p><p> 課題名稱 雙鏈表創(chuàng)建演示 </p><p> 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 班 級(jí) 計(jì)算機(jī)0703
2、 </p><p> 學(xué) 號(hào) </p><p> 姓 名 </p><p> 指導(dǎo)教師 </p><p> 2009 年 11 月 7 日</p><p> 課 程 設(shè) 計(jì) 任 務(wù) 書<
3、/p><p> 課程名稱 數(shù)據(jù)結(jié)構(gòu) </p><p> 課 題 雙鏈表創(chuàng)建演示</p><p> 專業(yè)班級(jí) </p><p> 學(xué)生姓名 張 理 </p><p> 學(xué) 號(hào) </p><p> 指導(dǎo)
4、老師 </p><p> 審 批 </p><p> 1設(shè)計(jì)內(nèi)容與設(shè)計(jì)要求</p><p><b> 1.1設(shè)計(jì)內(nèi)容</b></p><p> 1.1.1 算術(shù)24游戲演示</p><p> 由系統(tǒng)隨機(jī)生成4張撲克牌,用
5、戶利用撲克牌的數(shù)字及運(yùn)算符號(hào)“+”、“—”、“*”、“/”及括號(hào)“(”和“)”從鍵盤上輸入一個(gè)計(jì)算表達(dá)式,系統(tǒng)運(yùn)行后得出計(jì)算結(jié)果,如果結(jié)果等于24,則顯示“Congratulation!”,否則顯示“Incorrect!”</p><p> 設(shè)計(jì)思路:從鍵盤輸入中綴表達(dá)式,然后將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,利用后綴表達(dá)式求值。</p><p> 1.1.2 迷宮探索</p>
6、<p> 隨機(jī)生成一個(gè)迷宮圖,迷宮大小為N*N,N預(yù)定義為常數(shù),修改N的值可以改變迷宮的大小。用白色表示可走的路,藍(lán)色表示墻壁不可以通過(guò)。系統(tǒng)設(shè)計(jì)兩種運(yùn)行方式:一種是系統(tǒng)自動(dòng)探索(用遞歸方法實(shí)現(xiàn));另一種是由人工操作探索通路。</p><p> 設(shè)計(jì)思路:程序首先要考慮迷宮的表示,這是一個(gè)二維關(guān)系圖,所以可選擇二維數(shù)組來(lái)存儲(chǔ)。數(shù)組元素只有兩種值0和1,分別代表通路和墻壁。圖形的顯示可以根據(jù)數(shù)組元
7、素的值來(lái)確定。如果是人工探索,則依據(jù)按鍵來(lái)確定探索物的位置坐標(biāo),利用循環(huán)語(yǔ)句實(shí)現(xiàn)。如果是系統(tǒng)自動(dòng)探索,可采用遞歸算法實(shí)現(xiàn)。</p><p> 1.1.3 二叉樹遍歷演示</p><p> 演示遍歷二叉樹的過(guò)程,所以首先建立二叉樹,并用圖形顯示出樹的形狀。建立的過(guò)程是采用前序便利的方法來(lái)創(chuàng)建,設(shè)計(jì)兩種生成樹的方式:一種是系統(tǒng)隨機(jī)生成,另一種是人工輸入??紤]到屏幕界面的有限性,限定二叉樹不
8、超過(guò)5層,最多26個(gè)字符,輸入字符小數(shù)點(diǎn)“.”代表NULL。初始樹為某種顏色的結(jié)點(diǎn),三種情況的遍歷采用填充另外一種醒目的顏色,來(lái)表示當(dāng)前遍歷的結(jié)點(diǎn),同時(shí)顯示該結(jié)點(diǎn)的訪問(wèn)序號(hào)。同時(shí)在遍歷的過(guò)程中在遍歷圖形的下方顯示出遍歷序列。</p><p> 1.1.4 數(shù)組應(yīng)用</p><p> 按照行優(yōu)先順序?qū)⒂脩綦S機(jī)輸入的數(shù)據(jù)建成2維數(shù)組并以圖形方式逐步顯示出來(lái),然后再按照列優(yōu)先順序以圖形方式逐
9、步輸出相應(yīng)數(shù)組。</p><p> 1.1.5 拓?fù)渑判蜓菔?lt;/p><p> 演示拓?fù)渑判虻倪^(guò)程。按照有向圖給出的次序關(guān)系,將圖中頂點(diǎn)排成一個(gè)線性序列,對(duì)于有向圖中沒有限定次序關(guān)系的頂點(diǎn),則可以人為加上任意的次序關(guān)系。要求每輸出一個(gè)頂點(diǎn)后就演示從圖中刪去此頂點(diǎn)以及所有以它為尾的弧。</p><p> 1.1.6 圖的遍歷</p><p&g
10、t; 演示圖的深度優(yōu)先, 廣度優(yōu)先遍歷過(guò)程,并輸出原圖結(jié)構(gòu)及遍歷結(jié)果。要求圖的結(jié)點(diǎn)數(shù)不能少于6個(gè)??梢杂上到y(tǒng)隨機(jī)生成圖,也可以由用戶手動(dòng)輸入圖。報(bào)告中要寫出畫圖的思路;畫出圖的結(jié)構(gòu),有興趣的同學(xué)可以進(jìn)一步改進(jìn)圖的效果。</p><p> 1.1.7 八皇后問(wèn)題演示</p><p> 在8*8的棋盤上擺放8個(gè)皇后,使他們不在同一條對(duì)角線上和不在一行和列上。 解決8皇后時(shí),在
11、安放第i行皇后時(shí),需要在列的方向從1到n試探(j =1,…, n):首先在第j列安放一個(gè)皇后,如果在列、主對(duì)角線、次對(duì)角線方向有其它皇后,則出現(xiàn)攻擊,撤消在第j列安放的皇后。如果沒有出現(xiàn)攻擊,在第j列安放的皇后不動(dòng),遞歸安放第i+1行皇后。 該課題要求求解可能的方案及方案數(shù)并逐步演示擺放皇后的過(guò)程。</p><p> 1.1.8 雙鏈表創(chuàng)建演示</p><p> 建立一個(gè)遞增有序的雙鏈
12、表。功能是隨機(jī)生成8個(gè)結(jié)點(diǎn)數(shù)據(jù),每生成一個(gè)結(jié)點(diǎn)則申請(qǐng)空間得到一個(gè)指針,將數(shù)據(jù)存放到指針?biāo)傅臄?shù)據(jù)域中,然后將結(jié)點(diǎn)插入到已經(jīng)排好序的雙鏈表中。所以第一步工作是判斷新結(jié)點(diǎn)的插入位置,第二不演示插入過(guò)程中指針的變化,第三步顯示插入后的鏈表結(jié)果。</p><p> 1.1.9 公園導(dǎo)游圖</p><p> 給出一張某公園的導(dǎo)游圖,游客通過(guò)終端詢問(wèn)可知:從某一景點(diǎn)到另一景點(diǎn)的最短路徑。游客從公園
13、大門進(jìn)入,選一條最佳路線,使游客可以不重復(fù)地游覽各景點(diǎn),最后回到出口(出口就在入口旁邊)。要求用圖示展示最佳路徑。</p><p><b> 1.2 選題方案:</b></p><p> 所選題目根據(jù)學(xué)號(hào)確定,學(xué)號(hào)模9加1,即(學(xué)號(hào)%9+1)。如你的學(xué)號(hào)為12,則所選題目號(hào)為:12%9+1=(題目4)。注意,所有的課題都要求用圖形方式演示步驟和結(jié)果。有興趣的同學(xué)可
14、以自己針對(duì)數(shù)據(jù)結(jié)構(gòu)課程中所講算法來(lái)設(shè)計(jì)一個(gè)演示過(guò)程的算法,但要預(yù)先告知老師,經(jīng)過(guò)審批,方可確定課題。</p><p><b> 1.3設(shè)計(jì)要求:</b></p><p> 1.3.1 課程設(shè)計(jì)報(bào)告規(guī)范</p><p><b> (1)需求分析</b></p><p><b> 程序
15、的功能。</b></p><p><b> 輸入輸出的要求。</b></p><p><b> ?。?)概要設(shè)計(jì)</b></p><p> 程序由哪些模塊組成以及模塊之間的層次結(jié)構(gòu)、各模塊的調(diào)用關(guān)系;每個(gè)模塊的功能。</p><p> 課題涉及的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫(kù)結(jié)構(gòu);即要存儲(chǔ)什么數(shù)
16、據(jù),這些數(shù)據(jù)是什么樣的結(jié)構(gòu),它們之間有什么關(guān)系等。</p><p><b> ?。?)詳細(xì)設(shè)計(jì)</b></p><p> 采用C語(yǔ)言定義相關(guān)的數(shù)據(jù)類型。</p><p> 寫出各模塊的類C碼算法。</p><p> 畫出各函數(shù)的調(diào)用關(guān)系圖、主要函數(shù)的流程圖。</p><p> ?。?)調(diào)試分
17、析以及設(shè)計(jì)體會(huì)</p><p> 測(cè)試數(shù)據(jù):準(zhǔn)備典型的測(cè)試數(shù)據(jù)和測(cè)試方案,包括正確的輸入及輸出結(jié)果和含有錯(cuò)誤的輸入及輸出結(jié)果。</p><p> 程序調(diào)試中遇到的問(wèn)題以及解決問(wèn)題的方法。</p><p> 課程設(shè)計(jì)過(guò)程經(jīng)驗(yàn)教訓(xùn)、心得體會(huì)。</p><p><b> (5)使用說(shuō)明</b></p>&
18、lt;p> 用戶使用手冊(cè):說(shuō)明如何使用你編寫的程序,詳細(xì)列出每一步的操作步驟。</p><p><b> (6)書寫格式</b></p><p> 設(shè)計(jì)報(bào)告要求用A4紙打印成冊(cè):</p><p> 一級(jí)標(biāo)題用3號(hào)黑體,二級(jí)標(biāo)題用四號(hào)宋體加粗,正文用小四號(hào)宋體;行距為22。</p><p><b>
19、 (7)附錄</b></p><p> 源程序清單(帶注釋)</p><p> 1.3.2 考核方式</p><p> 指導(dǎo)老師負(fù)責(zé)驗(yàn)收程序的運(yùn)行結(jié)果,并結(jié)合學(xué)生的工作態(tài)度、實(shí)際動(dòng)手能力、創(chuàng)新精神和設(shè)計(jì)報(bào)告等進(jìn)行綜合考評(píng),并按優(yōu)秀、良好、中等、及格和不及格五個(gè)等級(jí)給出每位同學(xué)的課程設(shè)計(jì)成績(jī)。具體考核標(biāo)準(zhǔn)包含以下幾個(gè)部分:</p>&
20、lt;p> (1)平時(shí)出勤 (占10%)</p><p> ?。?)系統(tǒng)需求分析、功能設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)及程序總體結(jié)構(gòu)合理與否(占10%)</p><p> ?。?)程序能否完整、準(zhǔn)確地運(yùn)行,個(gè)人能否獨(dú)立、熟練地調(diào)試程序(占40%)</p><p> ?。?)設(shè)計(jì)報(bào)告(占30%)</p><p> 注意:不得抄襲他人的報(bào)告(或給他人
21、抄襲),一旦發(fā)現(xiàn),成績(jī)?yōu)榱惴帧?lt;/p><p> ?。?)獨(dú)立完成情況(占10%)。</p><p> 1.3.3 課程驗(yàn)收要求</p><p> ?。?)運(yùn)行所設(shè)計(jì)的系統(tǒng)。</p><p> (2)回答有關(guān)問(wèn)題。</p><p> (3)提交課程設(shè)計(jì)報(bào)告。</p><p> ?。?)提交
22、軟盤(源程序、設(shè)計(jì)報(bào)告文檔)。</p><p> ?。?)依內(nèi)容的創(chuàng)新程度,完善程序情況及對(duì)程序講解情況打分。</p><p><b> 2 進(jìn)度安排</b></p><p> 2.1 計(jì)算機(jī)0701/0702班:</p><p> 第 7 周:星期一 8:00——12:00 上課 星期一 14:00——
23、16:00 上課</p><p> 星期五 18:00——22:00 上機(jī)</p><p> 第 8 周:星期六 14:00——18:00 上機(jī) 星期日 8:00——12:00 上機(jī)</p><p> 星期日 18:00——22:00 上課</p><p> 第 9 周:星期六 8:00——12:00 上機(jī) 星
24、期日 14:00——18:00 上機(jī)</p><p> 2.2 計(jì)算機(jī)0703班:</p><p> 第 7 周:星期一 8:00——12:00 上課 星期一 14:00——16:00 上課</p><p> 星期六 8:00——12:00 上機(jī) 星期日 14:00——18:00 上機(jī)</p><p>
25、 第 8 周:星期六 8:00——12:00 上機(jī) 星期日 14:00——18:00 上機(jī)</p><p> 第 9 周:星期六 14:00——18:00 上機(jī) 星期日 18:00——22:00 上機(jī)</p><p><b> 目 錄</b></p><p> 一、需求分析- 1 -</p><
26、;p> 1.程序功能說(shuō)明 - 1 -</p><p> 2.輸入輸出- 1 -</p><p> 二、概要設(shè)計(jì)- 2 -</p><p> 1.程序模塊 本程序由于僅需實(shí)現(xiàn)雙鏈表的創(chuàng)建演示,所以程序結(jié)構(gòu)比較簡(jiǎn)單,主要由三部分模塊函數(shù)組成,即構(gòu)建生成雙鏈表,演示指針變化,結(jié)果輸出。- 2 -</p&g
27、t;<p> 2.課題涉及的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫(kù)結(jié)構(gòu) 本課題所用到的數(shù)據(jù)結(jié)構(gòu)主要是雙向鏈表,所用到的數(shù)據(jù)結(jié)構(gòu)如下- 2 -</p><p> 2.1雙鏈表存儲(chǔ)結(jié)構(gòu)- 2 -</p><p> 2.2雙鏈表結(jié)點(diǎn)的插入- 2 -</p><p> 2.3雙鏈表結(jié)點(diǎn)的刪除- 3 -</p><p>
28、三、詳細(xì)設(shè)計(jì)- 4 -</p><p> 1.采用C語(yǔ)言定義相關(guān)的數(shù)據(jù)類型- 4 -</p><p> 1.1雙鏈表結(jié)點(diǎn)定義- 4 -</p><p> 2.寫出各模塊的類C碼算法- 4 -</p><p> 2.1 建立并插入雙鏈表的類C算法- 4 -</p><p> 2.2 指針變化
29、演示類C算法- 5 -</p><p> 3.3 輸出已排序雙鏈表類C代碼- 5 -</p><p> 3.畫出各函數(shù)的調(diào)用關(guān)系圖、主要函數(shù)的流程圖。- 6 -</p><p> 四、調(diào)試分析以及設(shè)計(jì)體會(huì)- 6 -</p><p> 1.程序調(diào)試中遇到的問(wèn)題以及解決問(wèn)題的方法。- 6 -</p><
30、p> 2.課程設(shè)計(jì)過(guò)程經(jīng)驗(yàn)教訓(xùn)、心得體會(huì)。- 7 -</p><p> 五、使用說(shuō)明- 7 -</p><p> 六、附錄- 10 -</p><p> 源程序清單- 10 -</p><p> 參考文獻(xiàn)- 15 -</p><p><b> 需求分析</b><
31、;/p><p> 程序功能說(shuō)明鏈表是線性表的鏈?zhǔn)奖硎?,由于它不要求邏輯上相鄰的元素在物理位置上也相鄰,所以它沒有順序存儲(chǔ)結(jié)構(gòu)在做插入刪除操作時(shí)需要移動(dòng)大量元素的弱點(diǎn)。雙鏈表的結(jié)點(diǎn)中有兩個(gè)指針域,一個(gè)指向直接后繼,一個(gè)指向直接前驅(qū)。所以雙鏈表創(chuàng)建演示就是建立一個(gè)遞增有序的雙鏈表。程序功能是首先由程序隨機(jī)生成8個(gè)結(jié)點(diǎn)數(shù)據(jù),生成一個(gè)結(jié)點(diǎn)后則申請(qǐng)空間得到一個(gè)指針,將數(shù)據(jù)存放到指針?biāo)傅臄?shù)據(jù)域中,再生成一個(gè)結(jié)點(diǎn)后先判斷
32、此結(jié)點(diǎn)的數(shù)值和已生成結(jié)點(diǎn)的大小,由于要求建立遞增有序的雙鏈表,所以把結(jié)點(diǎn)插入到比其大的所有結(jié)點(diǎn)中的最小結(jié)點(diǎn)之前和比其小的所有結(jié)點(diǎn)中最大結(jié)點(diǎn)的之后,并在插入過(guò)程中顯示指針變化,最后輸出排好序的雙鏈表。</p><p> 輸入輸出由于本程序?yàn)檠菔境绦颍Y(jié)點(diǎn)也由程序隨機(jī)生成,所以在輸入方面不需實(shí)現(xiàn)功能,只需用戶控制程序操作。輸出方面主要是在屏幕顯示插入結(jié)點(diǎn)的結(jié)果和顯示指針變化的功能,
33、具體輸出過(guò)程為輸出首先生成的結(jié)點(diǎn),然后顯示對(duì)已生成結(jié)點(diǎn)的排序,再演示出指針變化,指針以彎折的箭頭表示,最后輸出排序后的鏈表,直箭頭表示雙鏈表的前驅(qū)后驅(qū)。</p><p><b> 概要設(shè)計(jì)</b></p><p> 程序模塊本程序由于僅需實(shí)現(xiàn)雙鏈表的創(chuàng)建演示,所以程序結(jié)構(gòu)比較簡(jiǎn)單,主要由三部分模塊函數(shù)組成,即構(gòu)建生成雙鏈表,演示指
34、針變化,結(jié)果輸出。</p><p><b> 程序結(jié)構(gòu)圖:</b></p><p> 課題涉及的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫(kù)結(jié)構(gòu)本課題所用到的數(shù)據(jù)結(jié)構(gòu)主要是雙向鏈表,所用到的數(shù)據(jù)結(jié)構(gòu)如下</p><p> 2.1雙鏈表存儲(chǔ)結(jié)構(gòu)</p><p> typedef struct DuLNode{</p&
35、gt;<p> ElemType data;</p><p> struct DuLNode *prior;</p><p> struct DuLNode *next;</p><p> }DuLNode, *DuLinkList;</p><p> 2.2雙鏈表結(jié)點(diǎn)的插入</p><p>
36、 Status ListInsert_DuL(DuLinkList &L, int i, ElemType e){</p><p> if(!(p=GetElemp_DuL(L,i)))</p><p> return ERROR;</p><p> if(!(s=(DuLinklist)malloc(sizeof(DuLNode))))</p&
37、gt;<p> return ERROR;</p><p> s->data=e;</p><p> s->prior=p->prior; </p><p> p->piror-next=s;</p><p> s->next=p;</p><p> p->
38、prior=s;</p><p> return OK;</p><p><b> }</b></p><p> 2.3雙鏈表結(jié)點(diǎn)的刪除</p><p> Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e){</p>&l
39、t;p> if(!(p=GetElemP_DuL(L,i)))</p><p> return ERROR;</p><p> e=p->data;</p><p> p->prior->next=p->next;</p><p> p->next->prior=p->prior;&l
40、t;/p><p> free(p); return OK;</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p> 1.采用C語(yǔ)言定義相關(guān)的數(shù)據(jù)類型</p><p> 1.1雙鏈表結(jié)點(diǎn)定義</p><p> typedef struct Link</p><p&g
41、t;<b> {</b></p><p><b> int data;</b></p><p> struct Link *right;</p><p> struct Link *left;</p><p><b> int num;</b></p>
42、<p> }linkx,*linky;</p><p> 2.寫出各模塊的類C碼算法</p><p> 2.1 建立并插入雙鏈表的類C算法 </p><p> void InitList(void){ </p><p> randomize(); </p><p> 將產(chǎn)生的隨機(jī)數(shù)字
43、轉(zhuǎn)換成字符串并輸出;</p><p><b> sleep(1);</b></p><p> PrLink(head,n); /*顯示只有頭節(jié)點(diǎn)的鏈表*/</p><p><b> n++; </b></p><p> while(n!=8){ </p><
44、p> s->data=random(100);</p><p> if(s->data<=head->data) /*小于頭結(jié)點(diǎn),插在頭*/</p><p><b> { </b></p><p> q=head->right; q->num++;} /*節(jié)點(diǎn)數(shù)加1;*/</p
45、><p><b> 顯示具體插入過(guò)程;</b></p><p> else /其他情況/</p><p> if(p==NULL) /*這個(gè)數(shù)是當(dāng)前最大的數(shù),插在尾部*/</p><p> 顯示插入的具體過(guò)程;</p><p> else /*隨即產(chǎn)生的數(shù)排在表中*/{
46、 </p><p> while(s!=NULL)</p><p> { s->num++;s=s->right;}</p><p><b> }</b></p><p> 顯示插入的具體過(guò)程;</p><p><b> }</b></p>
47、<p><b> }</b></p><p> 2.2指針變化演示類C算法</p><p> void DrawChange(int data,int i,int n){ </p><p> 判斷插入結(jié)點(diǎn)的位置:</p><p> if(i!=-1) </p><p>
48、;<b> {</b></p><p> 當(dāng)前指針是頭指針,畫前驅(qū)、后繼指針;</p><p><b> }</b></p><p> if(i!=n-1)</p><p><b> {</b></p><p> 當(dāng)前指針是尾指針,畫前驅(qū)、后
49、驅(qū)指針;</p><p><b> }</b></p><p> if(i!=n-1&&i!=-1)</p><p><b> {</b></p><p> 不是頭指針也不是尾指針時(shí):</p><p><b> 畫前驅(qū)指針;</b&g
50、t;</p><p><b> 畫后繼指針;</b></p><p><b> }</b></p><p><b> 擦掉所畫的指針線;</b></p><p><b> }</b></p><p> 3.3輸出已排序
51、雙鏈表類C代碼</p><p> void PrLink(linky p,int n){ </p><p> while(p!=NULL){ </p><p> 輸出隨機(jī)產(chǎn)生的數(shù)據(jù);</p><p> if(p->left!=NULL) /*第一個(gè)節(jié)點(diǎn)不顯示前驅(qū)指針*/</p><p><b
52、> 畫前驅(qū)指針;</b></p><p> if(p->right!=NULL)</p><p><b> 畫后繼指針;</b></p><p> p=p->right;</p><p><b> }</b></p><p><b
53、> }</b></p><p> 3.畫出各函數(shù)的調(diào)用關(guān)系圖、主要函數(shù)的流程圖。</p><p><b> Y</b></p><p><b> Y</b></p><p><b> Y</b></p><p><b&g
54、t; N</b></p><p> 具體Inintlist(void)函數(shù)的流程圖:</p><p> 調(diào)試分析以及設(shè)計(jì)體會(huì)</p><p> 程序調(diào)試中遇到的問(wèn)題以及解決問(wèn)題的方法。</p><p> 主要是在結(jié)點(diǎn)插入判斷方面有難度,一開始不能準(zhǔn)確的進(jìn)行結(jié)點(diǎn)的判斷和插入,然后就是插入結(jié)點(diǎn)的過(guò)程中位置不對(duì),不是遞增有序的
55、,后面在網(wǎng)上找到了一段演示代碼,通過(guò)研究這段代碼解決了這個(gè)問(wèn)題。還有就是在顯示指針變化方面有問(wèn)題,經(jīng)過(guò)查詢資料,解決結(jié)點(diǎn)插入方面的問(wèn)題,用畫箭頭的方式來(lái)表現(xiàn)指針的變化。</p><p> 2.課程設(shè)計(jì)過(guò)程經(jīng)驗(yàn)教訓(xùn)、心得體會(huì)。</p><p> 在進(jìn)行本次課程設(shè)計(jì)的實(shí)驗(yàn)操作中,由于自己的基礎(chǔ)知識(shí)不是很好,出現(xiàn)了一些問(wèn)題:在編程方面不熟,所以寫出的代碼總是出錯(cuò);數(shù)據(jù)結(jié)構(gòu)課程以前也沒有好好學(xué)
56、過(guò),造成在構(gòu)建程序數(shù)據(jù)結(jié)構(gòu)時(shí)出現(xiàn)由于概念模糊而寫錯(cuò)功能的問(wèn)題。但是在老師和同學(xué)們的幫助下,再通過(guò)查閱資料,最后終于寫出了可以正確運(yùn)行結(jié)果的代碼,所以要感謝給我?guī)椭睦蠋熀屯瑢W(xué)。以前用C編程,只是注重如何編寫函數(shù)能夠完成所需要的功能,似乎沒有明確的戰(zhàn)術(shù),只是憑單純的意識(shí)和簡(jiǎn)單的語(yǔ)句來(lái)堆砌出一段程序。感覺有點(diǎn)像張飛打仗,有勇無(wú)謀,只要能完成任務(wù)就行。但現(xiàn)在編程感覺完全不同了。在編寫一個(gè)程序之前,自己能夠綜合考慮各種因素,首先選取自己需要的數(shù)
57、據(jù)結(jié)構(gòu),是樹還是圖或是別的什么?然后選定一種或幾種存儲(chǔ)結(jié)構(gòu)來(lái)具體的決定后面的函數(shù)的主要風(fēng)格。最后在編寫每一個(gè)函數(shù)之前,可以仔細(xì)斟酌比對(duì),挑選出最適合當(dāng)前狀況的算法。這樣,即使在完整的程序還沒有寫出來(lái)之前,自己心中已經(jīng)有了明確的原圖了。這樣無(wú)形中就提高了自己編寫的程序的質(zhì)量。</p><p> 通過(guò)這次課程設(shè)計(jì),使我意識(shí)到作為一個(gè)計(jì)算機(jī)系的學(xué)生,正確掌握一門程序語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)的重要性,想要在程序設(shè)計(jì)上面作出成績(jī),
58、必須要有扎實(shí)的編程語(yǔ)言基礎(chǔ)和良好的數(shù)據(jù)結(jié)構(gòu)算法知識(shí),我決定在余下的在校時(shí)間里,認(rèn)認(rèn)真真學(xué)一門語(yǔ)言,并去詳細(xì)了解程序的算法設(shè)計(jì)。</p><p><b> 使用說(shuō)明</b></p><p> 本程序是演示程序,在運(yùn)行后按任意鍵即執(zhí)行演示過(guò)程,可直觀的看到程序運(yùn)行時(shí)雙鏈表指針的變化情況,為方便觀察結(jié)果,在程序運(yùn)行的時(shí)候,按一下執(zhí)行一步,也可以通過(guò)按Q鍵來(lái)退出程序,也可
59、以在等待所有過(guò)程結(jié)束后再退出。</p><p> 1.進(jìn)入程序后界面:</p><p> 2.隨機(jī)產(chǎn)生結(jié)點(diǎn),圖中已產(chǎn)生2個(gè)結(jié)點(diǎn),由于57大于1,所以沒有右指針</p><p><b> 3.指針變化情況</b></p><p> 4.完成一個(gè)鏈表創(chuàng)建,下一結(jié)點(diǎn)插入中</p><p> 5
60、.所有步驟完成后程序顯示界面,可清晰看到排序后的雙鏈表結(jié)果</p><p><b> 附錄</b></p><p><b> 源程序清單</b></p><p> #include "stdlib.h"</p><p> #include "graphics.
61、h"</p><p> typedef struct Link/*雙鏈表結(jié)點(diǎn)定義*/</p><p><b> {</b></p><p><b> int data;</b></p><p> struct Link *right;</p><p> s
62、truct Link *left;</p><p> int num;/*給鏈表加序號(hào),為了演示時(shí)計(jì)算正確位置*/</p><p> }linkx,*linky;</p><p> void Init(void);/*圖形驅(qū)動(dòng)*/</p><p> void Close(void);/*圖形關(guān)閉*/</p><p&
63、gt; void InitList(void);/*建立雙鏈表,邊建立邊插入*/</p><p> void PrLink(linky p,int n);/*每次插入后輸出鏈表*/</p><p> void DrawChange(int data,int i,int n);/*畫鏈表插入的指針變化*/</p><p> void main(void)<
64、;/p><p><b> {</b></p><p> Init();/*圖形關(guān)閉*/</p><p> InitList();/*建立鏈表*/</p><p> Close();/*圖形關(guān)閉*/</p><p><b> exit(0);</b></p>
65、<p><b> }</b></p><p> void InitList(void) /*建立雙向鏈表,邊建立邊插入*/</p><p><b> {</b></p><p> linky head,p,q,s;</p><p><b> int n=0;</
66、b></p><p> char str[5];</p><p> randomize();/*隨機(jī)數(shù)發(fā)生機(jī)*/</p><p> setcolor(BLUE);</p><p> outtextxy(200,20,"PERSS ANY KEY TO START");</p><p>
67、 setcolor(RED);</p><p> outtextxy(400,30,"Press Q to quit");</p><p><b> getch();</b></p><p> head=s=(linky)malloc(sizeof(linkx));</p><p> s-&
68、gt;data=random(100);/*隨機(jī)生成100以內(nèi)的數(shù)字*/</p><p><b> s->num=n;</b></p><p> sprintf(str,"%d",s->data);/*將數(shù)字轉(zhuǎn)換成字符串并輸出*/</p><p> settextstyle(4,0,1);</p>
69、;<p> setcolor(WHITE);</p><p> outtextxy(50,50,"NodeData:");</p><p> outtextxy(50,70,"DoubleLinks:");</p><p> setcolor(10);</p><p> outt
70、extxy(155+n*35,50,str);/*顯示數(shù)據(jù)*/</p><p><b> getch();</b></p><p> s->right=NULL;</p><p> s->left=NULL;</p><p> PrLink(head,n);/*每次插入新數(shù)字后都顯示當(dāng)前鏈表*/<
71、;/p><p><b> n++;</b></p><p> while(n!=8)</p><p><b> {</b></p><p> s=(linky)malloc(sizeof(linkx));</p><p> s->data=random(100);
72、</p><p><b> s->num=n;</b></p><p> sprintf(str,"%d",s->data);/*將數(shù)字轉(zhuǎn)換成字符串并輸出*/</p><p> setcolor(10);</p><p> outtextxy(155+n*35,50,str);&l
73、t;/p><p><b> getch();</b></p><p> p=head;/*每生成一個(gè)結(jié)點(diǎn),將該結(jié)點(diǎn)插入到有序雙鏈表中*/</p><p> if(s->data<=head->data)/*小于頭結(jié)點(diǎn),插在頭*/</p><p><b> {</b></p
74、><p> DrawChange(s->data,-1,n);/*顯示插入的具體過(guò)程*/</p><p> s->right=head;</p><p> s->left=NULL;</p><p><b> s->num=0;</b></p><p> head-&
75、gt;left=s;</p><p><b> head=s;</b></p><p> q=head->right;/*后面所有數(shù)的序號(hào)都加1,相當(dāng)于數(shù)據(jù)后移*/</p><p> while(q!=NULL)</p><p><b> {</b></p><p&
76、gt;<b> q->num++;</b></p><p> q=q->right;</p><p><b> }</b></p><p><b> }</b></p><p> else/*其他情況*/</p><p><b
77、> {</b></p><p> while(s->data>p->data&&p!=NULL)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p=p->right;</p
78、><p><b> }</b></p><p> if(p==NULL)/*這個(gè)數(shù)是當(dāng)前最大的數(shù),插在尾部*/</p><p><b> {</b></p><p> DrawChange(s->data,n-1,n);/*顯示插入的具體過(guò)程*/</p><p>
79、 q->right=s;</p><p> s->right=NULL;</p><p> s->left=q;</p><p><b> s->num=n;</b></p><p><b> }</b></p><p> else /*結(jié)
80、點(diǎn)插入位置位于兩數(shù)之間*/</p><p><b> {</b></p><p> q->right->left=s;</p><p> s->right=q->right;</p><p> s->left=q;</p><p> q->right=
81、s;</p><p> s->num=q->num+1;</p><p> DrawChange(s->data,q->num,n);/*顯示插入的具體過(guò)程*/</p><p> /*后面所有數(shù)的序號(hào)都加1*/</p><p> s=s->right;</p><p> whil
82、e(s!=NULL)</p><p><b> {</b></p><p><b> s->num++;</b></p><p> s=s->right;</p><p><b> }</b></p><p><b> }
83、</b></p><p><b> }</b></p><p> PrLink(head,n);/*每次插入新數(shù)據(jù)后都顯示新鏈表*/</p><p><b> n++;</b></p><p><b> }</b></p><p>&
84、lt;b> }</b></p><p> /*畫鏈表插入的具體過(guò)程,data是要插入的數(shù)據(jù),i為插入結(jié)點(diǎn)前驅(qū)結(jié)點(diǎn)序號(hào),n為當(dāng)前結(jié)點(diǎn)個(gè)數(shù),先將前驅(qū)結(jié)點(diǎn)和后繼之間的指針線擦除,顯示新結(jié)點(diǎn)插入過(guò)程,插入后擦除插入過(guò)程,恢復(fù)刪除的前驅(qū)結(jié)點(diǎn)的指針線*/</p><p> void DrawChange(int data,int i,int n)</p><
85、p><b> {</b></p><p> char str[5];</p><p> setfillstyle(SOLID_FILL,BLACK);</p><p> setcolor(RED);/*插入鏈表的新數(shù)據(jù)用紅色顯示*/</p><p> sprintf(str,"%d",
86、data);</p><p> outtextxy(55+70*i+35,100+n*50,str);/*輸出插入的位置*/</p><p> bar(50+70*i+35,100+(n-1)*50-20,50+70*i+65,100+(n-1)*50+20);</p><p> /*去除插入結(jié)點(diǎn)位置原結(jié)點(diǎn)間的指針線*/</p><p>
87、; setcolor(YELLOW);</p><p> if(i!=-1) /*不是插在頭,新結(jié)點(diǎn)的前驅(qū)指針線*/</p><p><b> {</b></p><p> line(50+70*i+34,100+n*50,50+70*i+30,100+n*50);</p><p> line(50+70*i+
88、30,100+n*50,50+70*i+30,100+n*50-25);</p><p> line(50+70*i+30,100+n*50-25,50+70*i+27,100+n*50-22);</p><p> line(50+70*i+30,100+n*50-25,50+70*i+33,100+n*50-22);</p><p><b> ge
89、tch();</b></p><p><b> }</b></p><p> if(i!=n-1)/*不是插在尾,新結(jié)點(diǎn)的后繼指針線*/</p><p><b> {</b></p><p> line(50+70*i+61,100+n*50,50+70*i+65,100+n*5
90、0);</p><p> line(50+70*i+65,100+n*50,50+70*i+65,100+n*50-25);</p><p> line(50+70*i+65,100+n*50-25,50+70*i+62,100+n*50-22);</p><p> line(50+70*i+65,100+n*50-25,50+70*i+68,100+n*50
91、-22);</p><p><b> getch();</b></p><p><b> }</b></p><p> setcolor(6);</p><p> if(i!=-1)/*不是插在頭,新結(jié)點(diǎn)前驅(qū)結(jié)點(diǎn)的后繼指針線*/</p><p><b>
92、{</b></p><p> line(50+70*i+20,100+n*50-25,50+70*i+20,110+n*50);</p><p> line(50+70*i+20,110+n*50,50+70*i+34,110+n*50);</p><p> line(50+70*i+34,110+n*50,50+70*i+31,110+n*50-
93、3);</p><p> line(50+70*i+34,110+n*50,50+70*i+31,110+n*50+3);</p><p><b> getch();</b></p><p><b> }</b></p><p> if(i!=n-1) /*不是插在尾,新結(jié)點(diǎn)后繼結(jié)點(diǎn)的前驅(qū)指
94、針線*/</p><p><b> {</b></p><p> line(50+70*i+75,100+n*50-25,50+70*i+75,110+n*50);</p><p> line(50+70*i+75,110+n*50,50+70*i+61,110+n*50);</p><p> line(50+7
95、0*i+61,110+n*50,50+70*i+64,110+n*50-3);</p><p> line(50+70*i+61,110+n*50,50+70*i+64,110+n*50+3);</p><p><b> }</b></p><p><b> getch();</b></p><p
96、> setcolor(WHITE);</p><p> if(i!=n-1&&i!=-1)/*第一個(gè)節(jié)點(diǎn)和最后一個(gè)結(jié)點(diǎn)不恢復(fù)指針*/</p><p><b> {</b></p><p> line(50+70*i+35,100+(n-1)*50,50+70*i+65,100+(n-1)*50);/*畫前驅(qū)指針*/
97、</p><p> line(50+70*i+35,100+(n-1)*50,50+70*i+40,95+(n-1)*50);</p><p> line(50+70*i+35,110+(n-1)*50,50+70*i+65,110+(n-1)*50);/*畫右指針*/</p><p> line(50+70*i+65,110+(n-1)*50,50+70*i
98、+60,115+(n-1)*50);</p><p><b> }</b></p><p> bar(0,100+(n-1)*50+21,640,120+n*50);/*擦掉插入過(guò)程的指針線*/</p><p><b> }</b></p><p> void PrLink(linky p,
99、int n)/*每次插入后輸出鏈表*/</p><p><b> {</b></p><p> char str[5];</p><p> while(p!=NULL)/*不為空就輸出*/</p><p><b> {</b></p><p> sprintf(st
100、r,"%d",p->data);</p><p> setcolor(GREEN);</p><p> outtextxy(55+70*p->num,100+n*50,str); /*輸出數(shù)據(jù)*/</p><p> setcolor(WHITE);</p><p> if(p->left!=NUL
101、L)/*第一個(gè)節(jié)點(diǎn)不顯示左指針*/</p><p><b> {</b></p><p> line(50+70*(p->num-1)+35,100+n*50,50+70*(p->num-1)+65,</p><p> 100+n*50);/*畫左指針*/</p><p> line(50+70*(p
102、->num-1)+35,100+n*50,50+70*(p->num-1)+</p><p> 40,95+n*50);</p><p><b> }</b></p><p> if(p->right!=NULL)</p><p><b> {</b></p>
103、<p> line(50+70*p->num+35,110+n*50,50+70*p->num+65,110+n*50);/*畫右指針*/</p><p> line(50+70*p->num+65,110+n*50,50+70*p->num+60,115+n*50);</p><p><b> }</b></p>
104、<p> p=p->right;</p><p><b> }</b></p><p><b> }</b></p><p> void Init(void)/*圖形驅(qū)動(dòng)*/</p><p><b> {</b></p><p&
105、gt; int gd=DETECT,gm;</p><p> initgraph(&gd,&gm,"c:\\tc"); </p><p> cleardevice();</p><p><b> }</b></p><p> void Close(void)/*圖形關(guān)閉*
106、/</p><p><b> {</b></p><p><b> getch();</b></p><p> closegraph();</p><p><b> }</b></p><p><b> 參考文獻(xiàn)</b>&
107、lt;/p><p> 嚴(yán)蔚敏,吳偉民, 《數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)》,北京:清華大學(xué)出版社,2005</p><p> 嚴(yán)蔚敏,吳偉民, 《數(shù)據(jù)結(jié)構(gòu)題集(C語(yǔ)言版)》,北京:清華大學(xué)出版社,2003</p><p> 郭翠英 等 《C語(yǔ)言課程設(shè)計(jì)案例精編》,北京:水利水電出版社,2004</p><p> 計(jì)算機(jī)與通信學(xué)院課程設(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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--鏈表
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---雙向鏈表
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---鏈表的創(chuàng)建、插入、刪除、修改
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-- 循環(huán)單鏈表
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---城市鏈表的設(shè)計(jì)與實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--雙向循環(huán)鏈表的創(chuàng)建及相關(guān)操作的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--雙向循環(huán)鏈表的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---鏈表的維護(hù)與文件形式的保存
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--內(nèi)部排序演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-----鏈表的維護(hù)與文件形式的保存
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---數(shù)據(jù)結(jié)構(gòu)相關(guān)算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--- 數(shù)據(jù)結(jié)構(gòu)各章算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---幾種排序算法的演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論