數(shù)據(jù)結構課程設計-- 循環(huán)單鏈表_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  信息科學與技術學院</b></p><p>  《數(shù)據(jù)結構》課程設計報告</p><p> 題目名稱:循環(huán)單鏈表(附加頭結點,引用)</p><p> 專業(yè)班級:計算機科學與技術2011級1班</p><p> 學生姓名:</p><p> 學生學號:</p&g

2、t;<p> 指導教師:</p><p>  目 錄</p><p>  1 課程設計的目的1</p><p>  1.1 課程設計的目的1</p><p>  1.2 課程設計的題目1</p><p>  1.3 題目要求1</p><p><

3、b>  2 概要設計1</b></p><p>  2.1 存儲結構1</p><p>  2.2 基本操作1</p><p><b>  3 詳細設計2</b></p><p>  3.1 流程圖2</p><p>  3.2 源程序7</p>

4、;<p><b>  4 測試12</b></p><p>  5 課程設計總結19</p><p><b>  6參考書目:20</b></p><p>  1 課程設計的目的</p><p>  1.1 課程設計的目的</p><p>  更好

5、的掌握數(shù)據(jù)結構這門課程,會用數(shù)據(jù)結構的基本思想及算法解決實際問題。更好的掌握循環(huán)鏈表,能進行各種基本的操作,提高編程能力。</p><p>  1.2 課程設計的題目</p><p>  循環(huán)單鏈表(附加頭結點,引用)</p><p><b>  1.3 題目要求</b></p><p>  實現(xiàn)附加頭結點循環(huán)單鏈表

6、的基本操作:創(chuàng)建空表、輸出、求表長、取元素、查找、替換、插入、刪除、清空。</p><p><b>  2 概要設計</b></p><p><b>  2.1 存儲結構</b></p><p><b>  存儲結構</b></p><p>  typedef struct

7、 node{</p><p>  datatype data;/*數(shù)據(jù)域*/</p><p>  struct node *next;/*指針域*/</p><p>  }LNode,*LinkList;/*結點及結點的地址*/</p><p><b>  2.2 基本操作</b></p><p&g

8、t;  創(chuàng)建空表、輸出、求表長、取元素、查找、替換、插入、刪除、清空。</p><p><b>  3 詳細設計</b></p><p><b>  3.1 流程圖</b></p><p>  各個算法的設計如下:</p><p><b>  主函數(shù):</b></p&

9、gt;<p><b>  主菜單</b></p><p>  用于進行指示進行各種操作,是與每個函數(shù)都相聯(lián)系的一個函數(shù)</p><p><b>  3.顯示鏈表</b></p><p>  先讓指針指向首元結點,在判斷該指針是否為頭指針,不是則輸入數(shù)據(jù),實則退出</p><p>  p

10、 = head->next;</p><p><b>  圖3</b></p><p><b>  4.求表長</b></p><p>  先求表的初始長,在判斷鏈表是否為空,不是則len自加,否則結束</p><p><b>  取元素</b></p>&

11、lt;p>  先求表長,在判斷Index < 1 || Index > len,為否則循環(huán),一直活得該數(shù)據(jù)</p><p><b>  查找</b></p><p>  求表長,在判斷鏈表是否為空,是則結束,否則判斷要查找的數(shù)據(jù)是否在鏈表中,是則成功</p><p><b>  7.替換</b></

12、p><p>  判斷要替換的位置是否在鏈表范圍中,是則循環(huán)找到要替換的數(shù)據(jù)替換,否則結束</p><p><b>  8.插入</b></p><p>  判斷將要插入的位置是否在鏈表范圍內,是則循環(huán)將要插入的數(shù)據(jù)插入,否則結束</p><p><b>  9.刪除</b></p><

13、;p>  判斷鏈表是否為空,否則刪除該結點,是則結束</p><p><b>  清空</b></p><p>  判斷聊表是夠為空,否則依次釋放空間,否則結束</p><p>  p->next->data == data</p><p><b>  3.2 源程序</b>&l

