數(shù)據(jù)結構課程設計---實現(xiàn)兩個鏈表的合并_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  一、課程設計題目:</b></p><p><b>  實現(xiàn)兩個鏈表的合并</b></p><p><b>  二、基本功能要求:</b></p><p>  1. 建立兩個鏈表A和B,鏈表元素個數(shù)分別為m和n個。</p><p>  2. 假設元

2、素分別為(x1,x2,…xm),和(y1,y2, …yn)。把它們合并成一個線性表C,使得:</p><p>  當m>=n時,C=x1,y1,x2,y2,…xn,yn,…,xm</p><p>  當n>m時,C=y1,x1,y2,x2,…ym,xm,…,yn</p><p>  3. 輸出線性表C:用直接插入排序法對C進行升序排序,生成鏈表D,并輸出

3、鏈表D。</p><p><b>  三、測試數(shù)據(jù):</b></p><p>  1. A表(30,41,15,12,56,80) </p><p>  B表(23,56,78,23,12,33,79,90,55)</p><p>  2. A表(30,41,15,12,56,80,23,12,34) </p>

4、;<p>  B表(23,56,78,23,12) </p><p><b>  四、理論分析結果:</b></p><p>  1. A表的數(shù)據(jù)元素個數(shù)m=6,B表的數(shù)據(jù)元素個數(shù) n=9,此時m<n </p><p>  分析合并結果:當m<n時,應該先插入B表中的數(shù)據(jù)元素,在偶數(shù)位插入

5、B表中的數(shù)據(jù)元素,在奇數(shù)位插入A表中的數(shù)據(jù)元素,最后插入B表中剩 余的數(shù)據(jù)元素。</p><p>  C=23,30,56,41,78,15,23,12,12,56,33,80,79,90,55</p><p><b>  排序結果:</b></p><p>  D=12,12,15,23,23,30,33,41,55,56,56,78,79,

6、80,90</p><p>  2. A表的數(shù)據(jù)元素個數(shù)m=9,B表的數(shù)據(jù)元素個數(shù) n=5,此時m>n</p><p>  分析合并結果:當m>=n時,應該先插入A表中的數(shù)據(jù)元素,在偶數(shù)位插入A表中的數(shù)據(jù)元素,在奇數(shù)位插入B表中的數(shù)據(jù)元素,最后插入A表中剩余的數(shù)據(jù)元素。</p><p>  C=30,23,41,56,15,78,12,23,56,12,

7、80,23,12, 34</p><p><b>  排序結果:</b></p><p>  D=12,12,12,15,23,23,23,30,34,41,56,56,78,80</p><p><b>  五、設計步驟:</b></p><p>  5.1 分析問題,給出數(shù)學模型,設計相應的數(shù)據(jù)

8、結構:</p><p>  1) 分析問題特點,用數(shù)學表達式或其它形式描述其數(shù)學模型。 </p><p>  2) 選擇能夠體現(xiàn)問題本身特點的一種或幾種邏輯結構。 </p><p>  3) 依據(jù)邏輯結構和問題特點,設計并選擇相應的存儲結構(順序存儲結構和鏈式存儲結構對應的算法實現(xiàn)有區(qū)別)。 </p><p>  5.2 算法設計 :<

9、/p><p>  1) 確定所需模塊:對于復雜的程序設計,要充分利用模塊化程序設計方法和面向對象思想,自頂向下,逐步細化。 </p><p>  2) 各子模塊功能描述:給出主要模塊的算法描述,用流程圖或偽代碼表示。</p><p>  3) 模塊之間的調用關系:給出算法各模塊之間的關系圖示。 </p><p>  5.3 上機實現(xiàn)程序:<

10、/p><p>  為提高工作效率,充分利用上機調試時間,在上機之前應列出程序清單。</p><p>  5.4 有代表性的各種測試數(shù)據(jù)去驗證算法及程序的正確性:</p><p>  根據(jù)課程設計的要求對給定的數(shù)據(jù)進行測試,驗證算法以及程序的正確性。</p><p>  5.5 算法分析及優(yōu)化:</p><p>  經過上機

11、調試,源程序運行正確,并且實現(xiàn)算法要求的功能,解決課程設計題目中給出的問題后,分析算法的時間復雜度和空間復雜度,如有可能對程序進行優(yōu)化改進。</p><p><b>  六、模塊劃分:</b></p><p>  單鏈表頭文件:LinList.h</p><p>  主要包括單鏈表的存儲結構、初始化、求數(shù)據(jù)元素個數(shù)、插入、刪除數(shù)據(jù)元素、取數(shù)據(jù)元

