2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩23頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  課程設(shè)計(jì)</b></p><p>  2009 ~ 2010學(xué)年第二學(xué)期</p><p>  設(shè)計(jì)題目 文章編輯、猴子選大王、建立二叉樹、拓?fù)渑判颉⒏鞣N排序 </p><p><b>  目錄</b></p><

2、;p>  1、目的與要求2</p><p>  2、課程設(shè)計(jì)內(nèi)容說明3</p><p>  2.1主菜單界面:3</p><p>  2.2項(xiàng)目一:文章編輯**3</p><p>  2.3項(xiàng)目二:猴子選大王**4</p><p>  2.4項(xiàng)目三:建立二叉樹,層序、先序遍歷**6<

3、/p><p>  2.5項(xiàng)目四:拓?fù)渑判?</p><p>  2.6項(xiàng)目五:各種排序:插入排序和改進(jìn)冒泡排序算法10</p><p>  5、結(jié)論及體會(huì)14</p><p><b>  6、附錄14</b></p><p><b>  目的與要求</b><

4、/p><p>  鞏固和加深對(duì)常見數(shù)據(jù)結(jié)構(gòu)的理解和掌握</p><p>  掌握基于數(shù)據(jù)結(jié)構(gòu)進(jìn)行算法設(shè)計(jì)的基本方法</p><p>  掌握用高級(jí)語言實(shí)現(xiàn)算法的基本技能</p><p>  掌握書寫程序設(shè)計(jì)說明文檔的能力</p><p>  提高運(yùn)用數(shù)據(jù)結(jié)構(gòu)知識(shí)及高級(jí)語言解決非數(shù)值實(shí)際問題的能力</p>&l

5、t;p><b>  課程設(shè)計(jì)內(nèi)容說明</b></p><p><b>  主菜單界面:</b></p><p>  項(xiàng)目一:文章編輯**</p><p>  (1)功能:輸入一頁(yè)文字,程序可以統(tǒng)計(jì)出文字、數(shù)字、空格的個(gè)數(shù)。</p><p>  靜態(tài)存儲(chǔ)一頁(yè)文章,每行最多不超過80個(gè)字符,共N行

6、;要求(1)分別統(tǒng)計(jì)出其中英文字母數(shù)和空格數(shù)及整篇文章總字?jǐn)?shù);(2)統(tǒng)計(jì)某一字符串在文章中出現(xiàn)的次數(shù),并輸出該次數(shù);(3)刪除某一子串,并將后面的字符前移。</p><p>  存儲(chǔ)結(jié)構(gòu)使用線性表,分別用幾個(gè)子函數(shù)實(shí)現(xiàn)相應(yīng)的功能;</p><p>  輸入數(shù)據(jù)的形式和范圍:可以輸入大寫、小寫的英文字母、任何數(shù)字及標(biāo)點(diǎn)符號(hào)。</p><p>  輸出形式:(1)分行輸

7、出用戶輸入的各行字符;(2)分4行輸出"全部字母數(shù)"、"數(shù)字個(gè)數(shù)"、"空格個(gè)數(shù)"、"文章總字?jǐn)?shù)"(3)輸出刪除某一字符串后的文章;</p><p> ?。?)程序的輸入輸出描述:</p><p><b>  進(jìn)入應(yīng)用程序:</b></p><p><b>

8、 ?。?)輸入文章:</b></p><p><b>  (2)查找:</b></p><p> ?。?)刪除:原文為:QuYing111,刪除Y后為:Quing111</p><p> ?。?)尚未解決的問題或改進(jìn)方向</p><p>  這個(gè)文章編輯的缺點(diǎn)在于無法統(tǒng)計(jì)空格數(shù),只能夠統(tǒng)計(jì)大小寫字母以及數(shù)字&

9、lt;/p><p> ?。?)對(duì)軟件的使用說明</p><p>  在CFree4.0下打開軟件,進(jìn)行操作</p><p>  項(xiàng)目二:猴子選大王**</p><p>  對(duì)設(shè)計(jì)任務(wù)內(nèi)容的概述</p><p>  一堆猴子都有編號(hào),編號(hào)是1,2,3 ...m ,這群猴子(m個(gè))按照1-m的順序圍坐一圈,從第1開始數(shù),每數(shù)到

10、第N個(gè),該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最后一只猴子,則該猴子為大王。</p><p><b>  需求分析或功能描述</b></p><p>  輸入數(shù)據(jù):輸入m,n m,n 為整數(shù),n<m</p><p>  輸出形式:中文提示按照m個(gè)猴子,數(shù)n 個(gè)數(shù)的方法,輸出為大王的猴子是幾號(hào) ,建立一個(gè)函數(shù)來實(shí)現(xiàn)此功能。<

11、/p><p><b>  程序輸入輸出描述:</b></p><p><b>  開始程序:</b></p><p><b>  部分程序代碼:</b></p><p>  #define MaxSize 50</p><p>  int houzi(int

