久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

數據結構課程設計(5篇)

時間:2019-05-12 06:41:42下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《數據結構課程設計》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《數據結構課程設計》。

第一篇:數據結構課程設計

課程設計說明書

設計名稱: 數據結構課程設計

題 目: 設計五 :二叉樹的相關操作

學生姓名: 專 業: 計算機科學與技術 班 級: 學 號: 指導教師: 日 期: 2012 年 3 月 5 日

課程設計任務書

計算機科學與技術 專業 年級 班

一、設計題目

設計五 二叉樹的相關操作

二、主要內容

建立二叉樹,并對樹進行相關操作。

三、具體要求

1)利用完全二叉樹的性質建立一棵二叉樹。(層數不小于4層)2)統計樹葉子結點的個數。3)求二叉樹的深度。

4)能夠輸出用前序,中序,后序對二叉樹進行遍歷的遍歷序列。

四、進度安排

依照教學計劃,課程設計時間為:2周。

本設計要求按照軟件工程的基本過程完成設計。建議將時間分為三個階段:第一階段,根據題目要求,確定系統的總體設計方案:即系統包括哪些功能模塊,每個模塊的實現算法,并畫出相應的流程圖.同時編寫相應的設計文檔;第二階段,根據流程圖編寫程序代碼并調試,再將調試通過的各個子模塊進行集成調試;第三階段,歸納文檔資料,按要求填寫在《課程設計說明書》上,并參加答辯。三個階段時間分配的大概比例是:35: 45: 20。

五、完成后應上交的材料

本課程設計要求按照學校有關規范的要求完成,在課程設計完成后需要提交的成果和有關文檔資料包括課程設計的說明書,課程設計有關源程序及可運行程序(含運行環境)。其中課程設計說明書的格式按學校規范(見附件),其內容不能過于簡單,必須包括的內容有:

1、課程設計的基本思想,系統的總功能和各子模塊的功能說明;

2、課程設計有關算法的描述,并畫出有關算法流程圖;

3、源程序中核心代碼的說明。

4、本課程設計的個人總結,主要包括以下內容:

(1)課程設計中遇到的主要問題和解決方法;

(2)你的創新和得意之處;

(3)設計中存在的不足及改進的設想;

(4)本次課程設計的感想和心得體會。

5、源代碼要求在關鍵的位置有注釋,增加程序的可讀性。程序結構和變量等命名必須符合有關軟件開發的技術規范(參見有關文獻)。

此外,填寫在《課程設計說明書》中,必須根據要求認真填寫課程設計任務書,排版要求整齊,美觀,打印后與課程設計說明書封面一起裝訂好,并于本學期第6周星期1下午前交到致用樓5樓。

六、總評成績

指導教師 簽名日期 年 月 日

系 主 任 審核日期 年 月 日 佛山科學技術學院課程設計用紙

目 錄

一、總體思想??????????????????????6 1.1基本思想?????????????????????6 1.2系統的總功能???????????????????6 1.3各子模塊的功能說明????????????????6 1.3.1 結構體部分??????????????????????6 1.3.2主函數部分??????????????????????6 1.3.3子函數部分??????????????????????6

二、具體內容??????????????????????6 2.1 對應模塊的算法流程圖???????????????6 2.1.1總的設計思想流程圖??????????????????7 2.1.2創建二叉樹函數流程圖?????????????????7 2.1.3統計葉子數函數流程圖?????????????????8 2.1.4計算二叉樹深度函數流程圖???????????????8 2.1.5前序遍歷函數流程圖??????????????????9 2.1.6中序遍歷函數流程圖??????????????????9 2.1.7后序遍歷函數流程圖??????????????????10 2.2課程設計的算法描述????????????????10 2.3程序運行情況截圖?????????????????16 2.3.1程序運行的目錄以及創建二叉樹操作:??????????16

2.3.2計算二叉樹葉子數和深度的相關操作:??????????17 2.3.3對二叉樹分別進行前序,中序和后序遍歷的情況:?????18 2.3.4選擇錯誤及結束操作的運行情??????????????18

2.4程序備注?????????????????????19

三、源程序中核心代碼的說明???????????????19 3.1總設計思想說明??????????????????19 3.2創建二叉樹函數說明????????????????19 3.3統計葉子數函數說明????????????????20 佛山科學技術學院課程設計用紙

3.4計算二叉樹深度函數說明??????????????20 3.5前序遍歷函數說明?????????????????20 3.6中序遍歷函數說明?????????????????20 3.7后序遍歷函數說明?????????????????21

四、個人總結??????????????????????21 4.1課程設計中遇到的問題???????????????21 4.2對應問題的解決辦法????????????????22 4.3程序中的得意之處?????????????????23 4.4設計中存在的不足及改進方法????????????23 4.5設計中的感想以及心得體會?????????????30

佛山科學技術學院課程設計用紙

一、總體思想

1.1基本思想

基本思想是利用完全二叉樹的性質,用數組去創建一棵完全二叉樹,再用函數調用去調用去調用相應的函數實現選項對應的操作。1.2系統的總功能

本系統的主要功能是為用戶提供一個選擇操作的菜單目錄,并且實現對應選項的功能,具體功能有如下幾點:

1、創建二叉樹

2、統計葉子個數

3、求二叉樹的深度

4、前序遍歷輸出列表

5、中序遍歷輸出列表

6、后序遍歷輸出序列

7、退出操作

1.3各子模塊的功能說明

本程序主要分為三大子模塊: 1.3.1 結構體部分

BiTNode的結構體包含權值,左孩子存放地址和右孩子存放地址,是一個為了存放二叉樹結點信息所創建的結構體。1.3.2主函數部分