12、素、撤消單鏈表的函數(shù)。</p><p>  2. 單鏈表操作頭文件:MyList.h</p><p>  主要包括單鏈表測試、單鏈表合并、單鏈表合并排序函數(shù)。</p><p>  3.測試主函數(shù)文件:TestLinList.h</p><p>  主要包括文件包含、數(shù)據(jù)導入和操作模塊程序。</p><p><b&

13、gt;  七、算法設計:</b></p><p>  7.1 帶頭結點的單鏈表存儲結構</p><p>  typedef struct Node </p><p><b>  {</b></p><p>  DataType data;</p><p>  struct Node *

14、next;</p><p><b>  }SLNode;</b></p><p>  7.2 單鏈表的初始化</p><p>  void ListInitiate(SLNode **head)</p><p><b>  {</b></p><p>  /*如果有內存空間

15、,申請頭結點空間并使頭指針head指向頭結點*/</p><p>  if((*head = (SLNode *)malloc(sizeof(SLNode)))==NULL) </p><p><b>  exit(1);</b></p><p>  (*head)->next = NULL;/*尾標記NULL */</p>

16、<p><b>  }</b></p><p>  7.3 求單鏈表中的數(shù)據(jù)元素個數(shù)</p><p>  int ListLength(SLNode *head)</p><p><b>  {</b></p><p>  SLNode *p = head; /*p指向頭結點*/<

17、/p><p>  int size = 0; /*size初始為0*/</p><p>  while(p->next != NULL) /*循環(huán)計數(shù)*/</p><p><b>  {</b></p><p>  p = p->next;size ++;</p><p><b>

18、;  }</b></p><p>  return size;</p><p><b>  }</b></p><p>  7.4 向單鏈表中插入數(shù)據(jù)元素</p><p>  int ListInsert(SLNode *head,int i,DataType x)</p><p>&

19、lt;b>  {</b></p><p>  SLNode *p, *q; </p><p><b>  int j; </b></p><p>  p = head;</p><p><b>  j = -1;</b></p><p>  while(p

20、->next!=NULL && j<i-1) </p><p><b>  {</b></p><p>  p = p->next; j++;</p><p><b>  }</b></p><p>  if(j != i - 1)</p><

21、p><b>  {</b></p><p>  printf("Eorror: 插入位置參數(shù)錯!\n");</p><p>  return 0; </p><p><b>  }</b></p><p>  if((q = (SLNode *)malloc(sizeof

22、(SLNode))) == NULL) </p><p><b>  exit(1);</b></p><p>  q->data = x;</p><p>  q->next = p->next;</p><p>  p->next = q;</p><p>  ret

23、urn 1; </p><p>  }//注:此單鏈表是帶頭結點的</p><p>  7.5 從單鏈表中刪除數(shù)據(jù)元素</p><p>  int ListDelete(SLNode *head,int i,DataType *x)</p><p><b>  {</b></p><p>

