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

下載本文檔

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

文檔簡介

1、<p><b>  鏈?zhǔn)胶唵芜x擇排序</b></p><p><b>  1 設(shè)計題目</b></p><p><b>  鏈?zhǔn)胶唵芜x擇排序</b></p><p><b>  2 問題描述</b></p><p>  鏈?zhǔn)胶唵芜x擇排序即以單鏈表

2、為存儲結(jié)構(gòu),實現(xiàn)簡單選擇排序的功能。顯然,實現(xiàn)該程序就是先要建立一個單鏈表,利用單鏈表對數(shù)據(jù)進行存儲、操作。將輸入的整型數(shù)據(jù)以結(jié)點的形式存儲在這個建立的單鏈表中。然后對單鏈表中的這些結(jié)點的值進行簡單選擇排序。</p><p>  該問題中,以帶有附加頭結(jié)點的單鏈表為存儲結(jié)構(gòu),排序分為從大到小排序和從小到大排序兩種方式,我們可以用這兩種方法分別實現(xiàn)進行排序,分別得到結(jié)果。</p><p>&

3、lt;b>  3 設(shè)計</b></p><p>  3.1 存儲結(jié)構(gòu)設(shè)計</p><p>  線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)的特點是用一組任意的可以是不連續(xù)的存儲單元存儲線性表的數(shù)據(jù)元素。它包括兩個域:其中存儲數(shù)據(jù)元素信息的稱為數(shù)據(jù)域;存儲直接后繼存儲位置的域稱為指針域。</p><p>  單鏈表結(jié)構(gòu)體的定義如下:</p><p>

4、  Struct link_node //鏈表節(jié)點類的定義</p><p><b>  {</b></p><p>  int data; //指針域</p><p>  link_node*next; //值域,不是float *next; 關(guān)于鏈表中的</p><p> 

5、 //指針指向問題 </p><p>  link_node(link_node*ptr=NULL){next=ptr;}; </p><p>  //初始化指針成員的構(gòu)造函數(shù)</p><p>  link_node(const int &item,link_node*ptr=NULL)</p><p>  {

6、 //初始化指針成員和數(shù)據(jù)的構(gòu)造函數(shù)</p><p>  data=item; </p><p><b>  next=ptr;</b></p><p>  }; </p><p>  }; //結(jié)構(gòu)體定義“;”

7、結(jié)束</p><p>  其中,值域data以整型存儲了所要排序的關(guān)鍵字值,而指針域next以指針型存儲了指向下一個結(jié)點的地址。其中兩個構(gòu)造函數(shù)分別用于初始化數(shù)據(jù)和指針成員。Link_node是定義的一個全局結(jié)構(gòu)體變量,可以在下面的任何函數(shù)中調(diào)用。</p><p>  3.2 主要算法設(shè)計</p><p>  本程序中主要用到5個函數(shù),分別是構(gòu)造函數(shù)list()、輸

8、入結(jié)點數(shù)據(jù)input(int)、輸出數(shù)據(jù)函數(shù)output()、從小到大排列函數(shù)SelectSort1()、從大到小排列函數(shù) void SelectSort2()。</p><p><b>  構(gòu)造函數(shù):</b></p><p>  list(){first=new link_node;}; //創(chuàng)建附加頭結(jié)點,first指向該結(jié)點</p><p&

9、gt;<b>  輸入節(jié)點數(shù)據(jù)函數(shù):</b></p><p>  利用后插法建立鏈表,算法如下</p><p>  void list::input(int endTag)</p><p>  //其中DendTag為約定的輸入序列結(jié)束標(biāo)括志;利用后插法建立單鏈表</p><p><b>  {</b&

10、gt;</p><p>  link_node *newnode,*last;</p><p><b>  int val;</b></p><p>  make_empty(); //清空鏈表 </p><p><b>  cin>&g

11、t;val;</b></p><p>  last=first; </p><p>  while (val!=endTag) //last指向表尾</p><p><b>  {</b></p><p>  newnode=new link_node(val);<

12、;/p><p>  if(newnode==NULL)</p><p><b>  {</b></p><p>  cerr<<"存儲分配失誤"<<endl;</p><p><b>  exit(1);</b></p><p>  }

13、 //動態(tài)分配失敗</p><p>  last->next=newnode;</p><p>  last=newnode; //last永遠指向表尾</p><p>  cin>>val; //插入到表末端</p><p><b>  }&

14、lt;/b></p><p>  last->next=NULL; //可有可無,表收尾</p><p><b>  }</b></p><p>  函數(shù)SelectSort1( )和SelectSort2( )的基本實現(xiàn)思想是一樣的,只是一些細節(jié)有所不同。兩者構(gòu)成了本程序的主體部分,鏈?zhǔn)胶唵芜x擇排序