12、 n,int m)</p><p><b>  {</b></p><p>  int p[MaxSize];</p><p>  int i,j,t;</p><p>  for(i=0;i<n;i++)</p><p><b>  p[i]=i+1;</b><

13、/p><p><b>  t=0;</b></p><p>  printf("\n出列順序:");</p><p>  for(i=n;i>=1;i--)</p><p><b>  {</b></p><p>  t=(t+m-1)%i;</p

14、><p>  printf("%d",p[t]);</p><p>  for(j=t+1;j<=i-1;j++)</p><p>  p[j-1]=p[j];</p><p>  } printf("\n");</p><p>  printf("\n故編號(hào) %d

15、 的猴子是大王!\n",p[t]);</p><p>  printf("\n");</p><p><b>  }</b></p><p>  項(xiàng)目三:建立二叉樹,層序、先序遍歷**</p><p>  (1)對(duì)設(shè)計(jì)任務(wù)內(nèi)容的概述</p><p>  要求能夠輸入樹

16、的各個(gè)結(jié)點(diǎn),并能夠輸出用不同方法遍歷的遍歷序列;分別建立建立二叉樹存儲(chǔ)結(jié)構(gòu)的的輸入函數(shù)、輸出層序遍歷序列的函數(shù)、輸出先序遍歷序列的函數(shù);</p><p> ?。?)需求分析或功能描述</p><p>  程序功能包括,建立二叉樹,輸出二叉樹,對(duì)二叉樹進(jìn)行層次遍歷和先序遍歷。</p><p> ?。?)概要設(shè)計(jì)或程序流程圖</p><p>  

17、進(jìn)入程序,選擇菜單,1創(chuàng)建二叉樹,在程序中進(jìn)行構(gòu)造二叉樹,并輸出創(chuàng)建好的二叉樹,2層次遍歷二叉樹,輸出二叉樹的層次遍歷序列,3先序遍歷二叉樹,輸出二叉樹的先序遍歷序列。</p><p> ?。?)詳細(xì)設(shè)計(jì)或源代碼說明</p><p>  創(chuàng)建二叉樹CreateBTNode(*b,*str)。根據(jù)二叉樹括號(hào)表示的字符串*str生成對(duì)應(yīng)的二叉鏈存儲(chǔ)結(jié)構(gòu),用ch掃描采用括號(hào)表示法表示二叉樹的字符

18、串。輸出二叉樹,以括號(hào)表示法輸出一棵二叉樹。先序遍歷二叉樹的過程是,訪問根結(jié)點(diǎn),先序遍歷左子樹,先序遍歷右子樹。層次遍歷的過程是,先將根結(jié)點(diǎn)進(jìn)隊(duì),在隊(duì)不為空時(shí)循環(huán),從隊(duì)列中出列一個(gè)結(jié)點(diǎn)*p,訪問它,若它有左孩子結(jié)點(diǎn),如此操作直到隊(duì)空為止。 </p><p>  (5)程序模塊及其接口描述</p><p>  typedef char ElemType;</p><p&g

19、t;  typedef struct node</p><p><b>  {</b></p><p>  ElemType data;//數(shù)據(jù)元素 </p><p>  struct node *lchild;//指向左孩子 </p><p>  struct node *rchild;//指向右孩子 </p&g

20、t;<p><b>  }BTNode;</b></p><p>  void CreateBTNode(BTNode *&b,char *str)//由str串創(chuàng)建二叉鏈</p><p>  void DispBTNode(BTNode *b)//以括號(hào)表示法輸出二叉樹</p><p>  void TravLevel

21、(BTNode *b)//層次遍歷</p><p>  void PreOrder(BTNode *b)//先序遍歷的遞歸算法</p><p> ?。?)程序的輸入與輸出描述</p><p><b>  輸入界面:</b></p><p><b>  輸出界面:</b></p><

22、;p>  (7)調(diào)試分析或程序測(cè)試</p><p> ?。?)尚未解決的問題或改進(jìn)方向</p><p>  因?yàn)楸境绦蜃罱K要與其他兩個(gè)程序合并在一起,在主界面進(jìn)行選擇。所以在進(jìn)入主界面時(shí)要在本程序的主函數(shù)處修改字符,否則在調(diào)用本程序時(shí)主函數(shù)會(huì)發(fā)生沖突。</p><p>  (9)對(duì)軟件的使用說明</p><p>  在CFree4.0下

23、打開軟件,進(jìn)行操作。</p><p><b>  項(xiàng)目四:拓?fù)渑判?lt;/b></p><p>  對(duì)設(shè)計(jì)任務(wù)內(nèi)容的概述</p><p>  編寫函數(shù),實(shí)現(xiàn)圖的拓?fù)渑判颉?lt;/p><p><b>  需求分析或功能描述</b></p><p>  在一個(gè)有向圖中找一個(gè)拓?fù)湫蛄械倪^

