數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告—敢死隊(duì)的問題_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(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ù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p><b>  年月日</b></p><p><b>  敢死隊(duì)問題</b></p><p><b>  問題描述</b></p><p>  有M個(gè)敢死隊(duì)員要炸掉敵人的一碉堡,

2、誰都不想去,排長(zhǎng)決定用輪回?cái)?shù)數(shù)的辦法來決定哪個(gè)戰(zhàn)士去執(zhí)行任務(wù)。如果前一個(gè)戰(zhàn)士沒完成任務(wù),則要再派一個(gè)戰(zhàn)士上去?,F(xiàn)給每個(gè)戰(zhàn)士編一個(gè)號(hào),大家圍坐成一圈,隨便從某一個(gè)戰(zhàn)士開始計(jì)數(shù),當(dāng)數(shù)到5時(shí),對(duì)應(yīng)的戰(zhàn)士就去執(zhí)行任務(wù),且此戰(zhàn)士不再參加下一輪計(jì)數(shù)。如果此戰(zhàn)士沒完成任務(wù),再?gòu)南乱粋€(gè)戰(zhàn)士開始數(shù)數(shù),被數(shù)到第5時(shí),此戰(zhàn)士接著去執(zhí)行任務(wù)。以此類推,直到任務(wù)完成為止。</p><p>  排長(zhǎng)是不愿意去的,假設(shè)排長(zhǎng)為1號(hào),請(qǐng)你設(shè)計(jì)一程

3、序,求出從第幾號(hào)戰(zhàn)士開始計(jì)數(shù)才能讓排長(zhǎng)最后一個(gè)留下來而不去執(zhí)行任務(wù)。</p><p>  要求:至少采用兩種不同的數(shù)據(jù)結(jié)構(gòu)的方法實(shí)現(xiàn)。</p><p>  一、單循環(huán)鏈表數(shù)據(jù)結(jié)構(gòu)</p><p><b>  (一) 需求分析</b></p><p>  1.本程序任務(wù)是通過輸入任意隊(duì)伍人數(shù)n和報(bào)數(shù)上限m,輸出使排長(zhǎng)最后一

4、個(gè)執(zhí)行任務(wù)而開始記數(shù)的初始位置。首先輸入隊(duì)伍人數(shù)n,然后輸入報(bào)數(shù)上限m(m<=n),從1號(hào)開始報(bào)數(shù),當(dāng)達(dá)到報(bào)數(shù)上限時(shí),那名士兵出列執(zhí)行任務(wù),從下個(gè)人開始記數(shù),再次循環(huán),直到只剩一人,得到其在隊(duì)伍中的位置,記下該位置視為排長(zhǎng)位置,則1號(hào)即可視為最先報(bào)數(shù)的人,通過數(shù)學(xué)計(jì)算即可獲得所求。</p><p>  2.功能模塊和流程: </p><p><b>  1)功能模塊<

5、/b></p><p>  該程序功能比較單一,主要是為解決敢死隊(duì)問題而設(shè)計(jì)。通過輸入隊(duì)伍人數(shù)和報(bào)數(shù)上限即可獲得開始報(bào)數(shù)的位置。</p><p><b>  2)程序流程</b></p><p> ?。?)構(gòu)造鏈表(2)數(shù)據(jù)輸入(3)執(zhí)行刪除(4)輸出要求數(shù)值(5)結(jié)束</p><p><b>  3.數(shù)

6、據(jù)測(cè)試:</b></p><p>  當(dāng) n=10,m=5, 輸出結(jié)果為:要求的位置是:9。</p><p><b>  (二) 詳細(xì)設(shè)計(jì)</b></p><p><b>  1.算法設(shè)計(jì):</b></p><p>  本程序其實(shí)質(zhì)是約瑟夫環(huán)問題。從排長(zhǎng)位置即1號(hào)開始報(bào)數(shù),共有n個(gè)人,達(dá)