14、t;/p><p>  #include <iostream></p><p>  using namespace std;</p><p>  typedef int ElemType;</p><p>  typedef struct node{</p><p>  ElemType data;</p&

15、gt;<p>  struct node *next;</p><p>  }LNode,*LinkList,*pNODE;</p><p>  // 創(chuàng)建一個有頭結點的空循環(huán)表。</p><p>  LinkList InitList(void) </p><p><b>  {</b></p>

16、;<p>  pNODE head = new LNode; </p><p>  head->next = head;</p><p>  return head;</p><p><b>  }</b></p><p>  // 頭插法。將給定結點插在鏈表頭部。</p><p&

17、gt;  void InsertHead(LinkList head,pNODE anode)</p><p><b>  { </b></p><p>  anode->next = head->next; </p><p>  head->next = anode;</p><p><b>

18、;  }</b></p><p>  // 返回鏈表長度。</p><p>  int ListLen(LinkList head)</p><p><b>  { </b></p><p>  int len = 0;</p><p>  pNODE p = head;</p&

19、gt;<p>  while(p->next != head)</p><p><b>  { </b></p><p><b>  ++len; </b></p><p>  p = p->next;</p><p><b>  } </b><

20、/p><p>  return len;</p><p><b>  }</b></p><p>  // 查找。成功返回1,否則返回0。</p><p>  int ListSearch(LinkList head, ElemType data)</p><p><b>  {</b

21、></p><p>  pNODE p = head;</p><p>  while(p->next != head) </p><p><b>  { </b></p><p>  if(p->next->data == data) </p><p>  return

22、 true; </p><p>  p = p->next;</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  // 獲取指定索引號的數(shù)據(jù)。&

23、lt;/p><p>  void GetData(LinkList head,int Index,ElemType data)</p><p><b>  { </b></p><p>  pNODE p = head;</p><p>  int i,len = ListLen(head);</p><

24、p>  if(Index < 1 || Index > len)</p><p>  cout <<"獲取失敗" <<endl;</p><p>  for(i = 0; i <Index; ++i,p = p->next);</p><p>  data = p->data; <

25、/p><p>  cout <<"獲取成功,其值為:"<<data <<endl;</p><p><b>  }</b></p><p>  // 用給定結點替換指定索引的結點。</p><p>  void NodeReplace(LinkList head, in

26、t Index, int data)</p><p><b>  { </b></p><p>  pNODE p = head; </p><p>  int i,len = ListLen(head);</p><p>  if(Index < 1 || Index > len)</p>&

27、lt;p>  cout <<"錯誤" <<endl;</p><p>  for(i = 0; i <Index; ++i,p = p->next);</p><p>  p->data=data;</p><p>  cout <<"替換成功" <<en

28、dl;</p><p><b>  } </b></p><p><b>  //插入結點</b></p><p>  void ListInsert(LinkList head,int Index,int data)</p><p><b>  {</b></p>

29、<p>  pNODE s,p=head;int i,len = ListLen(head);</p><p>  if(Index < 1 || Index > len)</p><p>  cout <<"錯誤" <<endl;</p><p>  for(i=1;i<Index;++i

30、,p=p->next);</p><p>  s=new LNode;</p><p>  s->data=data;</p><p>  s->next=p->next;</p><p>  p->next=s;</p><p>  cout <<"插入成功&quo

31、t; <<endl;</p><p><b>  }</b></p><p>  // 刪除數(shù)據(jù)域為data的結點。成功返回1,否則返回0。</p><p>  int NodeErase(LinkList head,ElemType data)</p><p><b>  {</b>&