24、;  SLNode *p, *s;int j;</p><p><b>  p=head;</b></p><p><b>  j = -1;</b></p><p>  while(p->next != NULL && p->next->next!=NULL && j&

25、lt;i-1) </p><p><b>  {</b></p><p>  p=p->next;j++;</p><p><b>  }</b></p><p>  if(j!=i-1)</p><p><b>  {</b></p>

26、<p>  printf("Eorror: 刪除位置參數(shù)錯!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  s = p->next; </p><p>  *x=s->dat

27、a; </p><p>  p->next = p->next->next;</p><p><b>  free(s); </b></p><p><b>  return 1;</b></p><p><b>  }</b></p><

28、;p>  7.6 從單鏈表中取數(shù)據(jù)元素</p><p>  ListGet(SLNode *head,int i,DataType *x)</p><p><b>  {</b></p><p>  SLNode *p;</p><p><b>  int j;</b></p>

29、<p><b>  p=head;</b></p><p><b>  j=-1;</b></p><p>  while(p->next!=NULL && j<i)</p><p><b>  {</b></p><p>  p=p-&g

30、t;next;j++;</p><p><b>  }</b></p><p><b>  if(j!=i)</b></p><p><b>  {</b></p><p>  printf("Eorror: 取數(shù)據(jù)元素位置參數(shù)出錯!\n");</p&

31、gt;<p><b>  return 0;</b></p><p><b>  }</b></p><p>  *x=p->data;</p><p><b>  return 1;</b></p><p><b>  }</b>&l

32、t;/p><p><b>  7.7 撤消單鏈表</b></p><p>  void Destroy(SLNode **head)</p><p><b>  {</b></p><p>  SLNode *p,*p1;</p><p><b>  p=*head;&

33、lt;/b></p><p>  while(p!=NULL)</p><p><b>  {</b></p><p>  p1=p;p=p->next;free(p1);</p><p><b>  }</b></p><p>  *head=NULL;<

34、/p><p><b>  }</b></p><p>  7.8 單鏈表測試函數(shù)</p><p>  void SingleList(int a[],int al)</p><p><b>  {</b></p><p><b>  int i,x;</b>

35、</p><p>  SLNode *head;</p><p>  ListInitiate(&head);</p><p>  //向單鏈表插入數(shù)據(jù)元素</p><p>  for(i=0;i<al;i++)</p><p><b>  {</b></p><

36、p>  if(ListInsert(head,i,a[i]) == 0)</p><p><b>  { </b></p><p>  printf("Error:插入數(shù)據(jù)元素錯誤! \n");return; </p><p><b>  }</b></p><p>&l

37、t;b>  }</b></p><p>  //從單鏈表取數(shù)據(jù)元素</p><p>  printf("結果:");</p><p>  for(i=0; i<ListLength(head); i++)</p><p><b>  {</b></p><

38、p>  if(ListGet(head,i,&x) == 0)</p><p><b>  { </b></p><p>  printf("Error:取數(shù)據(jù)元素錯誤! \n");return; </p><p><b>  }</b></p><p> 

39、 else printf("%d ", x);</p><p><b>  }</b></p><p>  printf("\n");</p><p>  Destroy(&head);//撤消單鏈表</p><p>  printf("\n");<

40、;/p><p><b>  }</b></p><p>  7.9 單鏈表合并函數(shù)</p><p>  void CombineList(int a[],int b[],int al,int bl)</p><p><b>  {</b></p><p>  int i,j=0,

41、x;</p><p>  int *list;</p><p>  SLNode *head;</p><p>  list=(int *)malloc((al+bl)*sizeof(int));</p><p>  if(al<bl)//a[]數(shù)組的數(shù)據(jù)元素個數(shù) < b[]數(shù)組的數(shù)據(jù)元素個數(shù)</p><p&

42、gt;<b>  {</b></p><p>  //較長數(shù)組的數(shù)據(jù)元素賦給動態(tài)數(shù)組的偶數(shù)位</p><p>  for(i=0;i<2*al;i+=2)</p><p><b>  {</b></p><p>  if(i%2==0)</p><p><b>

43、;  {</b></p><p>  list[i]=b[j];j++;</p><p><b>  }</b></p><p><b>  }</b></p><p>  j=0;//恢復公共下標初始值</p><p>  //較短數(shù)組的數(shù)據(jù)元素賦給動態(tài)數(shù)組的奇

44、數(shù)位</p><p>  for(i=0;i<2*al;i++)</p><p><b>  {</b></p><p>  if(i%2==1)</p><p><b>  {</b></p><p>  list[i]=a[j];j++;</p>&l

45、t;p><b>  }</b></p><p><b>  }</b></p><p>  //較長數(shù)組剩余數(shù)據(jù)元素賦值</p><p>  for(i=2*al;i<al+bl;i++)</p><p><b>  {</b></p><p&g

46、t;  list[i]=b[j];j++;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else//a[]數(shù)組的數(shù)據(jù)元素個數(shù) >= b[]數(shù)組的數(shù)據(jù)元素個數(shù)</p><p><b>  {</b></p>

47、<p>  //較長數(shù)組b[]的數(shù)據(jù)元素賦給動態(tài)數(shù)組的偶數(shù)位</p><p>  for(i=0;i<2*bl;i+=2)</p><p><b>  {</b></p><p>  if(i%2==0)</p><p><b>  {</b></p><p&

48、gt;  list[i]=a[j];j++;</p><p><b>  }</b></p><p><b>  }</b></p><p>  j=0;//恢復公共下標初始值</p><p>  //較短數(shù)組a[]的數(shù)據(jù)元素賦給動態(tài)數(shù)組的奇數(shù)位</p><p>  for(

49、i=0;i<2*bl;i++)</p><p><b>  {</b></p><p>  if(i%2==1)</p><p><b>  {</b></p><p>  list[i]=b[j];j++;</p><p><b>  }</b>

50、</p><p><b>  }</b></p><p>  //較長數(shù)組a[]剩余數(shù)據(jù)元素賦值</p><p>  for(i=2*bl;i<al+bl;i++)</p><p><b>  {</b></p><p>  list[i]=a[j];j++;</