該模塊主要是實現對其他操作的函數調用的功能。1.3.3子函數部分

部分是實現對應子函數的操作,有:創建二叉樹、統計葉子個數、求二叉樹的深度、前序遍歷輸出列表、中序遍歷輸出列表和后序遍歷輸出序列的功能。

二、具體內容

2.1對應模塊的算法流程圖 2.1.1總的設計思想流程圖

2.1.2創建二叉樹函數流程圖

2.1.3統計葉子數函數流程圖

2.1.4計算二叉樹深度函數流程圖 2.1.5前序遍歷函數流程圖

2.1.6中序遍歷函數流程圖 2.1.7后序遍歷函數流程圖

2.2課程設計的算法描述 #include #include #define MAXSIZE 1000 struct BiTNode{ int c;int lchild,rchild;}BiTNode,*BiTree;struct BiTNode tree[MAXSIZE];void creat()//創建二叉樹函數 {

int i,j;printf(“需要輸入權值個數:n”);scanf(“%d”,&j);if(j<8)//判斷二叉樹是否達到4層

{ printf(“錯誤:二叉樹的層數少于4層!n”);

return;} printf(“開始輸入權值:n”);for(i=1;i<=j;i=i+1)//權值的錄入

{

scanf(“%d”,&tree[i].c);

tree[i].lchild=2*i;

tree[i].rchild=2*i+1;

} printf(“成功創建二叉樹n”);} int leaves()//統計葉子個數函數 { int l,i;l=0;for(i=1;tree[i].c!=NULL;i++)//計算二叉樹結點的個數

{

l++;} if((l%2))//判斷結點的奇偶性從而計算葉子的個數 {

return(((l-1)/2)+1);} else

return(l/2);} int deep()//求二叉樹的深度

{ int d,i,sum;sum=1;for(i=1;tree[i].c!=NULL;i++);//計算二叉樹結點的個數

for(d=1;sum<=i;d++)//求出二叉樹的深度

{

if(d!=1)

{

sum=sum+sum*2;

} } return(d-1);} void qian(int a)//前序遍歷輸出列表 { if(tree[a].c!=NULL)//判斷當前結點是否有值,若有執行如下操作,若無則返回上一層

{

printf(“%d,”,tree[a].c);

//首先輸出當前結點(根節點)的權值

qian((a*2));

//遞歸調用,用當前結點的左孩子作根節點重復當前函數的操作

qian((a*2+1));

//遞歸調用,用當前結點的右孩子作根節點重復當前函數的操作 } else return;

} void zhong(int a)//中序遍歷輸出列表 { if(tree[2*a].c!=NULL)//首先判斷當前結點的左孩子是否為空,不是就進行遞歸調用,用當前結點的左孩子作根節點重復當前函數的操作

{

} printf(“%d,”,tree[a].c);//輸出當前結點的權值

if(tree[2*a+1].c!=NULL)//判斷當前結點的右孩子是否為空,不是就進行遞歸調用,用當前結點的右孩子作根節點重復當前函數的操作

{

} } void hou(int a)//后序遍歷輸出序列 { if(tree[2*a].c!=NULL)//判斷當前結點的左孩子是否為空,不是就進行遞歸調用,用當前結點的左孩子作根節點重復當前函數的操作

{

} if(tree[2*a+1].c!=NULL)//判斷當前結點的右孩子是否為空,不是就進行遞歸調用,用當前結點的右孩子作根節點重復當前函數的操作 hou((2*a));zhong((2*a+1));zhong((2*a));13 {

hou((2*a+1));} printf(“%d,”,tree[a].c);//輸出當前結點的權值 } void main(){ int d,l,i;i=10;printf(“******************目錄******************n”);printf(“

1、創建二叉樹n”);printf(“

2、統計葉子個數n”);printf(“

3、求二叉樹的深度n”);printf(“

4、前序遍歷輸出列表n”);printf(“

5、中序遍歷輸出列表n”);printf(“

6、后序遍歷輸出序列n”);printf(“0、退出操作n”);printf(“*****************************************n”);while(i!=0){

printf(“選擇操作:n”);

scanf(“%d”,&i);

if(i==0)

{

break;

}

else if(i==1){ 14 printf(“開始創建二叉樹(層數不少于4層)n”);creat();} else if(i==2){ l=leaves();printf(“葉子個數為:%dn”,l);} else if(i==3){ d=deep();printf(“二叉樹的深度是%dn”,d);} else if(i==4){ printf(“用前序遍歷輸出的結果是:n”);qian(1);printf(“n”);} else if(i==5){ printf(“用中序遍歷輸出的結果是:n”);zhong(1);printf(“n”);} else if(i==6){ printf(“用后序遍歷輸出的結果是:n”);hou(1);

} } printf(“n”);else printf(“錯誤:沒有該操作!n”);printf(“歡迎使用!n”);}

2.3程序運行情況截圖

2.3.1程序運行的目錄以及創建二叉樹操作:

本程序一開始會彈出一個目錄,里面有七種操作供用戶選擇。此處是選擇創建二叉樹的操作。本程序要求創建的二叉樹一定要在4層或者是以上的層數才可以成功創建,當條件不符合的時候會彈出錯誤的消息并且提醒用戶不滿足的原因。如下分別是創建不成功和成功創建的運行情況:

2.3.2計算二叉樹葉子數和深度的相關操作:

2.3.3對二叉樹分別進行前序,中序和后序遍歷的情況:

2.3.4選擇錯誤及結束操作的運行情況:

當用戶選擇到菜單欄中沒有的選項時,會提示錯誤信息。2.4程序備注

程序創建結點數的上限是:1000個。

