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

下載本文檔

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

文檔簡介

1、<p>  課 程 設(shè) 計(jì) 報(bào) 告</p><p>  課程設(shè)計(jì)名稱:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</p><p>  課程設(shè)計(jì)題目: 約瑟夫環(huán)模擬</p><p>  院(系):計(jì)算機(jī)學(xué)院</p><p>  專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)</p><p><b>  1 課程設(shè)計(jì)介紹</b>&

2、lt;/p><p>  1.1 課程設(shè)計(jì)內(nèi)容</p><p>  由一個(gè)雙向循環(huán)鏈表模擬m個(gè)人站成一個(gè)圈,輸入一個(gè)數(shù)n,n>0正向前進(jìn),n<0逆向前進(jìn),當(dāng)前人由1開始計(jì)數(shù),每行進(jìn)一個(gè)人,計(jì)數(shù)加1,數(shù)到|n|的人出圈,然后依原行進(jìn)方向繼續(xù)由1開始計(jì)數(shù),重復(fù)上述過程,直到所有人都出圈,輸出其出圈序列。</p><p>  1.2 課程設(shè)計(jì)要求</p>

3、<p>  程序正常運(yùn)行,并將出圈順序以動(dòng)態(tài)方法表示出來。</p><p><b>  2 課程設(shè)計(jì)原理</b></p><p>  2.1 課設(shè)題目粗略分析</p><p>  根據(jù)課設(shè)題目要求,將整體程序分為查找和刪除兩大模塊:</p><p>  在查找模塊中,當(dāng)輸入的n的數(shù)值大于0時(shí),鏈表正向循環(huán)

4、且輸出第n人所在位置并調(diào)用刪除模塊釋放當(dāng)前節(jié)點(diǎn),直到所有人都出圈;當(dāng)輸入的n值小于0時(shí)鏈表逆向循環(huán)且輸出第n人所在位置并調(diào)用刪除模塊釋放當(dāng)前節(jié)點(diǎn),直到所有人出圈。</p><p>  刪除模塊負(fù)責(zé)將查找模塊找到的當(dāng)前人的節(jié)點(diǎn)進(jìn)行刪除并返回下一個(gè)人的位置。</p><p><b>  2.2 原理圖介紹</b></p><p>  2.2.1 功

5、能模塊圖</p><p>  如圖2.1所示為約瑟夫環(huán)模擬程序的功能模塊圖,函數(shù)包括查找模塊和刪除模塊,主函數(shù)中調(diào)用了查找模塊, 查找模塊中調(diào)用了刪除模塊。</p><p>  圖2.1 功能模塊圖</p><p>  2.2.2 流程圖分析</p><p>  主程序是整個(gè)程序的核心部分,通過對(duì)子函數(shù)JosephLink的調(diào)用,完成整個(gè)程序

6、,主函數(shù)流程圖表示如圖2.2所示: </p><p>  圖2.2主函數(shù)流程圖</p><p>  子函數(shù)JosephLink,主要功能為從當(dāng)前人開始查找第到|n|個(gè)人的位置并輸出第|n|個(gè)人所在位置,然后將第|n|個(gè)節(jié)點(diǎn)傳入函數(shù)del_link,流程圖如圖2.3所示:</p><p>  圖2.3子函數(shù)JosephLink流程圖</p><p&

7、gt;  子函數(shù)del_link1,主要功能為將由函數(shù)JosephLink查找到的節(jié)點(diǎn)進(jìn)行刪除操作并將該節(jié)點(diǎn)的下一節(jié)點(diǎn)返回到函數(shù)JosephLink中,流程圖如圖2.4所示:</p><p>  圖2.4 del_link1函數(shù)流程圖</p><p>  子函數(shù)del_link2,主要功能為將由函數(shù)JosephLink查找到的節(jié)點(diǎn)進(jìn)行刪除操作并將該節(jié)點(diǎn)的上一節(jié)點(diǎn)返回到函數(shù)JosephLin