32、lt;/p><p>  pNODE q,p = head;</p><p>  while(p->next != head) </p><p><b>  {</b></p><p>  if(p->next->data == data)</p><p><b>  { &

33、lt;/b></p><p>  q = p->next; </p><p>  p->next = q->next;</p><p><b>  delete q;</b></p><p><b>  return 1;</b></p><p>&l

34、t;b>  }</b></p><p>  p = p->next;</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><

35、b>  // 釋放鏈表</b></p><p>  void ListDestroy(LinkList head)</p><p><b>  { </b></p><p>  pNODE q,p = head;</p><p>  while(p->next != head)</p>

36、<p><b>  {</b></p><p>  q = p->next;</p><p>  p->next = q->next;</p><p><b>  delete q;</b></p><p><b>  }</b></p&g

37、t;<p>  delete head;</p><p>  cout <<"釋放成功" <<endl;</p><p><b>  }</b></p><p><b>  // 顯示鏈表</b></p><p>  void ListSho

38、w(LinkList head)</p><p><b>  { </b></p><p>  pNODE p = head->next;</p><p>  while(p != head)</p><p><b>  {</b></p><p>  cout <

39、;<" "<<p->data;</p><p>  p = p->next;</p><p><b>  }</b></p><p>  cout <<endl;</p><p><b>  }</b></p><p&