24、程稱為拓?fù)渑判?,而每一個(gè)有向圖的拓?fù)湫蛄胁⒉晃ㄒ?,本程序的功能就是將用戶輸入的序列進(jìn)行拓?fù)渑判颉?lt;/p><p>  概要設(shè)計(jì)或程序流程圖</p><p>  在程序菜單中選擇開始,輸入有向圖的結(jié)點(diǎn)數(shù)和邊數(shù),此時(shí)程序就會(huì)輸出結(jié)點(diǎn)信息,如v1,v2,v3等,接下來會(huì)要求用戶輸入第一條邊的起點(diǎn)和終點(diǎn),通過程序運(yùn)行就可以輸出拓?fù)渑判蚪Y(jié)果。</p><p>  詳細(xì)設(shè)計(jì)或源

25、代碼說明</p><p>  對(duì)于給定的有向圖,采用鄰接表作為存儲(chǔ)結(jié)構(gòu),為每個(gè)頂點(diǎn)設(shè)置一個(gè)鏈表,每個(gè)鏈表有一個(gè)表頭結(jié)點(diǎn),這些表頭結(jié)點(diǎn)構(gòu)成一個(gè)數(shù)組,表頭結(jié)點(diǎn)中增加一個(gè)存放頂點(diǎn)入度的域count,在執(zhí)行拓?fù)渑判虻倪^程中,當(dāng)某個(gè)頂點(diǎn)的入度為0(沒有前驅(qū)結(jié)點(diǎn)時(shí)),就將此頂點(diǎn)輸出,同時(shí)將該頂點(diǎn)的所有后繼結(jié)點(diǎn)的入度減1,為了避免重復(fù)檢測(cè)入度為0的頂點(diǎn),設(shè)立一個(gè)棧St,以存放入度為0的頂點(diǎn)。</p><p&

26、gt;  程序模塊及其接口描述</p><p>  typedef struct</p><p><b>  {</b></p><p>  int *base; //棧底 </p><p>  int *top; //棧頂 </p>

27、;<p>  int stacksize; //??臻g </p><p><b>  }Stack;</b></p><p>  int InitStack(Stack &s) //創(chuàng)建一個(gè)空棧</p><p>  int Push(Stack &s,int e)

28、 //進(jìn)棧</p><p>  bool Empty(Stack s) //查看棧是否為空</p><p>  int Pop(Stack &s) //出棧</p><p>  int LocateVex(Graph G,int v) //返回節(jié)點(diǎn)v在圖中的位置</p&

29、gt;<p>  void CreateGraph(Graph &G) //建圖 </p><p>  void TopologicalSort(Graph G) //拓?fù)渑判蚝瘮?shù)</p><p>  程序的輸入與輸出描述</p><p><b>  輸入界面:</b></p><p>

30、;  再輸入結(jié)點(diǎn)數(shù)和邊數(shù),此時(shí)會(huì)輸出頂點(diǎn)信息:</p><p><b>  排序結(jié)果輸出界面:</b></p><p><b>  調(diào)試分析或程序測(cè)試</b></p><p><b>  對(duì)軟件的使用說明</b></p><p>  在CFree4.0下打開軟件,進(jìn)行操作。&l

31、t;/p><p>  項(xiàng)目五:各種排序:插入排序和改進(jìn)冒泡排序算法</p><p>  對(duì)設(shè)計(jì)任務(wù)內(nèi)容的概述</p><p>  用程序?qū)崿F(xiàn)插入法排序、起泡法改進(jìn)算法排序;利用插入排序和冒泡法的改進(jìn)算法,將用戶隨機(jī)輸入的一列數(shù)按遞增的順序排好。輸入的數(shù)據(jù)形式為任何一個(gè)正整數(shù),大小不限。輸出的形式:數(shù)字大小逐個(gè)遞增的數(shù)列。</p><p><

32、b>  需求分析或功能描述</b></p><p>  插入排序的基本思想是:每次將一個(gè)待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子表中的適當(dāng)位置,直到每次記錄插入完成為止。本程序使用直接插入排序。</p><p>  交換排序的基本思想是:兩兩比較待排序記錄的關(guān)鍵字,發(fā)現(xiàn)兩個(gè)記錄的次序相反時(shí)即進(jìn)行交換,直到?jīng)]有反序的記錄為止。本程序使用改進(jìn)的冒泡排序算法。<

33、;/p><p>  概要設(shè)計(jì)或程序流程圖</p><p>  直接插入排序:假設(shè)待排序的記錄存放在數(shù)組R[0..n-1]中,排序過程的某一中間時(shí)刻,R被劃分成兩個(gè)子區(qū)間[0..i-1]和[i..n-1](剛開始時(shí)i=1,有序區(qū)序號(hào)只有R[0]一個(gè)記錄),其中:前一個(gè)子區(qū)間是已排好序的有序區(qū),后一個(gè)子區(qū)間則是當(dāng)前未排序的部分,不妨稱其為無序區(qū)。直接插入排序的基本操作是將當(dāng)前無序區(qū)的第一個(gè)記錄R[

34、i]插入到有序區(qū)[0..i-1]中適當(dāng)?shù)奈恢蒙?,使[0..i]變?yōu)樾碌挠行騾^(qū)。</p><p>  有序區(qū) 無序區(qū)</p><p><b>  一趟排序</b></p><p>  有序區(qū) 無序區(qū)</p><p>  直接插入排序的一趟排序過程</