8、k中,流程圖如圖2.5所示:</p><p>  圖2.5 del_link2函數(shù)流程圖</p><p><b>  3 數(shù)據(jù)結(jié)構(gòu)分析</b></p><p><b>  3.1 存儲(chǔ)結(jié)構(gòu)</b></p><p>  程序中主要用到的存儲(chǔ)結(jié)構(gòu)為雙向循環(huán)鏈表,其存儲(chǔ)結(jié)構(gòu)體為:</p>

9、<p>  typedef struct DulNode{</p><p><b>  int data;</b></p><p>  struct DulNode*prev;</p><p>  struct DulNode*next;</p><p><b>  }DulNode;</b&g

10、t;</p><p>  該結(jié)構(gòu)體包括數(shù)據(jù)域和前指針prev域與后指針next域。</p><p><b>  3.2 算法描述</b></p><p>  創(chuàng)建雙向循環(huán)鏈表,簡單算法說明如下:</p><p>  person=(DulNode*)malloc(sizeof(DulNode)); //為第一個(gè)節(jié)點(diǎn)

11、申請(qǐng)空間</p><p>  person->data=1; // data記錄當(dāng)前人的位置</p><p>  person->next=person->prev=person;</p><p><b>  s=person;</b></p><p&

12、gt;  for(i=2;i<=m;i++){ //創(chuàng)建m-1個(gè)節(jié)點(diǎn)</p><p><b>  r=s;</b></p><p>  s=(DulNode*)malloc(sizeof(DulNode));</p><p>  s->data=i;</p><p&

13、gt;  s->prev=r; //依次將新生成的節(jié)點(diǎn)插入循環(huán)鏈表中</p><p>  r->next->prev=s;</p><p>  s->next=r->next;</p><p>  r->next=s;}</p><p>  刪除節(jié)點(diǎn)tmp的算法

14、,如下所示:</p><p>  tmp->prev->next=tmp->next; //將tmp前一個(gè)節(jié)點(diǎn)的next指 </p><p>  //針指向tmp的下一個(gè)節(jié)點(diǎn)</p><p>  tmp->next->prev=tmp->prev;//將tmp下一個(gè)節(jié)

15、點(diǎn)的prev指針//指向tmp的上一個(gè)節(jié)點(diǎn)</p><p><b>  4 調(diào)試與分析</b></p><p><b>  4.1 調(diào)試過程</b></p><p>  在調(diào)試程序時(shí)主要遇到以下幾個(gè)問題:</p><p>  調(diào)試時(shí)發(fā)現(xiàn)在鏈表上刪除節(jié)點(diǎn)之后無法繼續(xù)將下一個(gè)節(jié)點(diǎn)作為開始來循環(huán)而且當(dāng)輸

16、入的n的值為n的整數(shù)倍時(shí)無法正常輸出出圈序列。</p><p>  問題分析及解決辦法:專門創(chuàng)建一個(gè)刪除函數(shù),負(fù)責(zé)刪除傳入的節(jié)點(diǎn)并返回刪除節(jié)點(diǎn)的下一節(jié)點(diǎn),另外申請(qǐng)一個(gè)節(jié)點(diǎn)傳入鏈表的表頭。</p><p>  當(dāng)鏈表中節(jié)點(diǎn)只剩下一個(gè)的時(shí)候發(fā)現(xiàn)無法輸出最后節(jié)點(diǎn)所在的位置。</p><p>  問題分析及解決辦法:在循環(huán)中添加一個(gè)判斷條件,當(dāng)鏈表中只剩唯一一個(gè)節(jié)點(diǎn)的時(shí)候單

17、獨(dú)輸出節(jié)點(diǎn)所在的位置。</p><p>  調(diào)試過程中發(fā)現(xiàn)在刪除第一個(gè)節(jié)點(diǎn)之后鏈表不能繼續(xù)前進(jìn)n個(gè)位置并輸出第n個(gè)位置的序列。 問題分析及解決辦法:當(dāng)?shù)谝粋€(gè)節(jié)點(diǎn)被刪除后,將第一個(gè)節(jié)點(diǎn)后的節(jié)點(diǎn)作為頭結(jié)點(diǎn)。</p><p>  調(diào)試過程中發(fā)現(xiàn)程序運(yùn)行時(shí)不能按照正常的順序輸出出圈序列,后經(jīng)過多次細(xì)心調(diào)試及同學(xué)幫助才發(fā)現(xiàn)是全局變量和局域變量發(fā)生沖突而導(dǎo)致。</p