40、gt;  void Menu(LinkList head)</p><p><b>  {</b></p><p>  cout <<"***********************************循環(huán)鏈表*************************************" <<endl;</p>

41、<p>  cout <<"********************************************************************************" <<endl;</p><p>  cout <<"*****************1顯示鏈表2求表長3取元素4查找5替換6插入7刪除8清空9

42、退出**********" <<endl;</p><p>  cout <<"********************************************************************************" <<endl;</p><p>  cout<<"請選擇您需

43、要的操作:"<<endl;</p><p>  int xz,Index,data;</p><p><b>  cin >>xz;</b></p><p>  switch(xz)</p><p><b>  {</b></p><p>&

44、lt;b>  case 1: </b></p><p>  ListShow(head);</p><p>  system("pause");</p><p>  system("cls");</p><p>  Menu(head);</p><p><

45、;b>  break;</b></p><p><b>  case 2:</b></p><p>  cout <<"鏈表長度為:" <<ListLen(head) <<endl;</p><p>  system("pause");</p&g

46、t;<p>  system("cls");</p><p>  Menu(head);</p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  cout <<"請輸入要獲取的數(shù)

47、據(jù)的位置:" <<endl;</p><p>  cin >>Index;</p><p>  GetData(head,Index,data);</p><p>  system("pause");</p><p>  system("cls");</p>

48、<p>  Menu(head);</p><p><b>  break;</b></p><p><b>  case 4:</b></p><p>  cout <<"請輸入要查找的數(shù)據(jù) : " <<endl;</p><p>  ci

49、n >>data;</p><p>  if(ListSearch(head, data))</p><p>  cout <<"找到了" <<endl;</p><p><b>  else</b></p><p>  cout <<"對不起

50、,沒找到" <<data <<endl;</p><p>  system("pause");</p><p>  system("cls");</p><p>  Menu(head);</p><p><b>  break;</b></

51、p><p><b>  case 5:</b></p><p>  cout <<"請輸入要替換的位置,其值為:" <<endl;</p><p>  cin >>Index >>data;</p><p>  NodeReplace(head,Index,

52、data);</p><p>  system("pause");</p><p>  system("cls");</p><p>  Menu(head);</p><p><b>  break;</b></p><p><b>  case

53、 6:</b></p><p>  cout <<"請輸入插入的位置及數(shù)值:" <<endl;</p><p>  cin >>Index >>data;</p><p>  ListInsert(head,Index,data);</p><p>  syste

54、m("pause");</p><p>  system("cls");</p><p>  Menu(head);</p><p><b>  break;</b></p><p><b>  case 7:</b></p><p>

55、  cout <<"請輸入要刪除結點的數(shù)據(jù) : " <<endl;</p><p>  cin >>data;</p><p>  if(NodeErase(head,data))</p><p>  cout <<"成功刪除" <<data <<endl

56、;</p><p><b>  else</b></p><p>  cout <<"沒有找到" <<data <<endl;</p><p>  system("pause");</p><p>  system("cls"

57、);</p><p>  Menu(head);</p><p><b>  break;</b></p><p><b>  case 8:</b></p><p>  ListDestroy(head);</p><p>  system("pause"

58、;);</p><p>  system("cls");</p><p>  Menu(head);</p><p><b>  break;</b></p><p><b>  case 0:</b></p><p><b>  exit(1)

59、;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int main()</p><p><b>  {</b></p><p>  LinkList head = InitLis

60、t();</p><p>  pNODE anode;</p><p>  int i,n = 10,a[] = {0,1,2,3,4,5,6,7,8,9};</p><p>  for(i = 0; i < n; ++i)</p><p>  { // 頭插法 </p><p>  anode =new LN

61、ode;</p><p>  anode->data = a[i];</p><p>  InsertHead(head,anode);</p><p><b>  }</b></p><p>  Menu(head);</p><p><b>  return 0;</b&

62、gt;</p><p><b>  }</b></p><p><b>  4 測試</b></p><p><b>  菜單界面</b></p><p>  顯示各種功能需進行的各種操作,界面如下:</p><p>  選擇1時,顯示鏈表中的數(shù)據(jù),

63、如圖:</p><p>  選擇2時,可以得到鏈表長度,如圖:</p><p>  選擇3時,輸入要獲取的數(shù)據(jù)的位置,成功則如圖:</p><p>  選擇4時,可以查找元素是否在該鏈表中,但該功能不能顯示出查找到的數(shù)據(jù)的位置,有所不足,如圖:</p><p>  選擇5時,可以替換你指定位置的數(shù)據(jù),如圖:</p><p&

64、gt;  選擇1,顯示替換指定位置數(shù)據(jù)后鏈表中的所有數(shù)據(jù),如圖:</p><p>  選擇6時,可以選擇要插入的位置及數(shù)值,插入成功,如圖:</p><p>  選擇1,插入后,鏈表中所有的數(shù)據(jù),如圖:</p><p>  選擇7時,可以刪除你要刪除的數(shù)據(jù),成功刪除則如圖:</p><p>  選擇7,刪除失敗,如圖:</p>

65、<p>  選擇8時,可以清空鏈表,如圖:</p><p><b>  5 課程設計總結</b></p><p>  通過這次課程設計,我又收獲到很多,平時的在做作業(yè)時,因為題形與結構都是很簡單的,并且每一章的內容都是有相應的例題可以參考,所以在做題時沒有遇到過很麻煩的問題,而這次不同了,一個課題拿到手時,給我的感覺是無從下手,而且要求很多,使得題目要求更

66、大了.通過本次課程設計,我最大的收獲就是自己的動手能力得到了很大的提升,我發(fā)現(xiàn)只有自己動手才能更好的了解到自己的知識漏洞,很多小問題可能對代碼的編寫都有很大影響,像在編寫過程中我有時漏掉半撇括號,而在查找時就相當費力,所以多敲代碼很重要啊。對語言也得到了更深的了解。語言等于算法加數(shù)據(jù)結構,這句話確實很有道理,數(shù)據(jù)結構給了我一種更好的思路,一種更好的思想,掌握一種思想遠比會很多語言來的重要,只有我們有了思路,有了更好的算法,我們的程序才會

67、更加優(yōu)秀,空間復雜度,時間復雜度才會更加少。在設計過程中我遇到了很多錯誤或是難題,其中耗時最多的就是考慮存儲結構,只有有了一個好的存儲結構對數(shù)據(jù)的操作才更加便利。</p><p>  我將整個程序分塊完成的.將整個大的程序的實現(xiàn)分8個功能,每個功能都通過一個相應的函數(shù)來實現(xiàn).在調試時分別進行調試,使得調試更方便些.在編寫各個函數(shù)只是按著題目要求的去完成,后來經指導老師指導后,發(fā)現(xiàn)了很多自己欠缺的地方,又一次將程序

溫馨提示

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

評論

0/150

提交評論