51、p><p><b>  }</b></p><p><b>  }</b></p><p>  ListInitiate(&head);</p><p>  //向單鏈表插入數(shù)據(jù)元素</p><p>  for(i=0;i<al+bl;i++)</p>

52、<p><b>  {</b></p><p>  if(ListInsert(head,i,list[i]) == 0)</p><p><b>  { </b></p><p>  printf("Error:插入A的數(shù)據(jù)元素錯誤! \n");</p><p&g

53、t;<b>  }</b></p><p><b>  }</b></p><p>  free(list);</p><p>  //從單鏈表取數(shù)據(jù)元素</p><p>  for(i=0;i<ListLength(head);i++)</p><p><b&g

54、t;  {</b></p><p>  if(ListGet(head,i,&x) == 0)</p><p><b>  { </b></p><p>  printf("Error:取數(shù)據(jù)元素錯誤! \n");return; </p><p><b>  }&

55、lt;/b></p><p><b>  else </b></p><p>  printf("%d ", x);</p><p><b>  }</b></p><p>  printf("\n");</p><p>  De

56、stroy(&head);//撤消單鏈表</p><p><b>  }</b></p><p>  7.10 直接插入法排序</p><p>  for(i=0;i<al+bl-1;i++)</p><p><b>  {</b></p><p>  temp

57、=list[i+1];</p><p><b>  j=i;</b></p><p>  while(j>-1 && temp<list[j])</p><p><b>  {</b></p><p>  list[j+1]=list[j];j--;</p>

58、<p><b>  }</b></p><p>  list[j+1]=temp;</p><p>  }//直接插入法對數(shù)組list[]排序</p><p>  7.11 操作模塊設計</p><p>  printf("**********數(shù)據(jù)結構單鏈表合并測試實驗************\n&

59、quot;);</p><p>  printf("**** 1. 測試單鏈表A ****\n");</p><p>  printf("**** 2. 測試單鏈表B ****\n");</p><p>  printf("

60、;**** 3. 合并單鏈表A、B得到單鏈表C ****\n");</p><p>  printf("**** 4. 對單鏈表C升序排序得到單鏈表D ****\n");</p><p>  printf("**** 0. 退出合并單鏈表的測試程序 ****\n");</p>

61、;<p>  printf("**********數(shù)據(jù)結構單鏈表合并測試實驗************\n");</p><p><b>  …… ……</b></p><p>  while(flag==1)</p><p><b>  {</b></p><p>

62、  printf("輸入功能號碼:");</p><p>  scanf("%d",&flag);</p><p>  switch(flag)</p><p><b>  {</b></p><p><b>  case 1:</b></p&g

63、t;<p>  printf("測試單鏈表A\n");</p><p>  SingleList(&a,al);</p><p>  flag=1;//功能循環(huán)標志</p><p><b>  break;</b></p><p><b>  case 2:</b

64、></p><p>  printf("測試單鏈表B\n");</p><p>  SingleList(&b,bl);</p><p>  flag=1;//功能循環(huán)標志</p><p><b>  break;</b></p><p><b>  c

65、ase 3:</b></p><p>  printf("測試單鏈表A、B的合并\n");</p><p>  CombineList(&a,&b,al,bl);</p><p>  flag=1;//功能循環(huán)標志</p><p><b>  break;</b></

66、p><p><b>  case 4:</b></p><p>  printf("測試單鏈表C的排序\n");</p><p>  SortList(&a,&b,al,bl);</p><p>  flag=1;//功能循環(huán)標志</p><p><b>

67、  break;</b></p><p><b>  case 0:</b></p><p>  printf("Message:歡迎下次再次測試單鏈表合并程序!\n");</p><p>  break;//flag!=0退出程序標志</p><p><b>  default

68、:</b></p><p>  printf("Error:功能號碼選擇錯誤,請重新選擇!\n");</p><p>  flag=1;//功能循環(huán)標志</p><p><b>  break;</b></p><p><b>  }</b></p>&

69、lt;p><b>  }</b></p><p>  八、測試程序運行結果:</p><p>  8.1 測試第1組數(shù)據(jù)</p><p><b> ?。?)單鏈表測試:</b></p><p>  測試目的:測試單鏈表是否能夠進行插入、讀取等操作。</p><p>  

70、測試結果:單鏈表A=30,41,15,12,56,80</p><p>  單鏈表B=23,56,78,23,12,33,79,90,55</p><p>  (2)單鏈表合并測試:</p><p>  測試目的:測試兩個單鏈表是否能夠按照要求進行合并</p><p>  測試結果:單鏈表C=23,30,56,41,78,15,23,12,1

71、2,56,33,80,79,90,55</p><p>  (3)單鏈表合并后排序測試:</p><p>  測試目的:測試兩個合并后的單鏈表是否能夠升序排序后輸出</p><p>  測試結果:單鏈表D=12,12,15,23,23,30,33,41,55,56,56,78,79,80,90</p><p>  8.2 測試第2組數(shù)據(jù)<

72、;/p><p><b>  (1)單鏈表測試:</b></p><p>  測試目的:測試單鏈表是否能夠進行插入、讀取等操作。</p><p>  測試結果:單鏈表A= 30,41,15,12,56,80,23,12,34</p><p>  單鏈表B= 23,56,78,23,12</p><p>

73、 ?。?)單鏈表合并測試:</p><p>  測試目的:測試兩個單鏈表是否能夠按照要求進行合并</p><p>  測試結果:單鏈表C= 30,23,41,56,15,78,12,23,56,12,80,23,12, 34</p><p> ?。?)單鏈表合并后排序測試:</p><p>  測試目的:測試兩個合并后的單鏈表是否能夠升序排序