7、到報(bào)數(shù)上限m=5的戰(zhàn)士出列,繼續(xù)進(jìn)行報(bào)數(shù),直到剩余最后一人,記下該位置為k。若將該位置視為排長(zhǎng)位置,則原先的1號(hào)位置即位所有的開始報(bào)數(shù)的位置z。則z=n-k+2。</p><p>  2.以單循環(huán)鏈表為存儲(chǔ)結(jié)構(gòu),包含三個(gè)模塊: </p><p><b> ?。?)主程序模塊 </b></p><p> ?。?)構(gòu)造鏈表并初始化</p>

8、;<p><b> ?。?)刪除結(jié)點(diǎn) </b></p><p>  3.結(jié)點(diǎn)類型和指針類型</p><p>  typedef struct node</p><p><b>  {</b></p><p><b>  int data;</b></p>

9、;<p>  struct node *next;</p><p>  }LNode;/* 定義結(jié)點(diǎn)類型 */</p><p><b>  LNode *p;</b></p><p><b>  4.每個(gè)模塊的分析</b></p><p><b>  (1)主程序模塊:<

10、;/b></p><p><b>  main()</b></p><p><b>  {</b></p><p><b>  LNode *p;</b></p><p>  int m,n,z,y;</p><p><b>  do&l

11、t;/b></p><p><b>  {</b></p><p>  printf(" Please input the people number:\n");</p><p>  scanf ("%d",&n);</p><p><b>  }</

12、b></p><p>  while (n<=0);</p><p><b>  do</b></p><p><b>  {</b></p><p>  printf(" Please input the excursion:\n");</p><

13、;p>  scanf("%d",&m);</p><p><b>  }</b></p><p>  while (m<=0);</p><p><b>  if (n=1)</b></p><p>  printf("the position is

14、: 1");</p><p><b>  else</b></p><p><b>  {</b></p><p>  p=CREAT(n);</p><p>  y=DELETE(p,m);</p><p><b>  z=n-y+2;</b>

15、;</p><p>  if(z%n==0) /* 排除特殊情況 */</p><p>  printf ("the position is:\n%d\n",z);</p><p><b>  else</b></p><p>  printf("the position is:\n%d\

16、n",(n-y+2)%n);</p><p>  }/* 通過數(shù)學(xué)思想求得實(shí)驗(yàn)要求情況下的數(shù)值 */</p><p><b>  }</b></p><p> ?。?)構(gòu)造單循環(huán)鏈表并初始化模塊:</p><p>  LNode* CREAT(int n) /* 創(chuàng)建循環(huán)鏈表 */</p><

17、;p><b>  {</b></p><p>  LNode *s,*q,*t;</p><p><b>  int i;</b></p><p><b>  if(n!=0)</b></p><p><b>  {</b></p>&

18、lt;p>  t=q=(LNode *)malloc(sizeof(LNode));</p><p>  q->data=1;/* 生成第一個(gè)結(jié)點(diǎn)并使其data值為1 */</p><p>  for(i=2;i<=n;i++)</p><p><b>  {</b></p><p>  s=(LNod

19、e *)malloc(sizeof(LNode));/*自動(dòng)生成結(jié)點(diǎn)*/</p><p>  q->next=s;</p><p>  q->next->data=i;/*給第i個(gè)結(jié)點(diǎn)賦值i*/</p><p>  q=q->next;</p><p><b>  }</b></p>

20、<p>  q->next=t;</p><p>  }/* 生成后續(xù)結(jié)點(diǎn),并使其data值即為它所在鏈表(隊(duì)伍)中的位置 */</p><p><b>  return t;</b></p><p><b>  }</b></p><p>  (3)刪除結(jié)點(diǎn)模塊:</p&g

21、t;<p>  DELETE (LNode* t,int m)/* 鏈表的刪除 */</p><p><b>  {</b></p><p>  LNode *a;int i;</p><p>  while (t->next!=t)</p><p><b>  {</b><

22、;/p><p>  for (i=1;i<m-1;i++)/*查找要?jiǎng)h除結(jié)點(diǎn)的前一結(jié)點(diǎn)*/</p><p>  t=t->next;</p><p>  a=t->next;</p><p>  t->next=a->next;</p><p>  free(a);/*釋放結(jié)點(diǎn)*/</p

23、><p>  t=t->next;</p><p>  }/* while循環(huán)依次刪除被點(diǎn)到的士兵 */</p><p>  printf("\n");</p><p>  return (t->data);</p><p><b>  }</b></p>

24、<p><b>  (三) 調(diào)試分析:</b></p><p>  1.本程序運(yùn)行后的結(jié)果應(yīng)是如下提示:</p><p>  Exit please input '0' Or Go on </p><p>  Please input the tatal of the team:</p><p&

25、gt;<b>  輸入隊(duì)伍總?cè)藬?shù)</b></p><p>  Please input the excursion:</p><p><b>  輸入間隔人數(shù)</b></p><p>  結(jié)果顯示:The wanted position is </p><p><b>  選擇的位置&l

26、t;/b></p><p>  2.在程序調(diào)試運(yùn)行的過程中產(chǎn)生了各種各樣的問題,有的是多了空格,有的是拼寫錯(cuò)誤,還有的是少了括號(hào),類似的問題有很多。解決的辦法是一遍遍嘗試,不斷逐行逐句進(jìn)行修改。</p><p>  例如程序調(diào)試過程中遇到警告:發(fā)現(xiàn)錯(cuò)誤為 if(m=1)</p><p>  后改正為 if(m==1)程序運(yùn)行正確了,運(yùn)行如下:</

27、p><p><b>  顯示輸出如圖:</b></p><p>  3.由程序分析可得:本程序時(shí)間復(fù)雜度為O(nm)!</p><p>  4.①在設(shè)計(jì)生成循環(huán)單鏈表時(shí),考慮到程序結(jié)果需要士兵的位序,故將每個(gè)結(jié)點(diǎn)的data值設(shè)置為他們?cè)陉?duì)列中的位置,方便返回。 </p><p>  ②在刪除單鏈表時(shí),如果在報(bào)數(shù)時(shí)直接數(shù)到出列

