數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--雙向循環(huán)鏈表的實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩19頁(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>  題 目: 雙向循環(huán)鏈表</p><p>  基于鄰接表的圖的實(shí)現(xiàn)</p><p>  課 程: 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</p><p>  院 (部): 計(jì)算機(jī)科學(xué)與技術(shù)</p><p>  專

2、 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)</p><p>  班 級(jí): </p><p><b>  學(xué)生姓名: </b></p><p>  學(xué) 號(hào): </p><p><b>  指導(dǎo)教師: </b></p><p><b>  完成

3、日期: </b></p><p><b>  目 錄</b></p><p><b>  課程設(shè)計(jì)任務(wù)書I</b></p><p>  課程設(shè)計(jì)任務(wù)書II</p><p>  雙向循環(huán)鏈表的實(shí)現(xiàn)3</p><p><b>  一、問題描述3

4、</b></p><p><b>  二、數(shù)據(jù)結(jié)構(gòu)4</b></p><p><b>  三、邏輯設(shè)計(jì)5</b></p><p><b>  四、編碼7</b></p><p><b>  五、測(cè)試數(shù)據(jù)9</b></p>

5、<p><b>  六、測(cè)試情況11</b></p><p>  基于鄰接表的圖的實(shí)現(xiàn)12</p><p><b>  一、問題描述12</b></p><p><b>  二、數(shù)據(jù)結(jié)構(gòu)13</b></p><p><b>  三、邏輯設(shè)計(jì)13&l

6、t;/b></p><p><b>  四、編碼15</b></p><p><b>  五、測(cè)試數(shù)據(jù)16</b></p><p><b>  六、測(cè)試情況16</b></p><p><b>  結(jié) 論17</b></p>&

7、lt;p><b>  參考文獻(xiàn)18</b></p><p>  課程設(shè)計(jì)指導(dǎo)教師評(píng)語19</p><p><b>  課程設(shè)計(jì)任務(wù)書I</b></p><p><b>  課程設(shè)計(jì)任務(wù)書II</b></p><p>  指導(dǎo)教師(簽字): 教研室

8、主任(簽字):</p><p><b>  雙向循環(huán)鏈表的實(shí)現(xiàn)</b></p><p><b>  一、問題描述</b></p><p>  用圖示的方法描述所處理的雙向循環(huán)鏈表的建立,以及插入刪除操作前后鏈表的狀態(tài)</p><p>  只有有頭節(jié)點(diǎn)的雙向循環(huán)鏈表</p><p&

9、gt;  有頭節(jié)點(diǎn)的雙向循環(huán)鏈表</p><p>  雙向循環(huán)鏈表的插入 </p><p><b>  雙向循環(huán)鏈表的刪除</b></p><p><b>  二、數(shù)據(jù)結(jié)構(gòu)</b></p><p>  template <class T></p><

10、p>  struct chainNode </p><p><b>  {</b></p><p>  // data members</p><p>  T element;</p><p>  chainNode<T> *right;</p><p>  chainNode&

11、lt;T> *left;</p><p>  // methods</p><p>  chainNode() {</p><p>  left=NULL;</p><p>  right=NULL;</p><p><b>  }</b></p><p>  cha

12、inNode(const T& element)</p><p><b>  {</b></p><p>  this->element = element;</p><p>  left=NULL;</p><p>  right=NULL;</p><p><b>  

13、}</b></p><p>  chainNode(const T& element,chainNode<T> * left,chainNode<T>* right)</p><p><b>  {</b></p><p>  this->element = element;</p>

14、<p>  this->left = left;</p><p>  this->right = right;</p><p><b>  }</b></p><p><b>  };</b></p><p><b>  三、邏輯設(shè)計(jì)</b></

15、p><p><b>  1、總體思路</b></p><p><b>  (1)存儲(chǔ)結(jié)構(gòu)</b></p><p>  基于鄰接表,繼承l(wèi)inerlist類,具體實(shí)現(xiàn)雙向循環(huán)鏈表的存儲(chǔ)</p><p><b>  (2)基本函數(shù)</b></p><p>  雙

16、向循環(huán)鏈表的插入,刪除</p><p>  2、模塊劃分(圖示的方法)</p><p>  (1)erase(刪除)</p><p><b>  Yes</b></p><p><b>  No</b></p><p><b>  Yes</b><