35、p><p>  冒泡排序:整個(gè)算法是從最下面的記錄開始,對(duì)每?jī)蓚€(gè)相臨的關(guān)鍵字進(jìn)行比較,且使關(guān)鍵字較小的記錄換至關(guān)鍵字較大的記錄之上,使得經(jīng)過一趟冒泡排序之后,關(guān)鍵字最小的記錄到達(dá)最上端,接著,再在剩下的記錄中找關(guān)鍵字次小的記錄,并把它換在第二個(gè)位置上。依次類推,一直到所有記錄都有序?yàn)橹埂6谟行┣闆r下,在第i(i<n-1)趟時(shí)已排好序了,但仍執(zhí)行后面幾趟的比較。實(shí)際上,一旦酸法中某一趟比較時(shí)不出現(xiàn)任何記錄交換,

36、說明已經(jīng)排好序了,就可以結(jié)束本算法。為此,改進(jìn)了冒泡排序算法。 </p><p>  有 有</p><p>  序 序</p><p>  區(qū) 一趟排序

37、 區(qū)</p><p><b>  無</b></p><p>  序 無</p><p>  區(qū) 序</p><p><b>  區(qū)</

38、b></p><p>  程序模塊及其接口描述</p><p>  typedef int KeyType; //定義關(guān)鍵字類型為int</p><p>  typedef char InfoType[10];</p><p>  typedef struct //記錄類型</p>

39、<p><b>  {</b></p><p>  KeyType key; //關(guān)鍵字類型</p><p>  InfoType data; //其他數(shù)據(jù)項(xiàng),類型為InfoType</p><p>  }RecType ;//排序的記錄類型定義</p>

40、;<p>  void InsertSort(RecType R[],int n)//直接插入排序</p><p>  void BubbleSort(RecType R[],int n)//改進(jìn)冒泡排序</p><p>  程序的輸入與輸出描述:</p><p><b>  直接插入排序:</b></p><

41、p><b>  輸入:</b></p><p><b>  輸出:</b></p><p><b>  冒泡排序:</b></p><p><b>  輸入:</b></p><p><b>  輸出:</b></p>

42、;<p><b>  調(diào)試分析或程序測(cè)試</b></p><p><b>  直接插入排序:</b></p><p><b>  冒泡排序:</b></p><p>  尚未解決的問題或改進(jìn)方向</p><p>  在算法的定義中,一開始就定義數(shù)組長(zhǎng)度為10,如果

43、用戶操作中輸入了大于10個(gè)數(shù)時(shí)將只對(duì)前10個(gè)數(shù)進(jìn)行操作,而后面的數(shù)不會(huì)參加運(yùn)算。</p><p><b>  對(duì)軟件的使用說明</b></p><p>  在CFree4.0下打開軟件,進(jìn)行操作。</p><p><b>  結(jié)論及體會(huì)</b></p><p>  在這次的數(shù)據(jù)結(jié)構(gòu)程序設(shè)計(jì)中,從十三

44、個(gè)題目中選了五個(gè)自己比較感興趣的題目進(jìn)行編程,因?yàn)樵S多算法可以在書上找到類似的類型,加上自己的想法,做的可以說比較順利。和平時(shí)上機(jī)所做的不同,這次需要一個(gè)程序的主界面,用來調(diào)用所設(shè)計(jì)的五個(gè)項(xiàng)目,而且分別對(duì)五個(gè)項(xiàng)目的程序設(shè)計(jì)從構(gòu)思,到算法,再到輸入輸出和調(diào)試,進(jìn)行了比較充分的說明,使用起來也比較方便。</p><p><b>  附錄</b></p><p><b

45、>  附錄1:參考文獻(xiàn)</b></p><p>  [1]李春葆.數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)指導(dǎo).清華大學(xué)出版社,2010</p><p>  [2]張曉莉等.數(shù)據(jù)結(jié)構(gòu)與算法.機(jī)械工業(yè)出版社,2002</p><p>  [3]李春葆.數(shù)據(jù)結(jié)構(gòu)教程上機(jī)實(shí)驗(yàn)指導(dǎo).清華大學(xué)出版社,2010.</p><p>  附錄2:部分源代碼清單<

46、/p><p>  ********************************************************文章編輯;</p><p>  #define MAX 3000 </p><p>  typedef struct

47、 </p><p><b>  { </b></p><p>  char data[MAX]; </p><p>  int length; </p><p>  }SqString; </p><p>  void StrAss

48、ign(SqString &str,char cstr[])//建立串 </p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;cstr[i]!='\0';i++)</p><p>  str.data[