三、源程序中核心代碼的說明 3.1總設計思想說明

本程序主要由三個大部分組合而成,它們分別為:主函數、子函數(創建二叉樹子函數,計算葉子節點數子函數,計算二叉樹深度子函數,前序、中序、后序遍歷的子函數)和存儲葉子節點信息的結構體。

首先,我為二叉樹的每一個節點創建一個數組元素是BiTNode數據類型的數組,其中數據類型BiTNode包含三個信息:c(保存節點的權值),lchild(保存左孩子所在數組的位置)以及rchild(保存右孩子所在數組的位置)。然后,在主函數中,我們先用代碼輸出如下菜單供用戶選擇對應的c操作,那么用戶就會根據自己的需要選擇相應的操作。對于操作的選擇,我用了一個while(){}循環來控制用戶是否退出操作,果用戶不選擇退出操作,程序就將一直地運行下去。而對于其他的6種操作,就用if(){}??else if(){}的語句來實現用戶的選擇。不過如果用戶選擇了目錄以外的選擇鍵,程序就會反饋回一個錯誤的信息,告訴用戶該操作不存在。******************目錄******************

1、創建二叉樹

2、統計葉子個數

3、求二叉樹的深度

4、前序遍歷輸出列表

5、中序遍歷輸出列表

6、后序遍歷輸出序列

0、退出操作

***************************************** 3.2創建二叉樹函數說明

本題目中要求用戶創建的二叉樹一定要大于等于4層,因此,在子程序的一 19 開始就要用戶輸入創建的節點數目,并用if語句判斷節點數是否少于8個(節點數為8的二叉樹剛剛好是4層的),若是就顯示錯誤信息,告訴用戶所創建的二叉樹少于4層,不滿足條件,并且返回主函數。若不是,就用一個for循環將權值、左、右孩子信息分別錄入到存儲節點信息的數組之中,這樣就可以成功創建二叉樹。

3.3統計葉子數函數說明

由于本程序所創建的是完全二叉樹,因此,求其葉子數個數可以利用完全二叉樹的性質來求。首先我用一個for循環求出二叉樹的結點個數。然后再用2對節點數進行求余,用if語句進行判斷,如果右余數,就返回葉子個數:((結點個數-1)/2)+1;如果沒有余數,就返回葉子結點個數:(結點個數、2)。3.4計算二叉樹深度函數說明

計算二叉樹深度的方法跟計算葉子節點個數的方法都差不多,同樣都是要利用到完全二叉樹的性質去實現算法。首先,我用一個for循環去計算了二叉樹的結點個數,然后,用深度作為一個參數放進for循環里面,繼續循環的條件是:當前d層數最多的結點數<=二叉樹的結點數目。最后,經過這次循環后得到參數d-1(因為在結束是的d值剛剛好是不滿足條件的)的值就是要返回的二叉樹深度。

3.5前序遍歷函數說明

前序遍歷子函數的實現我們就用了函數的調用來實現。子函數的一開始就是要判斷當前子函數所處理的結點是否有值,如果沒有,就返回上一層操作;如果有,由于是先根遍歷就先輸出當前結點的權值,然后再用遞歸調用,用當前結點的左孩子作根節點重復當前函數的操作,跟著等前一個函數調用返回時就遞歸調用,用當前結點的右孩子作根節點重復當前函數的操作,那么輸出的序列就是一個對二叉樹進行先序遍歷的序列。3.6中序遍歷函數說明

中序遍歷子函數的算法實現方法跟前序遍歷子函數的差不多,也是要用到多個遞歸調用。在函數的一開始就用一個if語句判斷當前結點的左孩子是否為空,如果不是就一直以當前結點的左孩子作為新的根結點調用自身;如果當前結點的左孩子已經是空的了,就不用進行以當前結點左孩子為根結點自身調用,直接輸 20 出當前結點的權值。輸出操作完成后,就判斷當前結點的右孩子是否為空,如果是,就直接退出當前函數,返回上一層;如果不是,就要以當前結點的右孩子作為新的根結點,對該子函數進行自身的調用。經過這些操作之后所輸出的序列就是對二叉樹進行中序遍歷的結果。3.7后序遍歷函數說明

后序遍歷跟之前的前序遍歷和中序遍歷差別不會太大,都是要用到函數的遞歸調用。首先,在函數的開頭就用一個if語句判斷當前結點的左孩子是否為空,如果不是就一直以當前結點的左孩子作為新的根結點調用自身;如果當前結點的左孩子已經是空的了,就不用進行以當前結點左孩子為根結點自身調用,而要再用一個if語句判斷當前結點的右孩子是否為空,如果不是就一直以當前結點的右孩子作為新的根結點調用自身;如果當前結點的右孩子已經是空的了,就不用進行以當前結點右孩子為根結點自身調用,直接輸出當前結點的權值。經過這些操作后所輸出的序列就是二叉樹按照后續遍歷所得出的序列了。

四、個人總結

4.1課程設計中遇到的問題

每一個人,做每一件事情,哪怕是再小的事情都不是說你想做,就馬上能夠完成,取得成功。在做的過程之中,或多或少,我們都會遇到一些問題。當然,在這次課程設計之中,我也遇到了很多的問題,具體的問題有如下幾個方面:

編寫代碼時出現的問題:(1)在剛開始做題目的時候,我還以為是要構建一般的二叉樹,而不是完全二叉樹。

(2)在編程之前,我沒有多加思考就決定將創建二叉樹之間的邏輯關系用指針來表示,可是做起來的時候才發現如果堅持用指針表示的話雖然可以動態分配內存空間,從而達到減少類存空間的效果。但是這樣做就會給用戶在操作上帶來比較大的麻煩。因此用指針來實現邏輯關系,想來想去都不知道在創建二叉樹輸入權值的時候應該怎么樣一次性輸入所有的權值。