17、/p><p>  (2)insert(插入)</p><p><b>  No</b></p><p><b>  Yes</b></p><p><b>  No</b></p><p><b>  Yes</b></p>

18、<p>  函數(shù)或類的具體定義和功能</p><p>  bool empty() const {return listSize == 0;}//是否為空</p><p>  int size() const {return listSize;}</p><p>  T& get(int theIndex) const;</p>

19、<p>  int indexOf(const T& theElement) const;</p><p>  void erase(int theIndex);</p><p>  void insert(int theIndex, const T& theElement);</p><p>  void right_output(ost

20、ream& out) const;</p><p>  void left_output(ostream& out) const;</p><p><b>  四、編碼</b></p><p>  template<class T></p><p>  void doublechain<

21、T>::checkIndex(int theIndex) const</p><p>  {// Verify that theIndex is between 0 and listSize - 1.</p><p>  if (theIndex < 0 || theIndex >= listSize)</p><p>  {ostringstre

22、am s;</p><p>  s << "index = " << theIndex << " size = " << listSize;</p><p>  throw illegalIndex(s.str());</p><p><b>  }</b>

23、</p><p><b>  }</b></p><p>  template<class T></p><p>  T& doublechain<T>::get(int theIndex) const</p><p>  {// 返回索引為theIndex的元素.</p>

24、<p>  //checkIndex(theIndex);</p><p>  if(theIndex<0||theIndex>=listSize){</p><p><b>  T a=0;</b></p><p>  return a;}</p><p>  // move to desired

25、 node</p><p>  chainNode<T>* currentNode = headerNode->right;</p><p>  for (int i = 0; i < theIndex; i++)</p><p>  currentNode = currentNode->right;</p><p&

26、gt;  return currentNode->element;</p><p><b>  }</b></p><p>  template<class T></p><p>  int doublechain<T>::indexOf(const T& theElement) const</p&g

27、t;<p>  {// 返回元素theElement首次出現(xiàn)時(shí)的索引.</p><p>  // Return -1 if theElement not in list.</p><p>  chainNode<T>* currentNode = headerNode->right;</p><p>  int index = -1;

28、 // 當(dāng)前節(jié)點(diǎn)的索引</p><p>  while (++index <listSize &&</p><p>  currentNode->element != theElement)</p><p><b>  {</b></p><p>  // move to next node

29、</p><p>  currentNode = currentNode->right;</p><p><b>  }</b></p><p>  // make sure we found matching element</p><p>  if (index == listSize)</p>

30、<p>  return -1;</p><p><b>  else</b></p><p>  return index;</p><p><b>  }</b></p><p>  template<class T></p><p>  void

31、doublechain<T>::erase(int theIndex)</p><p>  {// Delete the element whose index is theIndex.</p><p>  // Throw illegalIndex exception if no such element.</p><p>  //checkIndex

32、(theIndex);</p><p>  if (theIndex < 0 || theIndex > listSize)</p><p><b>  {</b></p><p>  cout<<"元素不存在"<<endl;</p><p><b>  

33、return;</b></p><p><b>  }</b></p><p>  // valid index, locate node with element to delete</p><p>  chainNode<T>* deleteNode;</p><p>  chainNode&

34、lt;T>* p = headerNode;</p><p>  for (int i = 0; i < theIndex; i++)</p><p>  p = p->right;</p><p>  deleteNode = p->right;</p><p>  p->right=deleteNode-&g

35、t;right;</p><p>  deleteNode->right->left=p;</p><p>  listSize--;</p><p>  delete deleteNode;</p><p><b>  }</b></p><p>  template<clas