15、的基本思想是:每一趟排序(例如第i趟,i=0,1,2,…,n-2)在后面n-i個待排序的節(jié)點數(shù)據(jù)中找出最小的元素,作為有序元素排列的第i個元素。待到第n-2趟做完,待排序元素只剩一個了,就不用再選了。</p><p>  SelectSort1( ) //實現(xiàn)從小到大排序,其實現(xiàn)代碼見附表實驗代碼。</p><p>  SelectSort2( ) //實現(xiàn)從大到小排序,其實現(xiàn)代碼

16、見附表實驗代碼。</p><p>  這樣,主要算法中的函數(shù),只需在主函數(shù)中調(diào)用即可實現(xiàn)。</p><p>  3.3 測試用例設(shè)計</p><p>  任意輸入幾個數(shù)據(jù),以0為終止符,例如輸入972845 ,634873,127498, 928134, 518487, 215398,對其進行從大到小的排序,排序后結(jié)果應(yīng)為972845 ,928134,634873

17、,518487,215398,127498。</p><p>  再輸入若干整數(shù),例如輸入98375 , 69828, 76837, 10738, 63874, 90897,對其進行從大到小的排序,排序后結(jié)果應(yīng)為10738, 63874,69828,76837,90897, 98375 。</p><p><b>  4 調(diào)試報告</b></p>

18、<p>  本實驗需要采用支持標(biāo)準(zhǔn)Microsoft Visual C++ 2010 Express編譯器,并采用最基礎(chǔ)的Win32控制臺程序。</p><p>  在調(diào)試程序時,出現(xiàn)錯誤提示如下:</p><p><b> ?。?)</b></p><p>  1>------ 已啟動生成:項目: 鏈?zhǔn)胶唵芜x擇排序--初級

19、版, 配置: Debug Win32 ------</p><p>  1> 鏈排序.cpp</p><p>  1>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(11): error C2236: 意外的“class”“l(fā)ist”

20、,是否忘記了“;”?</p><p>  1>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(11): error C2143: 語法錯誤: 缺少“;”(在“{”的前面)</p><p>  1>c:\users\administra

21、tor\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(11): error C2447: “{”: 缺少函數(shù)括題(是否是老式的形式表?)</p><p>  1>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級

22、版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(24): error C2653: “l(fā)ist”:不是類或命名空間名稱</p><p>  1>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(46): error C2653: “l(fā)ist”:不是類或命名空間名稱&

23、lt;/p><p>  1>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(55): error C2653: “l(fā)ist”:不是類或命名空間名稱</p><p>  1>c:\users\administrator\documents\

24、visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(59): error C2065: “first”: 未聲明的標(biāo)識符</p><p>  1>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.c

25、pp(59): error C2227: “->next”的左邊必須指向類結(jié)構(gòu)/聯(lián)合/泛型類型</p><p>  1>類型是“unknown-type”</p><p>  1>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(

26、79): error C2653:“l(fā)ist”:不是類或命名空間名稱</p><p>  1>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(83): error C2065:“first”:未聲明的標(biāo)識符</p><p>  1>1

27、>c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(83): error C2227: “->next”的左邊必須指向類結(jié)構(gòu)/聯(lián)合/泛型類型</p><p>  1>類型是“unknown-type”</p><p>  1>

28、;c:\users\administrator\documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(101): error C2653:“l(fā)ist”:不是類或命名空間名稱</p><p>  1>c:\users\administrator\documents\visual studio 2010\project

29、s\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈排序.cpp(104): error C2227:“->next”的左邊必須指向類結(jié)構(gòu)/聯(lián)合/泛型類型</p><p>  1> 類型是“unknown-type”</p><p>  1>c:\users\administrator\d鏈排序.cpp(104): fatal error C1903:無法從以前

30、的錯誤中恢復(fù);正在停止編譯</p><p>  ==========生成:成功 0 個,失敗 1 個,最新 0 個,跳過 0 個==========</p><p>  ========== 生成:成功 0 個,失敗 1 個,最新 0 個,跳過 0 個documents\visual studio 2010\projects\鏈?zhǔn)胶唵芜x擇排序--初級版\鏈?zhǔn)胶唵芜x擇排序--初級版\====