寫說明書時出現的問題:

21(1)在畫流程圖的時候,我畫得很快,一下子就畫完了幾個。但是在畫圖之前我完全沒有留意到流程圖的是與寫程序有很大的區別。因為在別人還沒有看過我們所編的程序之前再看我們畫的流程圖的時候可以很容易而且明確地明白我們的程序要實現的是一些怎么樣的操作,但是當我看了看自己畫的流程圖的時候,才猛然發現我自己畫的流程圖簡直就是我所編的那個程序的翻版,只不過是少了一點點字母,多了一點點中文而已。如果真的要找人來看,我敢打賭別人肯定很難完全明白我要實現一些怎么樣的操作。

4.2對應問題的解決辦法

編寫代碼時出現的問題:(1)在經過好一番的折騰和苦思冥想,還沒有得到一個比較方便,比較簡單的方法之后,我終于決定靜下心來再重新研究一下題目究竟要求我們實現一些怎樣的操作,而題目中又隱含了什么提示和條件。再從新看和研究完題目之后,在題目 “利用完全二叉樹的性質建立一棵二叉樹”中的利用完全二叉樹的性質給了我莫大的幫助。這時候我才明白原來題目提示我們這個題目要構建的其實是完全二叉樹這個模型,而不是一般的二叉樹。對于我自己而言,構建完全二叉樹遠比構建一般的二叉樹簡單得多,而且考慮的情況也會少很多。

(2)不錯,指針所建立的邏輯關系的確對計算機內部的系統帶來了比較多的好處,但是,相比較而言,我覺得還是讓用戶覺得我所編寫的程序操作簡單一點比較重要。因此,我回顧這書上老師所講過用來表示數據結構的方法究竟有哪一些。當時,我第一時間就想到了數組,雖然用數組做創建出來的二叉樹所占用的內存空間是要比用指針創建出來的二叉樹需要的內存空間大一點,但是,他就勝在操作簡單、方便。而且如果用數組的話,還可以讓用戶在創建二叉樹的時候按照順序一次性的將創建完全二叉樹所需要的權值一次性的按順序輸入到對應的位置之中,同時還可以實現與指針構建出來的二叉樹一樣的邏輯關系。

寫說明書時出現的問題

(1)鑒于我一開始所畫的那幾個流程圖太不符合流程圖的要求,沒有辦法,我只好將已有的流程圖框架之上將所有的陳述盡量用文字的意思表述出來。在修改完成之后,我自己還要再看一次看滿不滿足要求。4.3程序中的得意之處

對于我自己所編寫的這個程序,雖然不一定是最好的,但是它還是讓我覺得比較滿意,有較多的優點,具體有如下機點:

(1)首先,本程序是采用結構體來定義結點的數據類型,方便,而且明了地表明結點與其左右孩子之間的邏輯關系;

(2)而且,本程序采用目錄菜單的方式。用戶只要根據目錄菜單上的選擇提示就可以輕松方便地多次使用相應操作,直到選擇結束的操作才會退出整個程序。

(3)同時,我在實現前序、中序和后序遍歷完全二叉樹子函數的時候,用到了函數的遞歸調用,使源代碼容易了解,而且還大大地縮短了程序的長度。4.4設計中存在的不足及改進方法

(1)如果程序的操作對象從完全二叉樹推廣到一般的二叉樹,那樣程序就會更加完善。如果要實現的話,我會用函數調用來實現:

如果當前結點有左孩子:遞歸調用創建二叉樹函數creat(lchild);如果當前結點有右孩子:creat(rchild);這樣進行創建二叉樹,達到一定條件之后就退出操作。或者用二維數組也可以實現操作。

(2)在做該數據結構的課程設計題目的時候,我一開始想快一點寫完程序因此忽略了很多可以優化的細節。我如今覺得便于用戶使用固然是重要,但是如果還能夠動態分配內存空間就更好了。因此,后來我在原有的程序基礎上編了如下的程序,既可以一次性輸入所有的權值,而且還可以根據用戶的需要進行動態分配內存空間【優化版二叉樹相關程序可運行】: #include“stdio.h” #include“stdlib.h” #include“malloc.h” 23 #include“string.h” #include“limits.h” typedef struct BiTNode{ int c;//權值

struct BiTNode *lchild,*rchild;}BiTNode,*tree;int jie;//二叉樹的結點

tree creat(tree p)//創建二叉樹函數 {

int i,j;printf(“需要輸入權值個數:n”);scanf(“%d”,&j);jie=j;if(j<8)

//判斷二叉樹是否達到4層

{

printf(“錯誤:二叉樹的層數少于4層!n”);

return(p);} p=(tree)malloc(j*sizeof(struct BiTNode));//動態分配內存空間,一次性分配用戶所需的內存空間

printf(“開始輸入權值(權值取值范圍0--1000):n”);//限定了權值的取值范圍

for(i=1;i<=j;i=i+1)//權值的錄入

{

scanf(“%d”,&p[i].c);

p[i].lchild=&p[2*i];

p[i].rchild=&p[2*i+1];} printf(“成功創建二叉樹n”);return(p);} int leaves(tree p)//統計葉子個數函數 { int l,i;l=0;for(i=1;i

//計算二叉樹結點的個數

{

l++;} l++;if((l%2))

//判斷結點的奇偶性從而計算葉子的個數 {

return(((l-1)/2)+1);} else

return(l/2);

} int deep(tree p)//求二叉樹的深度 { int d,i,sum;sum=1;for(i=1;i