36、s T></p><p>  void doublechain<T>::insert(int theIndex, const T& theElement)</p><p>  {// Insert theElement so that its index is theIndex.</p><p>  if (theIndex < 0

37、|| theIndex > listSize)</p><p><b>  {</b></p><p>  cout<<"Insert index must be between 0 to listSize"<<endl;</p><p>  //ostringstream s;</p&g

38、t;<p>  //s << "index = " << theIndex << " size = " << listSize;</p><p>  //throw illegalIndex(s.str());</p><p><b>  }</b></p>

39、;<p>  chainNode<T>* q= new chainNode<T>(theElement);</p><p>  chainNode<T>* p = headerNode;</p><p>  for (int i = 0; i < theIndex; i++)</p><p>  p = p-&

40、gt;right;</p><p>  q->right=p->right;</p><p>  q->left=p;</p><p>  p->right=q;</p><p>  q->right->left=q;</p><p>  listSize++;</p>

41、<p><b>  }</b></p><p>  template<class T></p><p>  void doublechain<T>::right_output(ostream& out) const</p><p>  {// Put the list into the stream

42、out.</p><p>  chainNode<T>* currentNode = headerNode->right;</p><p>  for (int i = 0;i < listSize;i++){</p><p>  out << currentNode->element << " &q

43、uot;;</p><p>  currentNode = currentNode->right;</p><p><b>  }</b></p><p><b>  }</b></p><p>  template<class T></p><p>  v

44、oid doublechain<T>::left_output(ostream& out) const</p><p>  {// Put the list into the stream out.</p><p>  chainNode<T>* currentNode = headerNode->left;</p><p> 

45、 for (int i = 0;i < listSize;i++){</p><p>  out << currentNode->element << " ";</p><p>  currentNode = currentNode->left;</p><p><b>  }</b&g

46、t;</p><p><b>  }</b></p><p><b>  五、測(cè)試數(shù)據(jù)</b></p><p>  1、對(duì)每個(gè)函數(shù)的測(cè)試數(shù)據(jù)</p><p><b>  (1)新建一個(gè)鏈表</b></p><p>  y.insert(0, 2);<

47、;/p><p>  y.insert(1, 6);</p><p>  y.insert(0, 1);</p><p>  y.insert(2, 4);</p><p>  y.insert(3, 5);</p><p>  y.insert(2, 3);</p><p>  insert的異常測(cè)

48、試y.insert(7,4);</p><p><b>  (2)刪除元素</b></p><p><b>  異常條件測(cè)試</b></p><p>  y.erase(7);</p><p><b>  正常條件測(cè)試</b></p><p>  y.e

49、rase(1);</p><p>  y.erase(0);</p><p>  y.erase(2);</p><p>  邊緣條件測(cè)試(將剩余的元素刪除)</p><p>  y.erase(0);</p><p>  y.erase(0);</p><p>  y.erase(0);<

50、;/p><p>  2、對(duì)程序整體的測(cè)試數(shù)據(jù)</p><p>  (1)判斷鏈表是否為空</p><p>  y.empty();</p><p><b>  (2)測(cè)試鏈表長(zhǎng)度</b></p><p><b>  y.size();</b></p><p&g

51、t;  (3)通過索引查找值</p><p>  y.get(-1);</p><p><b>  y.get(3);</b></p><p>  (4)通過值查找索引</p><p>  y.indexOf(7);</p><p>  y.indexOf(4);</p><p

52、><b>  六、測(cè)試情況</b></p><p><b>  1.新建一個(gè)鏈表</b></p><p><b>  測(cè)試indexOf</b></p><p><b>  3.測(cè)試get</b></p><p><b>  4測(cè)試eras

53、e</b></p><p>  插入(insert)(theIndex>listSize)</p><p>  基于鄰接表的圖的實(shí)現(xiàn)(insertEdge)</p><p><b>  問題描述</b></p><p><b>  鄰接表的形態(tài)</b></p><

54、;p><b>  aList </b></p><p><b>  11</b></p><p><b>  2</b></p><p><b>  圖</b></p><p><b>  3</b></p>&l

55、t;p><b>  22</b></p><p><b>  1</b></p><p><b>  4</b></p><p><b>  插入一條邊</b></p><p><b>  3</b></p>&

56、lt;p><b>  21</b></p><p><b>  2</b></p><p><b>  4</b></p><p><b>  1</b></p><p><b>  二.?dāng)?shù)據(jù)結(jié)構(gòu)</b></p>

57、<p>  template <class T></p><p>  struct wEdge</p><p>  {// vertex and weight pair</p><p>  int vertex;</p><p><b>  T weight;</b></p><

58、;p>  wEdge(int theVertex = 0, T theWeight = 0)</p><p>  {vertex = theVertex; weight = theWeight;}</p><p>  operator int() const {return vertex;}</p><p><b>  };</b><