28、士兵則不方便鏈表的刪除,可設(shè)置i<m-1找到出列士兵的前一位執(zhí)行如下:</p><p>  for (i=1;i<m-1;i++)/*查找要?jiǎng)h除結(jié)點(diǎn)的前一結(jié)點(diǎn)*/</p><p>  t=t->next;</p><p>  a=t->next;</p><p>  t->next=a->next;<

29、/p><p>  free(a);/*釋放結(jié)點(diǎn)*/</p><p>  t=t->next;</p><p> ?、郏诔绦蛟O(shè)計(jì)前,如果按原題所設(shè),則需設(shè)隊(duì)長(zhǎng)為第一位,再分別測(cè)試從第幾個(gè)開始才能符合條件?,F(xiàn)在改變思想,通過數(shù)學(xué)思想:?jiǎn)窝h(huán)鏈表本身是一個(gè)循環(huán)體,可先求出當(dāng)從第一個(gè)出發(fā)的話,求出每隔m個(gè)出去一個(gè)最后是誰未出列,然后再設(shè)置它為鏈頭,求出當(dāng)他為隊(duì)首時(shí)從第幾

30、個(gè)開始方能使其不出列。(n-y+2)%n 即可實(shí)現(xiàn)這功能!</p><p><b>  5.經(jīng)驗(yàn)與體會(huì)</b></p><p>  通過這次課程設(shè)計(jì)我又學(xué)到了很多東西,如程序的模塊化設(shè)計(jì)思想,同時(shí)也加深了對(duì)數(shù)據(jù)結(jié)構(gòu)這門課程的理解和學(xué)會(huì)了如何在實(shí)際中應(yīng)用數(shù)據(jù)結(jié)構(gòu).</p><p>  這個(gè)方法是用單循環(huán)鏈表來做的,實(shí)現(xiàn)的方法是這樣的:首先從第一號(hào)