49、i]=cstr[i];</p><p>  str.length=i;</p><p><b>  }</b></p><p>  void DispStr(SqString p)</p><p><b>  {</b></p><p><b>  int i;&l

50、t;/b></p><p>  if(p.length>0)</p><p>  { printf("當(dāng)前的文章為:");</p><p>  for(i=0;i<p.length;i++)</p><p><b>  {</b></p><p>  pri

51、ntf("%c",p.data[i]);</p><p>  if((i+1)%80==0)</p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>

52、;<b>  }</b></p><p>  int cout(SqString p)//各種字符數(shù)量統(tǒng)計(jì) </p><p><b>  {</b></p><p>  int i=0;int a=0 ,b=0,c=0,d=0; </p>

53、;<p>  for(i=0;i<p.length;i++)</p><p><b>  {</b></p><p>  if(p.data[i]>='a'&&p.data[i]<='z')</p><p><b>  a++;</b><

54、/p><p>  if(p.data[i]>='A'&&p.data[i]<='Z')</p><p><b>  b++;</b></p><p>  if(p.data[i]>='0'&&p.data[i]<='9')<

55、/p><p><b>  c++;</b></p><p>  if(p.data[i]==32)</p><p><b>  d++;</b></p><p><b>  }</b></p><p>  printf("英文小寫字母有:%d個(gè)\n

56、",a) ;</p><p>  printf("英文大寫字母有:%d個(gè)\n",b) ;</p><p>  printf("數(shù)字有:%d個(gè)\n",c);</p><p>  printf("空格有:%d個(gè)\n",d);</p><p>  return p.length;

57、</p><p><b>  }</b></p><p>  int FindFind(SqString p,SqString q)//查找 </p><p><b>  {</b></p><p>  int i=0;int j=0;int n=0;</p><p>  w

58、hile(i<=p.length)</p><p><b>  {</b></p><p>  if((p.data[i]==q.data[j])&&(q.data[j]!='\0'))</p><p>  {i++;j++;}</p><p><b>  else<

59、/b></p><p><b>  i++;</b></p><p>  if(j>=q.length)</p><p>  {n++;j=0;}</p><p><b>  }</b></p><p>  printf("經(jīng)查找個(gè)字符共有 %d 個(gè)\n

60、",n);</p><p><b>  }</b></p><p>  SqString Dele(SqString p,SqString a)//刪除 </p><p><b>  {</b></p><p>  int i=0;int j=0;int n=0;int pos=0; &l

61、t;/p><p>  while(i<=p.length)</p><p><b>  {</b></p><p>  if((p.data[i]==a.data[j])&&(a.data[j]!='\0'))</p><p>  {i++;j++;}</p><p&

62、gt;<b>  else </b></p><p><b>  i++;</b></p><p>  if(j>=a.length)</p><p>  { pos=i-j+1;</p><p><b>  int k;</b></p><p&g

63、t;  SqString b;b.length=0;</p><p>  if(pos<=0||pos>=p.length||pos+a.length>p.length+1)</p><p><b>  return b;</b></p><p>  for(k=0;k<pos-1;k++)</p><

64、;p>  b.data[k]=p.data[k];</p><p>  for(k=pos+j-1;k<p.length;k++)</p><p>  b.data[k-j]=p.data[k];</p><p>  b.length=p.length-a.length;</p><p><b>  return b;&

65、lt;/b></p><p><b>  pos=0;</b></p><p><b>  j=0;</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>

66、  }</b></p><p>  ********************************************************猴子選大王;</p><p>  #define MaxSize 50</p><p>  int houzi(int n,int m)</p><p><b>  {<

67、;/b></p><p>  int p[MaxSize];</p><p>  int i,j,t;</p><p>  for(i=0;i<n;i++)</p><p><b>  p[i]=i+1;</b></p><p><b>  t=0;</b><

68、;/p><p>  printf("\n出列順序:");</p><p>  for(i=n;i>=1;i--)</p><p><b>  {</b></p><p>  t=(t+m-1)%i;</p><p>  printf("%d",p[t]);

69、</p><p>  for(j=t+1;j<=i-1;j++)</p><p>  p[j-1]=p[j];</p><p>  } printf("\n");</p><p>  printf("\n故編號(hào) %d 的猴子是大王!\n",p[t]);</p><p> 

70、 printf("\n");</p><p><b>  }</b></p><p>  *******************************************************創(chuàng)建二叉樹:</p><p>  #define MaxSize 100</p><p>  type

71、def char ElemType;</p><p>  typedef struct node</p><p><b>  {</b></p><p>  ElemType data;//數(shù)據(jù)元素 </p><p>  struct node *lchild;//指向左孩子 </p><p> 

72、 struct node *rchild;//指向右孩子 </p><p><b>  }BTNode;</b></p><p>  void CreateBTNode(BTNode *&b,char *str)//由str串創(chuàng)建二叉鏈 </p><p><b>  {</b></p><p&

73、gt;  BTNode *St[MaxSize],*p=NULL;</p><p>  int top=-1,k,j=0;</p><p><b>  char ch;</b></p><p>  b=NULL;//建立的二叉樹初始時(shí)為空 </p><p>  ch=str[j];</p><p>

74、;  while(ch!='\0')//str未掃描完時(shí)循環(huán) </p><p><b>  {</b></p><p>  switch(ch)</p><p><b>  {</b></p><p>  case '(':top++;St[top]=p;k=1;br

75、eak;//為左結(jié)點(diǎn) </p><p>  case ')':top--;break;</p><p>  case ',':k=2;break;//為右結(jié)點(diǎn) </p><p>  default:p=(BTNode *)malloc(sizeof(BTNode));</p><p>  p->data=

76、ch;</p><p>  p->lchild=p->rchild=NULL;</p><p>  if(b==NULL)//p指向二叉樹的根結(jié)點(diǎn) </p><p><b>  b=p;</b></p><p>  else//已建立二叉樹根結(jié)點(diǎn) </p><p><b> 

77、 {</b></p><p><b>  switch(k)</b></p><p><b>  {</b></p><p>  case 1:St[top]->lchild=p;break;</p><p>  case 2:St[top]->rchild=p;break;

78、</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  j++;</b></p><p>  ch=str[j];</p>

79、<p><b>  }</b></p><p><b>  }</b></p><p>  void DispBTNode(BTNode *b)//以括號(hào)表示法輸出二叉樹 </p><p><b>  {</b></p><p>  if(b!=NULL)</p

80、><p><b>  {</b></p><p>  printf("%c",b->data);</p><p>  if(b->lchild!=NULL||b->rchild!=NULL)</p><p><b>  {</b></p><p&

81、gt;  printf("(");</p><p>  DispBTNode(b->lchild);</p><p>  if(b->rchild!=NULL) printf(",");</p><p>  DispBTNode(b->rchild);</p><p>  printf

82、(")");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void TravLevel(BTNode *b)//層次遍歷</p><p>

83、<b>  {</b></p><p>  BTNode *Qu[MaxSize];</p><p>  int front,rear;</p><p>  front=rear=0;</p><p>  if(b!=NULL)</p><p>  printf("%c",b-

84、>data); </p><p><b>  rear++;</b></p><p>  Qu[rear]=b;</p><p>  while(rear!=front)</p><p><b>  {</b></p><p>  front=(front+1)%Max

85、Size;</p><p>  b=Qu[front];</p><p>  if(b->lchild!=NULL)</p><p><b>  {</b></p><p>  printf("%c",b->lchild->data);</p><p>  r

86、ear=(rear+1)%MaxSize;</p><p>  Qu[rear]=b->lchild;</p><p><b>  }</b></p><p>  if(b->rchild!=NULL)</p><p><b>  {</b></p><p>  

87、printf("%c",b->rchild->data);</p><p>  rear=(rear+1)%MaxSize;</p><p>  Qu[rear]=b->rchild;</p><p><b>  }</b></p><p><b>  }</b>

88、;</p><p>  printf("\n");</p><p><b>  }</b></p><p>  void PreOrder(BTNode *b)//先序遍歷的遞歸算法 </p><p><b>  {</b></p><p>  if(b!

89、=NULL)</p><p><b>  {</b></p><p>  printf("%c",b->data);//訪問根結(jié)點(diǎn) </p><p>  PreOrder(b->lchild);//先序遍歷左子樹 </p><p>  PreOrder(b->rchild);//先序

90、遍歷右子樹 </p><p><b>  }</b></p><p><b>  }</b></p><p>  void menu8()</p><p><b>  {</b></p><p>  BTNode *b;</p><p

91、>  char s[MaxSize];</p><p>  printf("請(qǐng)輸入二叉樹:");</p><p><b>  gets(s);</b></p><p>  CreateBTNode(b,s);</p><p>  printf("輸出此二叉樹:");</

92、p><p>  DispBTNode(b);</p><p>  printf("\n");</p><p>  printf("層序遍歷序列:");</p><p>  TravLevel(b);</p><p>  printf("先序遍歷遞歸序列:");&l

93、t;/p><p>  PreOrder(b);</p><p>  printf("\n");</p><p><b>  }</b></p><p>  #include <stdio.h></p><p>  #define MAXE 20</p>&

94、lt;p>  typedef int KeyType;</p><p>  typedef char InfoType[10];</p><p>  typedef struct</p><p><b>  {</b></p><p>  KeyType key;</p><p>  Inf

95、oType data;</p><p><b>  }RecType;</b></p><p>  ****************************************************************拓?fù)渑判颍?lt;/p><p>  #define STACKSIZE 100 //??臻g大小 &

96、lt;/p><p>  #define STACKINCREMENT 20 //進(jìn)棧棧增量 </p><p>  #define MAX 20 //鄰接表數(shù)組的最大值 </p><p>  typedef struct</p><p><b>  {</b></p&

97、gt;<p>  int *base; //棧底 </p><p>  int *top; //棧頂 </p><p>  int stacksize; //??臻g </p><p><b>  }Stack;</b><

98、;/p><p>  int InitStack(Stack &s) //創(chuàng)建一個(gè)空棧</p><p><b>  {</b></p><p>  s.base=(int*)malloc(STACKSIZE*sizeof(int));</p><p>  if(!s.base)</p>

99、<p>  return -1;</p><p>  s.top=s.base;</p><p>  s.stacksize=STACKSIZE;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  

100、int Push(Stack &s,int e) //進(jìn)棧 </p><p><b>  {</b></p><p>  if((s.top-s.base)>s.stacksize)</p><p><b>  {</b></p><p>  s.base=(int*

101、)realloc(s.base,(STACKSIZE+STACKINCREMENT)*sizeof(int));</p><p>  if(!s.base)</p><p><b>  return-1;</b></p><p>  s.top=s.base+s.stacksize;</p><p>  s.stacks

102、ize+=STACKINCREMENT;</p><p><b>  }</b></p><p>  *s.top++=e;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  bool E

103、mpty(Stack s) //查看棧是否為空 </p><p><b>  {</b></p><p>  if(s.base==s.top)</p><p>  return true;</p><p><b>  else</b></p><p&

104、gt;  return false;</p><p><b>  }</b></p><p>  int Pop(Stack &s) //出棧 </p><p><b>  {</b></p><p><b>  int e;</b>&l