74、后輸出</p><p>  測試結果:單鏈表D= 12,12,12,15,23,23,23,30,34,41,56,56,78,80</p><p><b>  8.3 測試說明:</b></p><p>  經過反復的程序調試和修改,最終實現(xiàn)了本次課程設計的任務。限于篇幅,程序運行結果只有調試修改正確以后的的運行結果。</p>

75、<p>  為了方便測試,在測試過程中,把要測試的數(shù)據(jù)直接通過添加數(shù)據(jù)程序代碼導入到程序中。把程序運行結果和理論分析結果進行對比,驗證程序的正確性。</p><p><b>  8.4 測試結論:</b></p><p>  在程序完成編寫之后,程序的連接、編譯、運行開始不能夠正常通過,經過調試、修改之后,最終都能夠正常通過,修改過后的程序中沒有語法錯誤。&

76、lt;/p><p>  把測試結構和理論的分析結構進行對比,通過程序運行結果的觀察得知程序運行結果和理論分析結果基本吻合。</p><p>  通過單鏈表的操作可以完成兩個單鏈表的合并,除此之外,還能夠對單鏈表合并后的數(shù)據(jù)元素進行排序。</p><p><b>  課程設計總結:</b></p><p>  9.1 課程設計

77、題目的選擇</p><p>  在本次的數(shù)據(jù)結構課程設計中,我選擇的題目是“實現(xiàn)兩個單鏈表的合并”,從所學習過的知識入手進行課程的設計。程序設計語言選擇C語言,由于學習的時間較早,經過一段時間的編程積累用的相對比較熟練。</p><p>  9.2 對題目的認識</p><p>  單鏈表是數(shù)據(jù)結構里面典型的線性表,適用范圍比較廣泛,使用方法也相對靈活,在課堂上我們

78、學習了單鏈表的基本數(shù)據(jù)結構和單鏈表的基本操作,但是并沒有運用到實際的程序中,這次課程設計把我們的理論知識和程序實踐聯(lián)系起來了。</p><p><b>  9.3 編程心得</b></p><p>  通過本次的課程設計,使我學會了如何去組織代碼量較大大程序。與此同時,也使我學會了一些對代碼量較大的的程序進行編寫、連接、編譯運行、以及調試和修改的技巧。</p&g

79、t;<p>  9.4 課程設計感想</p><p>  這次的課程設計涉及到編程語言和數(shù)據(jù)結構的知識,要求和平時的實驗相比相對較高。從本次的課程設計可以檢驗我們對C語言和數(shù)據(jù)結構的掌握情況,同時也檢驗了我們對所學習過的知識的靈活運用情況。在創(chuàng)新性方面,這次的課程設計雖然完成了課程設計的任務,但是缺乏創(chuàng)造性的設計思想,在以后的學習過程中還得繼續(xù)努力。</p><p>  參

80、考 文 獻 資 料</p><p>  [1].嚴蔚敏編著.數(shù)據(jù)結構(C語言版).清華大學出版社,2002</p><p>  [2].朱戰(zhàn)立. 編著.數(shù)據(jù)結構——使用C語言.西安交通大學出版社,2004</p><p>  [3].朱戰(zhàn)立,張選平編著.數(shù)據(jù)機構學習指導和典型題解.西安交通大學出版社,2002</p><p>  [4].蘇小

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論