31、======</p><p><b>  原因分析:</b></p><p>  (1)結(jié)構(gòu)體定義結(jié)束之后應(yīng)用“;”結(jié)束。</p><p>  (2)兩節(jié)點數(shù)據(jù)作比較時不應(yīng)該是 if(current2<=current3) if(current2->data>=current3->data)或者if(current2-&

32、gt;data<=current3->data)。</p><p>  因為結(jié)點包含兩個數(shù)據(jù)。</p><p><b>  5 經(jīng)驗和體會</b></p><p>  本實驗課題的設(shè)計中涉及到了數(shù)據(jù)結(jié)構(gòu)中單鏈表鏈表和選擇排序兩個知識點,通過本次課程設(shè)計,我對鏈表的一些操作:如帶附加頭結(jié)點的鏈表的創(chuàng)建,鏈表數(shù)據(jù)的輸入,節(jié)點數(shù)據(jù)的輸出以

33、及簡單選擇排序有了深刻的理解,通過自己動手寫代碼,同時加深了對選擇排序執(zhí)行過程的了解。同時也鍛煉了自己的動手寫代碼的能力。</p><p>  在實驗中遇到了平時只看書認識不到的各種語法錯誤和編譯錯誤,之前對鏈表有一些錯誤的認識,通過不斷地調(diào)試,對之前的錯誤觀點進行了糾正。編寫程序的能力是逐步鍛煉出來的,除了對知識的熟悉程度,還要用耐心去處理程序編寫過程中的各種小錯大錯,這是對一個將要從事計算機編程行業(yè)的人的基本

34、要求。當(dāng)遇到各種編譯或語法錯誤時,我們必須靜下心來,仔細思考問題,理清編程時的思路,確保思路正確,然后反復(fù)的調(diào)試,直至寫出正確的,健壯的計算機程序。如果自己實在找不出錯誤原因,我們?nèi)钥梢哉彝瑢W(xué)一起討論。</p><p>  總之,通過課程設(shè)計,我認識到我們在平常上課時就應(yīng)該去了解每種算法解決的問題,去認真學(xué)習(xí)并嘗試編寫經(jīng)典算法,去認真聽老師講的每一個程序,從老師那里去了解他們比較成熟的編程思想,并學(xué)以致用。同時我

35、了解到在平時學(xué)習(xí)中就應(yīng)該經(jīng)常鍛煉自己的動手能力,并鞏固我們課堂上學(xué)習(xí)的基礎(chǔ)知識,這樣才能讓自己的計算機編程能力進步的更快。</p><p><b>  6 附錄</b></p><p><b>  6.1 源程序清單</b></p><p>  #include<iostream></p><

36、;p>  using namespace std;</p><p>  Struct link_node //鏈表節(jié)點類的定義</p><p><b>  {</b></p><p>  int data; //值域</p><p>  link_node*next;

37、 //指針域 </p><p>  link_node(link_node*ptr=NULL){next=ptr;}; </p><p>  //初始化指針成員的構(gòu)造函數(shù)</p><p>  link_node(const int &item,link_node*ptr=NULL)</p><p>&l

38、t;b>  {</b></p><p>  data=item; </p><p><b>  next=ptr;</b></p><p>  }; // 初始化指針成員和數(shù)據(jù)的構(gòu)造函數(shù)</p><p>  }; //錯誤:結(jié)構(gòu)

39、體定義結(jié)束需要用“;”結(jié)束</p><p>  class list{</p><p><b>  public:</b></p><p>  list(){first=new link_node;};</p><p>  void input(int); //輸入</p><p&g

40、t;  void output(); //輸出</p><p>  void SelectSort1(); //從小到大排列</p><p>  void SelectSort2(); //從大到小排列</p><p>  void make_empty(); //錯誤2:只聲明未定義該函數(shù)</p>&

41、lt;p><b>  ~list()</b></p><p>  {make_empty();}; //析構(gòu)函數(shù) </p><p><b>  private:</b></p><p>  link_node

42、 *first;</p><p><b>  }; </b></p><p>  void list::input(int endTag)</p><p>  //其中DendTag為約定的輸入序列結(jié)束標(biāo)括志;利用后插法建立單鏈表</p><p><b>  {</b></p>&l

43、t;p>  link_node *newnode,*last;</p><p><b>  int val;</b></p><p>  make_empty(); //清空鏈表 </p><p><b>  cin>>val;</b>&