59、;/p><p><b>  三、邏輯設(shè)計(jì)</b></p><p><b>  1.基本函數(shù)</b></p><p><b>  圖的邊插入</b></p><p><b>  2.模塊劃分</b></p><p><b>  

60、(1)插入一條邊</b></p><p><b>  開</b></p><p><b>  No</b></p><p><b>  Yes</b></p><p>  3、函數(shù)或類的具體定義和功能</p><p>  int number

61、OfVertices() const;//返回圖的頂點(diǎn)數(shù)</p><p>  int numberOfEdges() const;//返回圖的邊數(shù)</p><p>  bool existsEdge(int, int) const;//if 邊( ,)存在,返回true,否則返回false</p><p>  void insertEdge(edge<T>

62、; *theEdge);//插入邊(i,j)</p><p>  void eraseEdge(int, int);//刪除邊</p><p>  int degree(int) const;//返回頂點(diǎn)的度,只用于無向圖</p><p>  int inDegree(int) const;//返回頂點(diǎn)的入度</p><p>  int ou

63、tDegree(int) const;//返回頂點(diǎn)的出度</p><p>  bool directed() const;//有向圖</p><p>  bool weighted() const;//加權(quán)圖</p><p>  void checkVertex(int theVertex) const;</p><p>  void out

64、put(ostream& out) const;</p><p><b>  編碼</b></p><p>  template<class T></p><p>  int graph<T>::numberOfVertices() const{</p><p><b>  re

65、turn n;</b></p><p><b>  }</b></p><p>  template<class T></p><p>  int graph<T>::numberOfEdges() const{</p><p><b>  return e;</b&g

66、t;</p><p><b>  }</b></p><p>  template<class T></p><p>  bool graph<T>::directed() const{</p><p>  return false;</p><p><b>  

67、}</b></p><p>  template<class T></p><p>  bool graph<T>::weighted() const{</p><p>  return true;</p><p><b>  }</b></p><p>  t

68、emplate<class T></p><p>  void graph<T>::insertEdge(edge<T> *theEdge){</p><p>  int v1 = theEdge->vertex1();</p><p>  int v2 = theEdge->vertex2();</p>

69、<p>  if ( existsEdge(v1,v2) )</p><p><b>  {</b></p><p><b>  return;</b></p><p><b>  }</b></p><p>  aList[v1].push_back( wEdge

70、<T>(v2, theEdge->weight()) );//vector里面的一個(gè)push函數(shù)</p><p>  aList[v2].push_back( wEdge<T>(v1, theEdge->weight()) );</p><p><b>  e++;</b></p><p><b>

71、  }</b></p><p>  template<class T></p><p>  void graph<T>::output(ostream& out) const</p><p>  {// Output the adjacency matrix.</p><p>  typename

72、std::list<wEdge<T> >::iterator p;</p><p>  for (int i = 1; i <= n; i++){</p><p>  for(p = aList[i].begin(); p != aList[i].end(); p++)</p><p>  out <<*p <<

73、 " ";</p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  五、測(cè)試數(shù)據(jù)</b></p><p><b>

74、  新建一個(gè)鄰接表</b></p><p>  a.insertEdge(new weightedEdge<int>(1, 3, 2));</p><p>  a.insertEdge(new weightedEdge<int>(2, 3, 1));</p><p>  a.insertEdge(new weightedEdge&

75、lt;int>(1, 2, 3));</p><p>  a.insertEdge(new weightedEdge<int>(2, 4, 2));</p><p>  a.insertEdge(new weightedEdge<int>(3, 4, 4));</p><p><b>  六、測(cè)試情況</b><

76、;/p><p><b>  結(jié) 論</b></p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 數(shù)據(jù)結(jié)構(gòu)算法與應(yīng)用:c++語言描述/(美)薩尼(Sahni,S)著;王立柱等譯,北京:機(jī)械工業(yè)出版社 2015.1</p><p>  [2] 金遠(yuǎn)平.《數(shù)據(jù)結(jié)構(gòu)(c++描述).北京:清

溫馨提示

  • 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)論