18、><p>  解決辦法:將全局變量和局域變量分別用不同的字母表示加以區(qū)分,經(jīng)過調(diào)試后輸出正常。</p><p><b>  5 運(yùn)行結(jié)果</b></p><p><b>  如圖:</b></p><p><b>  參考文獻(xiàn)</b></p><p>  

19、[1] 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].北京:清華大學(xué)出版社,2007.</p><p>  [2] 呂英國.算法設(shè)計(jì)與分析[M].北京:清華大學(xué)出版社,2006. </p><p>  [3] 徐寶文 李志.C程序設(shè)計(jì)語言[M].北京:機(jī)械工業(yè)出版社,2004.</p><p>  [4] 張長海,陳娟.C程序設(shè)計(jì)[M].北京:高等教育出版社,2004

20、.</p><p>  [5] 譚浩強(qiáng).C程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2005.</p><p>  [6] 張千帆.數(shù)據(jù)結(jié)構(gòu)與算法(C語言實(shí)現(xiàn))[M].北京:科學(xué)出版社,2009</p><p>  [7] 徐寶文 李志 . C程序設(shè)計(jì)語言[M] . 北京:機(jī)械工業(yè)出版社,2004</p><p>  附 錄(關(guān)鍵部分程序清單

21、)</p><p><b>  程序代碼</b></p><p>  #include<stdio.h> </p><p>  #include<stdlib.h></p><p>  #include<malloc.h></p><p>  typede