44、lt;/p><p>  last=first; </p><p>  while (val!=endTag){ //last指向表尾</p><p>  newnode=new link_node(val);</p><p>  if(newnode==NULL)</p><p>&l

45、t;b>  {</b></p><p>  cerr<<"存儲分配失誤"<<endl;</p><p><b>  exit(1);</b></p><p>  } //動態(tài)分配失敗</p><p>  last->next=

46、newnode;</p><p>  last=newnode; //last永遠指向表尾</p><p>  cin>>val; //插入到表末端</p><p><b>  }</b></p><p>  last->next=NULL; //可有可

47、無,表收尾</p><p><b>  }</b></p><p>  void list::output()</p><p><b>  {</b></p><p>  link_node*current=first->next ;</p><p>  while (

48、current!=NULL) { //輸出停止,即無后續(xù)結(jié)點</p><p>  cout<<current->data<<" "; //輸出結(jié)點儲存的值</p><p>  current=current->next;</p><p><b>  }</b></p&

49、gt;<p><b>  }</b></p><p>  void list::SelectSort1() //從小到大的排序</p><p><b>  {</b></p><p>  link_node*current1,*current2,*current3;</p><

50、p><b>  int temp;</b></p><p>  for(current1=first->next;current1->next!=NULL;current1=current1->next)</p><p>  { //current1指向本趟查詢的首元素</p><p>  /

51、/current2用于查找最小元素</p><p>  //current3用于指向已經(jīng)查詢過的數(shù)據(jù)中的最小元素</p><p>  current3=current1;</p><p>  for(current2=current1->next;current2->next!=NULL;current2=current2->next)</p

52、><p><b>  {</b></p><p>  if(current2->data<=current3->data)</p><p>  current3=current2;</p><p><b>  }</b></p><p>  if(current

53、2->data<=current3->data)</p><p>  current3=current2; </p><p>  //與上面for語句結(jié)合找出本趟查詢最小的元素</p><p>  if (current1->next!=current3->next){</p>

54、<p>  temp=current1->data;</p><p>  current1->data=current3->data;</p><p>  current3->data=temp;</p><p>  } //將本趟查詢的最小元素與本趟查找首元素交換位置</p><p><b&g

55、t;  }</b></p><p><b>  }</b></p><p>  void list::SelectSort2() </p><p>  //從大到小排序,原理與從小到大排序相同</p><p><b>  {</b&g

56、t;</p><p>  link_node*current1,*current2,*current3;</p><p><b>  int temp;</b></p><p>  for(current1=first->next;current1->next!=NULL;current1=current1->next)<

57、;/p><p><b>  {</b></p><p>  current3=current1;</p><p>  for(current2=current1->next;current2->next!=NULL;current2=current2->next)</p><p><b>  {&

58、lt;/b></p><p>  if(current2->data>=current3->data)</p><p>  current3=current2;</p><p><b>  }</b></p><p>  if(current2->data>=current3->

59、data)</p><p>  current3=current2;</p><p>  if (current1->next!=current3->next){</p><p>  temp=current1->data;</p><p>  current1->data=current3->data;<

60、/p><p>  current3->data=temp;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void list:: make_empty()&l

61、t;/p><p><b>  {</b></p><p>  link_node *q;</p><p>  while(first->next!=NULL)</p><p><b>  {</b></p><p>  q=first->next;</p>

62、<p>  first->next=q->next; //從頭結(jié)點開始刪除</p><p><b>  delete q;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int

63、main()</p><p><b>  { </b></p><p>  list a; //建立對象</p><p>  cout<<"向鏈表括中輸入數(shù)據(jù)(0表示終止字符):\n";</p><p>  a.input(0);

64、 //0為終止符</p><p>  cout<<"您輸入的數(shù)據(jù)為a:\n";</p><p>  a.output();</p><p>  cout<<"\n選單:\n.從小到大排列\(zhòng)n2.從大到小排列\(zhòng)n";</p><p>  int c

65、hoice;</p><p>  cin>>choice;</p><p>  if(choice==1){</p><p>  a.SelectSort1();</p><p>  cout<<"\n排序后的數(shù)列為(從小到大排序):"<<endl;</p><p&g

66、t;  a.output();</p><p>  cout<<"\n";</p><p><b>  }</b></p><p>  else if(choice==2){</p><p>  a.SelectSort2();</p><p>  cout<

67、<"\n排序后的數(shù)列為(從大到小排序):"<<endl;</p><p>  a.output();</p><p>  cout<<"\n";</p><p><b>  }</b></p><p><b>  else</b>

68、</p><p>  cout<<"輸入錯誤";</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  6.2運行結(jié)果</b></p><p>  對于

69、鏈?zhǔn)胶唵芜x擇排序,其數(shù)據(jù)比較次數(shù)與待排序序列的初始順序無關(guān),其比較次數(shù)總是O(n*n),但元素移動次數(shù)則與待排序元素序列有關(guān),最好情況下數(shù)據(jù)一次也不用移動,最壞情況下元素每一趟都要進行結(jié)點數(shù)據(jù)交換,總的移動次數(shù)為3(n-1)。</p><p><b>  運行輸出結(jié)果:</b></p><p><b>  從大到小排列</b></p>

溫馨提示

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

評論

0/150

提交評論