31、開始報(bào)數(shù),循環(huán)到指定的偏移位置刪除結(jié)點(diǎn),直至剩下一個(gè)結(jié)點(diǎn)。然后設(shè)計(jì)輸出,令這個(gè)位置為隊(duì)長(zhǎng)位置,隊(duì)首為開始報(bào)數(shù)的位置,并按此輸出即為所求。這種方法大大的降低了時(shí)間復(fù)雜度,復(fù)雜度為O(mn)。</p><p><b>  (五)測(cè)試結(jié)果</b></p><p><b> ?。└郊?lt;/b></p><p>  typedef

32、 struct node</p><p><b>  {</b></p><p><b>  int data;</b></p><p>  struct node *next;</p><p>  }LNode;/* 定義結(jié)點(diǎn)類型 */</p><p>  LNode* C

33、REAT(int n) /* 創(chuàng)建循環(huán)鏈表 */</p><p><b>  {</b></p><p>  LNode *s,*q,*t;</p><p><b>  int i;</b></p><p><b>  if(n!=0)</b></p><p

34、><b>  {</b></p><p>  t=q=(LNode *)malloc(sizeof(LNode));</p><p>  q->data=1;/* 生成第一個(gè)結(jié)點(diǎn)并使其data值為1 */</p><p>  for(i=2;i<=n;i++)</p><p><b>  {&

35、lt;/b></p><p>  s=(LNode *)malloc(sizeof(LNode));/*自動(dòng)生成結(jié)點(diǎn)*/</p><p>  q->next=s;</p><p>  q->next->data=i;/*給第i個(gè)結(jié)點(diǎn)賦值i*/</p><p>  q=q->next;</p><

36、;p><b>  }</b></p><p>  q->next=t;</p><p>  }/* 生成后續(xù)結(jié)點(diǎn),并使其data值即為它所在鏈表(隊(duì)伍)中的位置 */</p><p><b>  return t;</b></p><p><b>  }</b>&l

37、t;/p><p>  DELETE (LNode* t,int m)/* 鏈表的刪除 */</p><p><b>  {</b></p><p>  LNode *a;int i;</p><p>  while (t->next!=t)</p><p><b>  {</b&

38、gt;</p><p>  for (i=1;i<m-1;i++)/*查找要?jiǎng)h除結(jié)點(diǎn)的前一結(jié)點(diǎn)*/</p><p>  t=t->next;</p><p>  a=t->next;</p><p>  t->next=a->next;</p><p>  free(a);/*釋放結(jié)點(diǎn)*/

39、</p><p>  t=t->next;</p><p>  }/* while循環(huán)依次刪除被點(diǎn)到的士兵 */</p><p>  printf("\n");</p><p>  return (t->data);</p><p><b>  }</b></