for(d=1;sum<=i;d++)

//求出二叉樹的深度

{

if(d!=1)

{

sum=sum+sum*2;

} } if(d%2){

return(d-1);} else {

return(d);}

} void qian(int a,tree p)//前序遍歷輸出列表{ if((p[a].c>=0)&&(p[a].c<=1000)){

printf(“%d,”,p[a].c);

//首先輸出當前結點(根節點)的權值

qian(a*2,p);

qian(a*2+1,p);} else

return;}

void zhong(int a,tree p)//中序遍歷輸出列表 { if((p[2*a].c>=0)&&(p[2*a].c<=1000)){

zhong((2*a),p);

} printf(“%d,”,p[a].c);//輸出當前結點的權值

if((p[2*a+1].c>=0)&&(p[2*a+1].c<=1000)){

zhong((2*a+1),p);}

} void hou(int a,tree p)//后序遍歷輸出序列 { if((p[2*a].c>=0)&&(p[2*a].c<=1000)){

hou((2*a),p);} if((p[2*a+1].c>=0)&&(p[2*a+1].c)<=1000){

hou((2*a+1),p);} printf(“%d,”,p[a].c);//輸出當前結點的權值 } void main(){ int d,l,i;tree p;i=10;p=(tree)malloc(sizeof(struct BiTNode));printf(“******************目錄******************n”);printf(“

1、創建二叉樹n”);printf(“

2、統計葉子個數n”);printf(“

3、求二叉樹的深度n”);printf(“

4、前序遍歷輸出列表n”);printf(“

5、中序遍歷輸出列表n”);printf(“

6、后序遍歷輸出序列n”);printf(“0、退出操作n”);printf(“*****************************************n”);while(i!=0){

printf(“選擇操作:n”);

scanf(“%d”,&i);

if(i==0)

{

break;

}

else if(i==1)

{

printf(“開始創建二叉樹(層數不少于4層)n”);

p=creat(p);

}

else if(i==2)

{ l=leaves(p);

printf(“葉子個數為:%dn”,l);

}

else if(i==3)

{

d=deep(p);

printf(“二叉樹的深度是%dn”,d);

}

else if(i==4)

{

printf(“用前序遍歷輸出的結果是:n”);

qian(1,p);

printf(“n”);

}

else if(i==5)

{

printf(“用中序遍歷輸出的結果是:n”);

zhong(1,p);

printf(“n”);

}

else if(i==6)

{

printf(“用后序遍歷輸出的結果是:n”);

hou(1,p);

printf(“n”);

}

else

printf(“錯誤:沒有該操作!n”);} printf(“歡迎使用!n”);} 4.5設計中的感想以及心得體會

在每一次做課程設計的時候,我都會覺得獲益良多,當然,這次的數據結構課程設計也不會有例外。在這一次課程設計過程中,我嘗試了用錯數據結構所給我帶來的郁悶,因為有一點小小問題而不可以使程序繼續運行的糾結,寫課程設計任務書不規范再從新編排而帶來的傷感,當然,同時還會感覺到一個個子函數通過編譯然后得出正確結果的無限欣喜,看著數據結構課程設計任務書一點點增加時所帶來的成就感,還有想到一些更好的改進方法時所帶來的愉悅感等等。再設計的過程之中,各種各樣的情感交織在一起,真的是痛并快樂著。

當然,長時間的專注在數據結構的課程設計之中讓我我在編寫程序和鞏固數據結構知識這兩個方面都有了很大的收獲。

我還記得我在做之前的C語言課程設計,以及上一學期的數據結構的實驗之前都要很認真地看書上要管操作的源代碼之后才編寫程序的。我覺得如果我這次數據結構的課程設計我還是這樣做的話,對于我自己就很難會有所提升,而且我看過題目之后,我所要做的那道課程設計題目其實跟我之前所做的那些數據結構實驗內容有點出入,因此,我這一次想要突破自己,嘗試一下在不看相關代碼的情況下用自己所有的知識編寫屬于自己操作實現的代碼。當然,用這樣的方法編寫代碼,讓我在設計的過程之中增加了不少麻煩,但我從來不會覺得后悔。也因為這樣,我對自己所編出來的程序更加了解,印象更加深刻,更便于我對程序作修改以及優化。

我在開始寫整一個程序的時候,會先把程序總體的結構、大概的框架都寫出來(包括要創建的結構體,各個子函數(不包括各內容實現的代碼)和主函數與子函數之間的邏輯關系)。寫完總體框架之后,我再寫完一個子函數就馬上編譯運行一下程序,看看新寫的子函數有沒有問題,如果有的話就針對新寫的函數段進行修改,直至沒有錯誤,以及運行結果正確之后才去編寫下一個子函數。我發現這次課程設計用了這個方法之后,我在編寫程序的時候條理清晰了很多,編寫程序很順利,就損友出現錯誤,很快就能夠找到出錯的地方,也沒有出現那一種因為一兩個小錯誤就修改了一整個晚上的情況了。

同時,這次我在設計的時候,遇到了想不明白的時候,我總會用一張紙將我 30 創建的完全二叉樹畫在紙上,認認真真的分析我要實現的操作與我所創建的完全二叉樹究竟有什么邏輯上的關系,然后再從關系上找出實現對應操作的方法。這樣雖然在分析的時候會耗掉一點時間,可是,卻讓我很順利地實現程序,讓我真真正正的明白什么叫做“磨刀不誤砍柴工”。

最后,我覺得這次的數據結構課程設計不僅讓我鞏固了數據結構的知識,更重要的是讓我領悟到了一套適合自己編寫程序的方法,使我以后編程都更加得心應手。