105、t;/p><p>  e=*--s.top;</p><p><b>  return e;</b></p><p><b>  }</b></p><p>  typedef struct ArcNode //頭節(jié)點(diǎn)</p><p><b>  {

106、</b></p><p>  int adjvex; //該邊所指向的頂點(diǎn)的位置</p><p>  struct ArcNode *nextarc; //指向下一條邊</p><p><b>  }ArcNode;</b></p><p>  typedef str

107、uct VNode //表節(jié)點(diǎn)</p><p><b>  {</b></p><p>  int data; //頂點(diǎn)信息</p><p>  int indegree; //節(jié)點(diǎn)的入度</p><p>  ArcNode *f

108、irstarc; //指向第一條依附該節(jié)點(diǎn)的邊的指針</p><p>  }VNode,AdjList[MAX];</p><p>  typedef struct </p><p><b>  {</b></p><p>  AdjList vertices; //表節(jié)點(diǎn)<

109、;/p><p>  int vexnum; //節(jié)點(diǎn)的個(gè)數(shù)</p><p>  int arcnum; //邊的條數(shù)</p><p><b>  }Graph;</b></p><p>  int LocateVex(Graph G,int v) /

110、/返回節(jié)點(diǎn)v在圖中的位置</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i<G.vexnum;++i)</p><p><b>  {</b></p><p>  if

111、(G.vertices[i].data==v)</p><p><b>  break;</b></p><p><b>  else</b></p><p><b>  continue;</b></p><p><b>  }</b></p>