40、p><p><b>  main()</b></p><p><b>  {</b></p><p><b>  LNode *p;</b></p><p>  int m,n,z,y;</p><p>  printf("Exit please

41、input '0' Or Go on...\nPlease input the tatal of the team:");</p><p>  scanf ("%d",&n); /*輸入隊(duì)員總數(shù)*/</p><p>  while(n!=0) /*當(dāng)隊(duì)員總數(shù)等于0時(shí)退出*/</p><p><b&

42、gt;  {</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  printf("Please input the excursion:"); /*輸入偏移數(shù)*/</p><p>  scanf(&quo

43、t;%d",&m);</p><p><b>  }</b></p><p>  while (m<=0);</p><p><b>  if(m==1)</b></p><p>  printf("The wanted position is 1th.\n&quo

44、t;);</p><p><b>  else</b></p><p><b>  {</b></p><p>  p=CREAT(n);</p><p>  y=DELETE(p,m);</p><p><b>  z=n-y+2;</b></p

45、><p>  if(z%n==0) /* 排除特殊情況 */</p><p>  printf ("The wanted position is %dth:\n",z);</p><p><b>  else</b></p><p>  printf("The wanted position

46、is %dth:\n",(n-y+2)%n);</p><p>  }/* 通過數(shù)學(xué)思想求得實(shí)驗(yàn)要求情況下的數(shù)值 */</p><p>  printf("Exit please input '0' Or Go on...\nPlease input the tatal of the team:");</p><p> 

47、 scanf("%d",&n); /*輸入敢死隊(duì)員總數(shù)*/</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  二.線性表數(shù)據(jù)結(jié)構(gòu)</b></p><p><b>  (

48、一)需求分析</b></p><p>  1.本程序任務(wù)是通過輸入任意隊(duì)伍人數(shù)n和報(bào)數(shù)上限m,輸出使排長(zhǎng)最后一個(gè)執(zhí)行任務(wù)而開始記數(shù)的初始位置。首先輸入隊(duì)伍人數(shù)n,然后輸入報(bào)數(shù)上限m(m<=n),從1號(hào)開始報(bào)數(shù),當(dāng)達(dá)到報(bào)數(shù)上限時(shí),那名士兵出列執(zhí)行任務(wù),從下個(gè)人開始記數(shù),再次循環(huán),直到只剩一人,得到其在隊(duì)伍中的位置,記下該位置視為排長(zhǎng)位置,則1號(hào)即可視為最先報(bào)數(shù)的人,通過數(shù)學(xué)計(jì)算即可獲得所求。<

49、;/p><p>  2.功能模塊和流程: </p><p><b>  1)功能模塊</b></p><p>  該程序功能比較單一,主要是為解決敢死隊(duì)問題而設(shè)計(jì)。通過輸入隊(duì)伍人數(shù)和報(bào)數(shù)上限即可獲得開始報(bào)數(shù)的位置。</p><p><b>  2)程序流程</b></p><p>

50、;<b>  如下圖。</b></p><p><b>  3.數(shù)據(jù)測(cè)試:</b></p><p>  當(dāng) n=10 輸出結(jié)果為:要求的位置是:9</p><p><b> ?。ǘ┰敿?xì)設(shè)計(jì)</b></p><p>  1.算法思想: 本程序其實(shí)質(zhì)是約瑟夫環(huán)問題,本次實(shí)驗(yàn)用了線

51、性表和循環(huán)隊(duì)列兩種數(shù)據(jù)結(jié)構(gòu),并運(yùn)用模塊化的程序設(shè)計(jì)思想,算法的實(shí)現(xiàn)是這樣的:</p><p><b>  定義結(jié)構(gòu)體類型</b></p><p><b>  定義變量并初始化</b></p><p><b>  線性表初始化</b></p><p>  隊(duì)員報(bào)數(shù),是5的倍數(shù)出列

52、</p><p>  當(dāng)隊(duì)員數(shù)等于1時(shí),輸出</p><p><b>  流程圖</b></p><p>  從排長(zhǎng)位置即1號(hào)開始報(bào)數(shù),共有n個(gè)人,達(dá)到報(bào)數(shù)上限m=5的戰(zhàn)士出列,繼續(xù)進(jìn)行報(bào)數(shù),直到剩余最后一人,記下該位置為k。若將該位置視為排長(zhǎng)位置,則原先的1號(hào)位置即位所有的開始報(bào)數(shù)的位置z。則z=n-k+2。</p><p

53、><b>  2.模塊設(shè)計(jì):</b></p><p><b>  宏定義:</b></p><p>  #define LIST_INIT_SIZE 100</p><p>  #define LISTINCCREMENT 10</p><p>  數(shù)據(jù)類型定義:typedef int Ele

54、mType;</p><p><b>  定義數(shù)據(jù)結(jié)構(gòu):</b></p><p>  typedef struct KList /*定義數(shù)據(jù)結(jié)構(gòu)體類型*/</p><p><b>  {</b></p><p>  ElemType *elem; /*存儲(chǔ)空間基址*/</p

55、><p>  int length; /*當(dāng)前長(zhǎng)度*/</p><p>  int listsize; /*當(dāng)前分配的存儲(chǔ)容量(以sizeof(ElemType)為單位)*/</p><p><b>  }SqList;</b></p><p>  模塊一:創(chuàng)建線性表函數(shù)</p><p&g

56、t;  SqList InitList_Sq() /*創(chuàng)建線性表函數(shù)*/</p><p><b>  {</b></p><p><b>  SqList L;</b></p><p>  L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));<

57、/p><p>  if(!L.elem) printf("Fail in new creat list"),exit(0); /*存儲(chǔ)分配失敗*/</p><p><b>  else</b></p><p><b>  {</b></p><p>  L.length=0;

58、 /*空表長(zhǎng)度為0*/</p><p>  L.listsize=LIST_INIT_SIZE; /*初始存儲(chǔ)容量*/</p><p><b>  }</b></p><p><b>  }</b></p><p>  模塊二: 線性表再分配函數(shù)</p><