第二篇:2012數據結構課程設計

數 據 結 構

課程設計報告

題 目: 一元多項式計算 專 業: 信息管理與信息系統 班 級: 2012級普本班 學 號: 201201011367 姓 名: 左帥帥 指導老師: 郝慎學 時 間:

一、課程設計題目分析

本課程設計要求利用C語言或C++編寫,本程序實現了一元多項式的加法、減法、乘法、除法運算等功能。

二、設計思路

本程序采用C語言來完成課程設計。

1、首先,利用順序存儲結構來構造兩個存儲多項式A(x)和 B(x)的結構。

2、然后把輸入,加,減,乘,除運算分成五個主要的模塊:實現多項式輸入模塊、實現加法的模塊、實現減法的模塊、實現乘法的模塊、實現除法的模塊。

3、然后各個模塊里面還要分成若干種情況來考慮并通過函數的嵌套調用來實現其功能,盡量減少程序運行時錯誤的出現。

4、最后編寫main()主函數以實現對多項式輸入輸出以及加、減、乘、除,調試程序并將不足的地方加以修改。

三、設計算法分析

1、相關函數說明:

(1)定義數據結構類型為線性表的鏈式存儲結構類型變量

typedef struct Polynomial{}

(2)其他功能函數

插入函數void Insert(Polyn p,Polyn h)

比較函數int compare(Polyn a,Polyn b)

建立一元多項式函數Polyn Create(Polyn head,int m)

求解并建立多項式a+b,Polyn Add(Polyn pa,Polyn pb)

求解并建立多項式a-b,Polyn Subtract(Polyn pa,Polyn pb)2

求解并建立多項式a*b,Polyn Multiply(Polyn pa,Polyn pb)

求解并建立多項式a/b,void Device(Polyn pa,Polyn pb)

輸出函數輸出多項式,void Print(Polyn P)

銷毀多項式函數釋放內存,void Destroy(Polyn p)

主函數,void main()

2、主程序的流程基函數調用說明(1)typedef struct Polynomial {

float coef;

int expn;

struct Polynomial *next;} *Polyn,Polynomial;

在這個結構體變量中coef表示每一項前的系數,expn表示每一項的指數,polyn為結點指針類型,屬于抽象數據類型通常由用戶自行定義,Polynomial表示的是結構體中的數據對象名。

(2)當用戶輸入兩個一元多項式的系數和指數后,建立鏈表,存儲這兩個多項式,主要說明如下:

Polyn CreatePolyn(Polyn head,int m)建立一個頭指針為head、項數為m的一元多項式

p=head=(Polyn)malloc(sizeof(struct Polynomial));為輸入的多項式申請足夠的存儲空間

p=(Polyn)malloc(sizeof(struct Polynomial));建立新結點以接收數據

Insert(p,head);調用Insert函數插入結點

這就建立一元多項式的關鍵步驟

(3)由于多項式的系數和指數都是隨即輸入的,所以根據要求需要對多項式按指數進行降冪排序。在這個程序模塊中,使用鏈表,根據對指數大小的比較,對各種情況進行處理,此處由于反復使用指針對各個結點進行定位,找到合適的位置再利用void Insert(Polyn p,Polyn h)進行插入操作。(4)加、減、乘、除、的算法實現:

在該程序中,最關鍵的一步是實現四則運算和輸出,由于加減算法原則是一樣,減法可通過系數為負的加法實現;對于乘除算法的大致流程都是:首先建立多項式a*b,a/b,然后使用鏈表存儲所求出的乘積,商和余數。這就實現了多項式計算模塊的主要功能。

(5)另一個子函數是輸出函數 PrintPolyn();

輸出最終的結果,算法是將最后計算合并的鏈表逐個結點依次輸出,便得到整鏈表,也就是最后的計算式計算結果。由于考慮各個結點的指數情況不同,分別進行了判斷處理。

四、程序新點

通過多次寫程序,發現在程序在控制臺運行時總是黑色的,本次寫程序就想著改變一下,于是經過查資料利用system(“Color E0”);可以函數解決,這里“E0,”E是控制臺背景顏色,0是控制臺輸出字體顏色。

五、設計中遇到的問題及解決辦法

首先是,由于此次課程設計里使用指針使用比較多,自己在指針多的時候易腦子混亂出錯,對于此問題我是采取比較笨的辦法在稿紙上寫明白后開始進行 4

代碼編寫。

其次是,在寫除法模塊時比較復雜,自己通過查資料最后成功寫出除法模塊功能。

最后是,前期分析不足開始急于寫代碼,中途出現各種問題,算是給自己以后設計時的一個經驗吧。

六、測試(程序截圖)

1.數據輸入及主菜單

2.加法和減法模塊

3.乘法和除法模塊

七、總結

通過本次應用C語言設計一元多項式基本計算程序,使我更加鞏固了C語言程序設計的知識,以前對指針這一點使用是比較模糊,現在通過此次課程設計對指針理解的比較深刻了。而且對于數據結構的相關算法和函數的調用方面知識的加深。本次的課程設計,一方面提高了自己獨立思考處理問題的能力;另一方面使自己再設計開發程序方面有了一定的小經驗和想法,對自己以后學習其他語言程序設計奠定了一定的基礎。

八、指導老師評語及成績

附錄:(課程設計代碼)

#include #include #include typedef struct Polynomial {

float coef;6

int expn;

struct Polynomial *next;} *Polyn,Polynomial;

//Polyn為結點指針類型 void Insert(Polyn p,Polyn h){

if(p->coef==0)free(p);

//系數為0的話釋放結點

else