112、;<p>  if(i<G.vexnum)</p><p><b>  return i;</b></p><p><b>  else </b></p><p>  return -1;</p><p><b>  }</b></p><

113、;p>  void CreateGraph(Graph &G) //建圖 </p><p><b>  {</b></p><p><b>  int m,n;</b></p><p>  printf("①現(xiàn)在請(qǐng)輸入DAG的結(jié)點(diǎn)數(shù): ");</p><p

114、>  scanf("%d",&m);</p><p>  while(m<0)</p><p><b>  {</b></p><p>  printf("\t\t\t\tError!\n\t\t\t\tDAG結(jié)點(diǎn)數(shù)不能小于1.\n");</p><p>  p

115、rintf("請(qǐng)重新輸入DAG的頂點(diǎn)數(shù): "); //DAG是有向無環(huán)圖 </p><p>  scanf("%d",&m);</p><p><b>  }</b></p><p>  printf("②現(xiàn)在請(qǐng)輸入DAG的邊數(shù): ");</p><p&

116、gt;  scanf("%d",&n);</p><p>  while(n<0)</p><p><b>  {</b></p><p>  printf("\t\t\t\tError!\n\t\t\t\tDAG的邊數(shù)不能小于0.\n");</p><p>  pr

117、intf("請(qǐng)重新輸入DAG的邊數(shù): ");</p><p>  scanf("%d",&n);</p><p><b>  }</b></p><p>  G.vexnum=m; //頂點(diǎn)數(shù)目</p><p>  G.arcnum=

118、n; //邊的數(shù)目</p><p>  int i,j,k;</p><p>  for(i=0;i<G.vexnum;++i) //初始化圖的信息</p><p><b>  {</b></p><p>  G.vertices[i].data=i+1;

119、 //頂點(diǎn)信息</p><p>  G.vertices[i].firstarc=0;</p><p>  G.vertices[i].indegree=0; //開始時(shí)入度都為0</p><p><b>  }</b></p><p><b>  //頂點(diǎn)信息</b></p&

120、gt;<p>  printf("③現(xiàn)在輸出頂點(diǎn)信息:\n");</p><p>  for(i=0;i<G.vexnum;++i)</p><p>  printf("v%d\n",G.vertices[i].data);</p><p>  int v1,v2,flag=0;</p>&l

121、t;p>  for(k=0;k<G.arcnum;++k)</p><p><b>  {</b></p><p>  printf("④請(qǐng)輸入第%d邊的起點(diǎn)和終點(diǎn)(樣例:1 2),注意其中分隔符為一個(gè)空格: ",k+1);</p><p>  scanf("%d%d",&v1,&am

122、p;v2);</p><p>  i=LocateVex(G,v1); //頂點(diǎn)v1在圖中的位置</p><p>  j=LocateVex(G,v2); //頂點(diǎn)v2在圖中的位置</p><p>  if(i >=0 && j>=0)</p><p><

123、;b>  {</b></p><p><b>  ++flag;</b></p><p>  (G.vertices[j].indegree)++;</p><p>  ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));</p><p>  p->adjve

124、x=j;</p><p>  p->nextarc=0;</p><p>  ArcNode *p1;</p><p>  if(! G.vertices[i].firstarc)</p><p>  G.vertices[i].firstarc=p;</p><p><b>  else</b&

125、gt;</p><p><b>  {</b></p><p>  for(p1=G.vertices[i].firstarc;p1->nextarc;p1=p1->nextarc); //求該頂點(diǎn)的最后一個(gè)鄰接頂點(diǎn)</p><p>  p1->nextarc=p; //將p插入到最后一個(gè)鄰接頂點(diǎn)

126、的后面</p><p><b>  }</b></p><p><b>  }</b></p><p>  else //沒有該弧,刪除掉</p><p><b>  {</b></p><p>  printf("********