22、f struct DulNode</p><p><b>  {</b></p><p><b>  int data;</b></p><p>  struct DulNode*prev;</p><p>  struct DulNode*next;</p><p><

23、;b>  }DulNode;</b></p><p>  DulNode*del_link1(DulNode*person,DulNode*tmp,int m)</p><p>  { /* n>0 刪除第n個(gè)節(jié)點(diǎn)打印本次操作結(jié)果并返回后一個(gè)節(jié)點(diǎn)信息*/</p><p>  DulN

24、ode*s=tmp;</p><p><b>  int i=0;</b></p><p>  DulNode*head;</p><p>  if(tmp!=person)</p><p>  head=person;</p><p><b>  else</b></

25、p><p>  head=person->next;</p><p>  tmp->prev->next=tmp->next;</p><p>  tmp->next->prev=tmp->prev;</p><p>  s=s->next;</p><p>  free(t

26、mp);</p><p>  printf("\n");</p><p><b>  if(m>1)</b></p><p><b>  {</b></p><p>  for(i=0;i<m;i++)</p><p><b>  {

27、</b></p><p>  printf("%d ",head->data);</p><p>  head=head->next;</p><p><b>  }</b></p><p>  printf("\n");</p><p&

28、gt;<b>  }</b></p><p><b>  return s;</b></p><p><b>  }</b></p><p>  DulNode*del_link2(DulNode*person,DulNode*tmp,int m)</p><p>  {

29、 /* n<0 刪除第n個(gè)節(jié)點(diǎn)打印本次操作結(jié)果并返回前一個(gè)節(jié)點(diǎn)信息*/</p><p>  DulNode*s=tmp;</p><p><b>  int i=0;</b></p><p>  DulNode*head;</p><p>  if(tmp!

30、=person)</p><p>  head=person;</p><p><b>  else </b></p><p>  head=person->next;</p><p>  tmp->prev->next=tmp->next;</p><p>  tmp-&

31、gt;next->prev=tmp->prev;</p><p>  s=s->prev;</p><p>  free(tmp);</p><p>  printf("\n");</p><p><b>  if(m>1)</b></p><p>&l

32、t;b>  {</b></p><p>  for(i=0;i<m;i++)</p><p><b>  {</b></p><p>  printf("%d ",head->data);</p><p>  head=head->next;</p>

33、<p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  return s;</b></p><p><b>  }</b></p

34、><p>  void JosephLink(DulNode*person,int m,int n)</p><p>  { /* 查找并打印第n個(gè)節(jié)點(diǎn)*/</p><p><b>  int i;</b></p><p>  DulNode*tmp=person;</p&g

35、t;<p><b>  if(n>0)</b></p><p><b>  {</b></p><p>  while(tmp->next!=tmp)</p><p><b>  {</b></p><p>  for(i=1;i<n;i++)&

36、lt;/p><p><b>  {</b></p><p>  tmp=tmp->next;</p><p><b>  }</b></p><p>  printf("出圈數(shù)據(jù)為:\n%d \n圈中剩余數(shù)據(jù)為:",tmp->data);</p><p

37、><b>  m--;</b></p><p>  if(tmp==person)</p><p>  person=person->next;</p><p>  tmp=del_link1(person,tmp,m);</p><p><b>  }</b></p>&

38、lt;p>  printf("%d\n",tmp->data);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  while(tmp->pre

39、v!=tmp)</p><p><b>  {</b></p><p>  for(i=1;i<-n;i++)</p><p><b>  {</b></p><p>  tmp=tmp->prev;</p><p><b>  }</b>&

40、lt;/p><p>  printf("出圈數(shù)據(jù)為:\n%d \n圈中剩余數(shù)據(jù)為:",tmp->data);</p><p><b>  m--;</b></p><p>  if(tmp==person)</p><p>  person=person->next;</p>&

41、lt;p>  tmp=del_link2(person,tmp,m);</p><p><b>  }</b></p><p>  printf("%d\n",tmp->data);</p><p><b>  }</b></p><p><b>  }&l

42、t;/b></p><p>  void main()</p><p><b>  {</b></p><p>  DulNode*person,*s,*r;</p><p>  int i,m,n;</p><p>  printf("請(qǐng)輸入人數(shù)m:\n");</

43、p><p>  scanf("%d",&m);</p><p>  printf("請(qǐng)輸入n的值:\n");</p><p>  scanf("%d",&n);</p><p>  printf("約瑟夫環(huán)為:\n");</p><

44、p>  if(m%2==1)</p><p><b>  {</b></p><p>  for(i=1;i<=m/2+1;i++)</p><p>  printf("%d ",i);</p><p>  printf("\n");</p><p&

45、gt;  for(i=m;i>m/2+1;i--)</p><p>  printf("%d ",i);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p>

46、<p>  for(i=1;i<=m/2;i++)</p><p>  printf("%d ",i);</p><p>  printf("\n");</p><p>  for(i=m;i>m/2;i--)</p><p>  printf("%d ",i

47、);</p><p><b>  }</b></p><p>  printf("\n");</p><p>  printf("出圈動(dòng)態(tài)為:\n");</p><p>  person=(DulNode*)malloc(sizeof(DulNode));</p>&

48、lt;p>  person->data=1;</p><p>  person->next=person->prev=person;</p><p><b>  s=person;</b></p><p>  for(i=2;i<=m;i++)</p><p><b>  {<

49、;/b></p><p><b>  r=s;</b></p><p>  s=(DulNode*)malloc(sizeof(DulNode));</p><p>  s->data=i;</p><p>  s->prev=r;</p><p>  r->next-&g

50、t;prev=s;</p><p>  s->next=r->next;</p><p>  r->next=s;</p><p><b>  }</b></p><p>  printf("\n");</p><p>  JosephLink(person,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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)論