{

Polyn q1,q2;

q1=h;q2=h->next;

while(q2&&p->expnexpn)//查找插入位置

{

q1=q2;q2=q2->next;}

if(q2&&p->expn==q2->expn)//將指數相同相合并 {

q2->coef+=p->coef;

free(p);

if(!q2->coef)//系數為0的話釋放結點

{ q1->next=q2->next;free(q2);}

}

else { p->next=q2;q1->next=p;

}//指數為新時將結點插入

} 7

} //建立一個頭指針為head、項數為m的一元多項式 Polyn Create(Polyn head,int m){

int i;

Polyn p;

p=head=(Polyn)malloc(sizeof(struct Polynomial));

head->next=NULL;

for(i=0;i

{

p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結點以接收數據

printf(“請輸入第%d項的系數與指數:”,i+1);

scanf(“%f %d”,&p->coef,&p->expn);

Insert(p,head);

//調用Insert函數插入結點

}

return head;} //銷毀多項式p void Destroy(Polyn p){

Polyn q1,q2;

q1=p->next;8

q2=q1->next;

while(q1->next)

{

free(q1);

q1=q2;//指針后移

q2=q2->next;

} } //輸出多項式p int Print(Polyn P){

Polyn q=P->next;

int flag=1;//項數計數器

if(!q)//若多項式為空,輸出0

{

putchar('0');

printf(“n”);

return;

}

while(q)

{

if(q->coef>0&&flag!=1)putchar('+');//系數大于0且不是第一項 9

if(q->coef!=1&&q->coef!=-1)//系數非1或-1的普通情況

{

printf(“%g”,q->coef);

if(q->expn==1)putchar('X');

else if(q->expn)printf(“X^%d”,q->expn);

}

else

{

if(q->coef==1){

if(!q->expn)putchar('1');

else if(q->expn==1)putchar('X');

else printf(“X^%d”,q->expn);}

if(q->coef==-1){

if(!q->expn)printf(“-1”);

else if(q->expn==1)printf(“-X”);

else printf(“-X^%d”,q->expn);}

}

q=q->next;

flag++;

}

printf(“n”);} int compare(Polyn a,Polyn b){

if(a&&b)

{

if(!b||a->expn>b->expn)return 1;

else if(!a||a->expnexpn)return-1;

else return 0;

}

else if(!a&&b)return-1;//a多項式已空,但b多項式非空

else return 1;//b多項式已空,但a多項式非空 } //求解并建立多項式a+b,返回其頭指針 Polyn Add(Polyn pa,Polyn pb){

Polyn qa=pa->next;

Polyn qb=pb->next;

Polyn headc,hc,qc;

hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點 11

hc->next=NULL;

headc=hc;

while(qa||qb){

qc=(Polyn)malloc(sizeof(struct Polynomial));

switch(compare(qa,qb))

{

case 1:

qc->coef=qa->coef;

qc->expn=qa->expn;

qa=qa->next;

break;

case 0:

qc->coef=qa->coef+qb->coef;

qc->expn=qa->expn;

qa=qa->next;

qb=qb->next;

break;

case-1:

qc->coef=qb->coef;

qc->expn=qb->expn;

qb=qb->next;

break;12

}

if(qc->coef!=0)

{

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

else free(qc);//當相加系數為0時,釋放該結點

}

return headc;} //求解并建立多項式a-b,返回其頭指針 Polyn Subtract(Polyn pa,Polyn pb){

Polyn h=pb;

Polyn p=pb->next;

Polyn pd;

while(p)//將pb的系數取反

{ p->coef*=-1;p=p->next;}

pd=Add(pa,h);

for(p=h->next;p;p=p->next)

//恢復pb的系數

p->coef*=-1;13

return pd;} //求解并建立多項式a*b,返回其頭指針 Polyn Multiply(Polyn pa,Polyn pb){

Polyn hf,pf;

Polyn qa=pa->next;

Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點

hf->next=NULL;

for(;qa;qa=qa->next)

{

for(qb=pb->next;qb;qb=qb->next)

{

pf=(Polyn)malloc(sizeof(struct Polynomial));

pf->coef=qa->coef*qb->coef;

pf->expn=qa->expn+qb->expn;

Insert(pf,hf);//調用Insert函數以合并指數相同的項

}

}

return hf;}

//求解并建立多項式a/b,返回其頭指針 void Device(Polyn pa,Polyn pb){

Polyn hf,pf,temp1,temp2;

Polyn qa=pa->next;

Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點,存儲商

hf->next=NULL;

pf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點,存儲余數

pf->next=NULL;

temp1=(Polyn)malloc(sizeof(struct Polynomial));

temp1->next=NULL;

temp2=(Polyn)malloc(sizeof(struct Polynomial));

temp2->next=NULL;

temp1=Add(temp1,pa);

while(qa!=NULL&&qa->expn>=qb->expn)

{

temp2->next=(Polyn)malloc(sizeof(struct Polynomial));

temp2->next->coef=(qa->coef)/(qb->coef);

temp2->next->expn=(qa->expn)-(qb->expn);

Insert(temp2->next,hf);

pa=Subtract(pa,Multiply(pb,temp2));15

qa=pa->next;

temp2->next=NULL;

}

pf=Subtract(temp1,Multiply(hf,pb));

pb=temp1;

printf(“商是:”);

Print(hf);

printf(“余數是:”);