127、***************************************"); </p><p>  printf("沒有該邊!\n");</p><p><b>  k=flag;</b></p><p>  printf("************************************

128、***********"); </p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void TopologicalSort(Graph G) //拓?fù)渑判蚝瘮?shù)</p&g

129、t;<p><b>  {</b></p><p>  int i,j,k;</p><p>  int count=0; //用來統(tǒng)計(jì)頂點(diǎn)的個(gè)數(shù)</p><p>  Stack s; //定義一個(gè)棧,用來保存入度為0的頂點(diǎn)</p><p>  InitStack(s); //初始化棧</p&g

130、t;<p>  for(i=0;i<G.vexnum;++i)</p><p>  if(G.vertices[i].indegree==0) //若第i個(gè)頂點(diǎn)的入度為0 ,i表示頂點(diǎn)在圖中的位置</p><p>  Push(s,i); //將第i個(gè)頂點(diǎn)入棧</p><p>  while(!Empty(

131、s))</p><p><b>  {</b></p><p>  j=Pop(s); // 將為入度0的頂點(diǎn)位置出棧,并保存到j(luò)中</p><p>  count++; //統(tǒng)計(jì)頂點(diǎn)的個(gè)數(shù)</p><p>  printf("v%d ",G.vertices[j].data

132、); //輸出入度為0的頂點(diǎn)</p><p>  ArcNode *p;</p><p>  for(p=G.vertices[j].firstarc; p ;p=p->nextarc) //找與第j個(gè)頂點(diǎn)的鄰接頂點(diǎn),并將其入度減1</p><p><b>  {</b></p><p>  k=p->a

133、djvex;</p><p>  --(G.vertices[k].indegree);</p><p>  if(G.vertices[k].indegree==0) //如果入度為0,就入棧</p><p>  Push(s,k);</p><p><b>  }</b></p><p>

134、;<b>  }</b></p><p>  if(count<G.vexnum) //count小于頂點(diǎn)的個(gè)數(shù)時(shí)候,說明有環(huán),不符合拓?fù)渑判虻囊?lt;/p><p><b>  {</b></p><p>  printf("***************************************

135、*****************************************"); </p><p>  printf("\t\t\t\tError!\n\t\t\t\t圖中有環(huán)!該圖不是DAG!\n");</p><p>  exit(0); //退出</p><p><b>  }<

136、/b></p><p><b>  }</b></p><p><b>  //主函數(shù)的實(shí)現(xiàn)</b></p><p>  /*void TuoPu()</p><p><b>  {</b></p><p>  printf("\t\t\

137、t\t拓?fù)渑判蜓菔綷n");</p><p>  printf("\t\t\t\t現(xiàn)在開始\n");</p><p><b>  Graph g;</b></p><p>  CreateGraph(g);</p><p>  printf("\n\t\t\t\t拓?fù)渑判蚪Y(jié)果為:

138、\n");</p><p>  printf("************************************************"); </p><p>  TopologicalSort(g);</p><p>  printf("\n*************************************

139、***********"); </p><p>  printf("\n\t\t\t\t演示完畢\n");</p><p><b>  }*/</b></p><p>  *****************************************************各種排序</p><

140、;p>  void InsertSort(RecType R[],int n)//直接插入排序 </p><p><b>  {</b></p><p>  int i,j,k;</p><p>  RecType temp;</p><p>  for(i=1;i<n;i++)</p><

141、;p><b>  {</b></p><p>  temp=R[i];</p><p>  j=i-1; //從左向右在有序區(qū)R[0..i-1]中找R[i]的插入位置</p><p>  while(j>=0&&temp.key<R[j].key)</p><p><

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論