59、;p>  SqList ListInsert_Sq(SqList L) /*線性表再分配函數(shù)*/</p><p><b>  {</b></p><p>  /*SqList L;*/</p><p>  int *newbase;</p><p>  newbase=(ElemType *)realloc

60、(L.elem,</p><p>  (L.listsize+LISTINCCREMENT)*sizeof(ElemType));</p><p>  /*為順序表增加一個(gè)大小為存儲(chǔ)LISTINCCREMENT個(gè)數(shù)據(jù)元素的空間*/</p><p>  if(!newbase) printf("Fail in new add list"),exit

61、(0);/*存儲(chǔ)分配失敗*/</p><p><b>  else</b></p><p><b>  {</b></p><p>  L.elem=newbase; /*新基址*/</p><p>  L.listsize+=LISTINCCRE

62、MENT; /*增加存儲(chǔ)容量*/</p><p><b>  }</b></p><p><b>  }</b></p><p>  主模塊:實(shí)現(xiàn)總體功能</p><p><b>  main()</b></p><p><b&

63、gt;  {</b></p><p><b>  SqList L;</b></p><p>  int s,i,m,count=0; /*聲明變量*/</p><p>  L=InitList_Sq();</p><p>  printf("Please input the tatal of

64、 the team:");</p><p>  scanf("%d",&m); /*輸入敢死隊(duì)員總數(shù)*/</p><p>  while(m!=0)/*當(dāng)輸入為0時(shí)退出程序*/</p><p><b>  {</b></p><p>  while(m>L.len

65、gth) /*當(dāng)順序表當(dāng)前分配的存儲(chǔ)空間大小不足時(shí)進(jìn)行再分配*/</p><p>  L=ListInsert_Sq(L);</p><p>  for(i=0;i<m;i++) L.elem[i]=i+1; /*為隊(duì)員賦值*/</p><p><b>  s=m;</b></p><p>

66、<b>  i=0;</b></p><p>  while(s>1) /*當(dāng)所剩敢死隊(duì)員總數(shù)為1時(shí),總循環(huán)結(jié)束*/</p><p><b>  {</b></p><p>  for(i=0;i<m;i++)</p><p>  if(L.elem[i]!=0)

67、</p><p><b>  {</b></p><p><b>  count++;</b></p><p>  if(count==5) /*報(bào)數(shù)循環(huán)*/</p><p><b>  {</b></p><p>  L.elem[i]

68、=0; /*表示隊(duì)員出列*/</p><p>  count=0; /*計(jì)數(shù)器清零*/</p><p>  s--; /*敢死隊(duì)員數(shù)-1*/</p><p><b>  }</b></p><p><b>  }</b></p><p><b&g

69、t;  }</b></p><p>  for(i=0;i<m;i++) /*輸出*/</p><p>  if(L.elem[i]!=0)</p><p>  if((m-L.elem[i]+2)%m==0) /**/</p><p>  printf("\nThe wanted order is %dth\

70、n",m);</p><p><b>  else</b></p><p>  printf("\nThe wanted order is %dth\n",(m-L.elem[i]+2)%m);</p><p>  printf("Exit please input '0' Or Go o

71、n...\nPlease input the tatal of the team:");</p><p>  scanf("%d",&m); /*輸入敢死隊(duì)員總數(shù)*/</p><p><b>  }</b></p><p><b>  }</b></p>&

72、lt;p><b> ?。ㄈ┱{(diào)試分析</b></p><p>  1.程序正常運(yùn)行后應(yīng)該為:</p><p>  exit please input ‘0’or go on…</p><p>  please input the total of the team</p><p><b>  輸入總共人數(shù)

73、</b></p><p>  The wanted position is th</p><p>  輸出所求的開始報(bào)數(shù)位置</p><p>  2. 在程序調(diào)試運(yùn)行的過程中產(chǎn)生了各種各樣的問題,有的是多了空格,有的是拼寫錯(cuò)誤,還有的是少了括號(hào),類似的問題有很多。解決的辦法是一遍遍嘗試,不斷逐行逐句進(jìn)行修改。</p><p>  

74、例如程序調(diào)試過程中出現(xiàn)了下面的警告:</p><p>  經(jīng)查詢錯(cuò)誤為:不可移動(dòng)的指針(地址常數(shù))賦值</p><p>  最終發(fā)現(xiàn)是下面的定義錯(cuò)誤造成的</p><p>  在變量定義中int *newbase =0; </p><p>  定義成了 int newbase =0;</p><p>  經(jīng)改正

75、程序運(yùn)行正常了.</p><p><b>  3.經(jīng)驗(yàn)與體會(huì)</b></p><p>  通過這次課程設(shè)計(jì)我又學(xué)到了很多東西,如程序的模塊化設(shè)計(jì)思想,同時(shí)也加深了對(duì)數(shù)據(jù)結(jié)構(gòu)這門課程的理解和學(xué)會(huì)了如何在實(shí)際中應(yīng)用數(shù)據(jù)結(jié)構(gòu)編程。</p><p>  我首先是用線性表來做的,開始的想法是想用試驗(yàn)的方法來查找到所要求的位置,即首先從第一號(hào)開始報(bào)數(shù),然后

76、檢查最后剩下的一個(gè)是否是隊(duì)首,然后從第二個(gè)開始報(bào)數(shù)……從第三個(gè)開始報(bào)數(shù)……直到所剩下的最后一個(gè)是隊(duì)首。雖然這種方法可以實(shí)現(xiàn)查找,可卻是以消耗更多的時(shí)間為代價(jià)的,于是我又想到了這個(gè)方法:總是從第一個(gè)開始報(bào)數(shù),報(bào)到5出列,直到剩下最后一個(gè)為止,然后就令這個(gè)位置為隊(duì)長(zhǎng)位置,隊(duì)首為開始報(bào)數(shù)的位置,并按此設(shè)計(jì)輸出即可。這種方法大大的降低了時(shí)間復(fù)雜度,復(fù)雜度為O(mn)。</p><p><b>  (四)測(cè)試結(jié)果

77、</b></p><p><b> ?。ㄎ澹└郊?lt;/b></p><p><b>  程序源代碼:</b></p><p>  #define LIST_INIT_SIZE 100</p><p>  #define LISTINCCREMENT 10</p><p&

78、gt;  typedef int ElemType;</p><p>  typedef struct KList /*定義數(shù)據(jù)結(jié)構(gòu)體類型*/</p><p><b>  {</b></p><p>  ElemType *elem; /*存儲(chǔ)空間基址*/</p><p>  int length;

79、 /*當(dāng)前長(zhǎng)度*/</p><p>  int listsize; /*當(dāng)前分配的存儲(chǔ)容量(以sizeof(ElemType)為單位)*/</p><p><b>  }SqList;</b></p><p>  SqList InitList_Sq() /*創(chuàng)建線性表函數(shù)*/</p><p><

80、b>  {</b></p><p><b>  SqList L;</b></p><p>  L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); </p><p>  if(!L.elem) printf("Fail in new creat

81、list"),exit(0); /*存儲(chǔ)分配失敗*/</p><p><b>  else</b></p><p><b>  {</b></p><p>  L.length=0; /*空表長(zhǎng)度為0*/</p><p>  L.listsize=LIST_

82、INIT_SIZE; /*初始存儲(chǔ)容量*/</p><p><b>  }</b></p><p><b>  }</b></p><p>  SqList ListInsert_Sq(SqList L) /*線性表再分配函數(shù)*/</p><p><b>  {</b>

83、</p><p>  /*SqList L;*/</p><p>  int *newbase;</p><p>  newbase=(ElemType *)realloc(L.elem,</p><p>  (L.listsize+LISTINCCREMENT)*sizeof(ElemType));</p><p>

84、  /*為順序表增加一個(gè)大小為存儲(chǔ)LISTINCCREMENT個(gè)數(shù)據(jù)元素的空間*/</p><p>  if(!newbase) printf("Fail in new add list"),exit(0);/*存儲(chǔ)分配失敗*/</p><p><b>  else</b></p><p><b>  {</

85、b></p><p>  L.elem=newbase; /*新基址*/</p><p>  L.listsize+=LISTINCCREMENT; /*增加存儲(chǔ)容量*/</p><p><b>  }</b></p><p><b>

86、;  }</b></p><p><b>  main()</b></p><p><b>  {</b></p><p><b>  SqList L;</b></p><p>  int s,i,m,count=0; /*聲明變量*/</p>

87、<p>  L=InitList_Sq();</p><p>  printf("Please input the tatal of the team:");</p><p>  scanf("%d",&m); /*輸入敢死隊(duì)員總數(shù)*/</p><p>  while(m!=0)/*當(dāng)輸入為0

88、時(shí)退出程序*/</p><p><b>  {</b></p><p>  while(m>L.length) /*當(dāng)順序表當(dāng)前分配的存儲(chǔ)空間大小不足時(shí)進(jìn)行再分配*/</p><p>  L=ListInsert_Sq(L);</p><p>  for(i=0;i<m;i++) L.elem[i]=i+

89、1; /*為隊(duì)員賦值*/</p><p><b>  s=m;</b></p><p><b>  i=0;</b></p><p>  while(s>1) /*當(dāng)所剩敢死隊(duì)員總數(shù)為1時(shí),總循環(huán)結(jié)束*/</p><p><b>  {&l

90、t;/b></p><p>  for(i=0;i<m;i++)</p><p>  if(L.elem[i]!=0)</p><p><b>  {</b></p><p><b>  count++;</b></p><p>  if(count==5)

91、 /*報(bào)數(shù)循環(huán)*/</p><p><b>  {</b></p><p>  L.elem[i]=0; /*表示隊(duì)員出列*/</p><p>  count=0; /*計(jì)數(shù)器清零*/</p><p>  s--; /*敢死隊(duì)員數(shù)-1*/</p><p><

92、b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for(i=0;i<m;i++) /*輸出*/</p><p>  if(L.elem[i]!=0)</p><p>  if(

93、(m-L.elem[i]+2)%m==0) /**/</p><p>  printf("\nThe wanted order is %dth\n",m);</p><p><b>  else</b></p><p>  printf("\nThe wanted order is %dth\n",(m-

94、L.elem[i]+2)%m);</p><p>  printf("Exit please input '0' Or Go on...\nPlease input the tatal of the team:\n");</p><p>  scanf("%d",&m); /*輸入敢死隊(duì)員總數(shù)*/</p&g

95、t;<p><b>  }</b></p><p><b>  }</b></p><p><b>  參考文獻(xiàn)</b></p><p>  譚浩強(qiáng)《c程序設(shè)計(jì)》</p><p>  2.李業(yè)麗,鄭良斌《數(shù)據(jù)機(jī)構(gòu)(c)實(shí)驗(yàn)教程》

溫馨提示

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