Print(pf);} void main(){ int choose=1;int m,n,flag=0;system(“Color E0”);Polyn pa=0,pb=0,pc,pd,pf;//定義各式的頭指針,pa與pb在使用前付初值NULL printf(“請輸入A(x)的項數:”);scanf(“%d”,&m);printf(“n”);pa=Create(pa,m);//建立多項式A printf(“n”);printf(“請輸入B(x)的項數:”);16

scanf(“%d”,&n);printf(“n”);pb=Create(pb,n);//建立多項式B printf(“n”);printf(“**********************************************n”);printf(“*

多項式操作菜單

printf(”**********************************************n“);printf(”tt 1.輸出操作n“);printf(”tt 2.加法操作n“);printf(”tt 3.減法操作n“);printf(”tt 4.乘法操作n“);printf(”tt 5.除法操作n“);printf(”tt 6.退出操作n“);printf(”**********************************************n“);while(choose){

printf(”執行操作:“);

scanf(”%d“,&flag);

switch(flag)

{

case 1:

printf(”多項式A(x):“);Print(pa);*n”);

printf(“多項式B(x):”);Print(pb);

break;

case 2:

pc=Add(pa,pb);

printf(“多項式A(x)+B(x):”);Print(pc);

Destroy(pc);break;

case 3:

pd=Subtract(pa,pb);

printf(“多項式A(x)-B(x):”);Print(pd);

Destroy(pd);break;

case 4:

pf=Multiply(pa,pb);

printf(“多項式A(x)*B(x):”);

Print(pf);

Destroy(pf);

break;

case 5:

Device(pa,pb);18

break;

case 6:

exit(0);

break;

} }

Destroy(pa);

Destroy(pb);}

第三篇:數據結構課程設計

數據結構課程設計

1.赫夫曼編碼器

設計一個利用赫夫曼算法的編碼和譯碼系統,重復地顯示并處理以下項目,直到選擇退出為止。要求:

1)將權值數據存放在數據文件(文件名為data.txt,位于執行程序的當前目錄中)

2)初始化:鍵盤輸入字符集大小26、26個字符和26個權值(統計一篇英文文章中26個字母),建立哈夫曼樹;

3)編碼:利用建好的哈夫曼樹生成哈夫曼編碼;

4)輸出編碼(首先實現屏幕輸出,然后實現文件輸出); 5)界面優化設計。

代碼如下:

#include #include #include #include #define N 200

typedef struct HTNode

//結構體 { int Weight;

char ch;int Parent,Lchild,Rchild;}HTNode;typedef char * * HCode;

void Save(int n,HTNode *HT)

//把權值保存到文件 {

FILE * fp;

int i;

if((fp=fopen(“data.txt”,“wb”))==NULL)

{

printf(“cannot open filen”);

return;

}

for(i=0;i

if(fwrite(&HT[i].Weight,sizeof(struct HTNode),1,fp)!=1)

printf(“file write errorn”);

fclose(fp);

system(“cls”);

printf(“保存成功!”);

}

void Create_H(int n,int m,HTNode *HT)

//建立赫夫曼樹,進行編碼 {

int w,k,j;char c;for(k=1;k<=m;k++){

if(k<=n)

{

printf(“n請輸入權值和字符(用空格隔開): ”);

scanf(“%d”,&w);

scanf(“ %c”,&c);HT[k].ch=c;

HT[k].Weight=w;

}

else HT[k].Weight=0;

HT[k].Parent=HT[k].Lchild=HT[k].Rchild=0;}

int p1,p2,w1,w2;

for(k=n+1;k<=m;k++){

p1=0;p2=0;

w1=32767;w2=32767;

for(j=1;j<=k-1;j++)

{

if(HT[j].Parent==0)

{

if(HT[j].Weight

{

w2=w1;p2=p1;

w1=HT[j].Weight;

p1=j;

}

else if(HT[j].Weight

{

w2=HT[j].Weight;

p2=j;

}

}

} HT[k].Lchild=p1;HT[k].Rchild=p2;HT[k].Weight=HT[p1].Weight+HT[p2].Weight;

HT[p1].Parent=k;HT[p2].Parent=k;

} printf(“輸入成功!”);}

void Coding_H(int n,HTNode *HT)

//對結點進行譯碼 { int k,sp,fp,p;char *cd;HCode HC;

HC=(HCode)malloc((n+1)*sizeof(char *));

cd=(char *)malloc(n*sizeof(char));cd[n-1]='

主站蜘蛛池模板: 人妻av乱片av出轨| 免费无码成人av电影在线播放| 成人亚洲欧美日韩在线观看| 人人操人人妻| 日本va欧美va欧美va精品| 中文字幕亚洲综合久久菠萝蜜| 亚洲精品无码永久在线观看性色| 国产无av码在线观看| 成人精品一区二区三区中文字幕| 老熟女高潮一区二区三区| 中文成人在线| 国产av一区二区精品久久凹凸| av成人无码无在线观看| 一个添下面两个吃奶把腿扒开| 欧美孕妇xxxx做受欧美88| 久久99精品久久只有精品| 自拍偷自拍亚洲精品播放| 无码av无码天堂资源网| 欧洲成人一区二区三区| 人妻换着玩又刺激又爽| 中文字幕亚洲综合久久菠萝蜜| 丁香五月天综合缴情网| 两个人日本www免费版| 67194熟妇人妻欧美日韩| 国产精品久久久| 中文字幕人乱码中文| 免费国产女王调教在线视频| 大香伊蕉在人线国产av| 日韩激情电影一区二区在线| 成人国产一区二区三区| 久久精品国内一区二区三区| 综合久久国产九一剧情麻豆| 精品无人区一区二区三区在线| 蜜臀亚洲精品国产aⅴ综合第一| 国产精品亚洲精品一区二区| 国产精品久久久久影院老司| 国产肉体xxxx裸体784大胆| 亚洲精品无码成人av电影网| 亚洲va成无码人在线观看天堂| 久久欧美一区二区三区性牲奴| 欧美成人a在线网站|