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

下載本文檔

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

文檔簡介

1、<p>  設(shè)計(jì)1 約瑟夫環(huán)問題 </p><p><b>  需求分析</b></p><p><b>  一、具體目標(biāo)包括:</b></p><p>  1、實(shí)現(xiàn)單循環(huán)鏈表的初始化以及節(jié)點(diǎn)的創(chuàng)建和賦值</p><p>  2、理解約瑟夫環(huán)的定義,通過循環(huán)找到每次要出列的人的位置&l

2、t;/p><p>  3、從單循環(huán)鏈表中刪除結(jié)點(diǎn),對頭節(jié)點(diǎn)和一般結(jié)點(diǎn)分情況討論</p><p>  二、單循環(huán)鏈表的抽象數(shù)據(jù)類型定義為:</p><p>  ADT CLink {</p><p>  數(shù)據(jù)對象:D{ai | ai∈Elemset,i=1,2,…,n,n≥0}</p><p>  數(shù)據(jù)關(guān)系:R={<a

3、i-1,ai>,<an,a1> | ai-1,ai∈D,i=2,…n}</p><p><b>  基本操作:</b></p><p>  Status CreateList(CLink &head,int length)</p><p>  操作結(jié)果:構(gòu)造一個含有n個元素的單向循環(huán)鏈表。</p><

4、;p>  void Selectqueue(CLink head,int n,int m)</p><p>  操作結(jié)果:輸出符合上限應(yīng)該出列的結(jié)點(diǎn)。}</p><p><b>  三、問題描述</b></p><p>  設(shè)編號為1,2…,n(n>0)個人按順時針方向圍坐一圈,每人持有一個 正整數(shù)密碼。開始時任意給出一個報(bào)數(shù)上限值

5、m,從第一人開始順時針方向自1 起順序報(bào)數(shù),報(bào)到m時停止報(bào)數(shù),報(bào)m的人出列,將他的密碼作為新的m值,從他在順指針方向上的下一個人起重新自1起順序報(bào)數(shù);下去,直到所有人全部出列為止。要求設(shè)計(jì)一個程序模擬此過程。</p><p><b>  四、基本要求</b></p><p>  利用單向循環(huán)鏈表存儲結(jié)構(gòu)模擬此過程,按照出列的順序輸出個人的編號以及持有的密碼。</

6、p><p><b>  二、概要設(shè)計(jì)</b></p><p>  一、本程序主要分為三個模塊</p><p><b>  1、主模塊</b></p><p>  void main(){</p><p>  單循環(huán)鏈表的初始化;</p><p>  輸入總

7、人數(shù)和第一個上限值;</p><p>  調(diào)用另外兩個模塊,實(shí)現(xiàn)出列人的順序;}</p><p>  單向循環(huán)鏈表抽象數(shù)據(jù)類型模塊:CreateList(CLink &head,int length)實(shí)現(xiàn)單向循環(huán)鏈表的抽象數(shù)據(jù)類型功能;</p><p>  3、出列節(jié)點(diǎn)的順序模塊:Selectqueue(CLink head,int n,int m),實(shí)現(xiàn)出

8、列結(jié)點(diǎn)的順序功能;</p><p><b>  三、詳細(xì)設(shè)計(jì)</b></p><p>  1、主模塊的實(shí)現(xiàn)算法</p><p>  基本思想:對單鏈表進(jìn)行初始化,并設(shè)置總?cè)藬?shù)和第一個報(bào)數(shù)的上限值。若總?cè)藬?shù)或者上限不符合要求時則重新輸入。</p><p>  2、構(gòu)建一個單循環(huán)鏈表算法</p><p&g

9、t;  基本思想 :先創(chuàng)建單鏈表的一個結(jié)點(diǎn),再依次循環(huán)創(chuàng)建直至達(dá)到總結(jié)點(diǎn)數(shù),并且讓最后一個創(chuàng)建的結(jié)點(diǎn)的指針域?yàn)轭^結(jié)點(diǎn)的地址。</p><p>  Status CreateList(CLink &head,int length)</p><p><b>  {</b></p><p>  CLink before;</p>

10、<p>  CLink new_node;</p><p><b>  int i;</b></p><p>  printf("Please Input Password 1 : ");</p><p>  scanf("%d",&head->password);</p&

11、gt;<p>  head->number=1;</p><p>  head->next=NULL;</p><p>  before=head;</p><p>  for(i=1;i<length;i++)</p><p><b>  {</b></p><p&g

12、t;  if(!(new_node=(CLink)malloc(sizeof(CNode))))</p><p>  return OVERFLOW;</p><p>  new_node->number = i+1;</p><p>  printf("Please Input Password %d : ", new_node->

13、number);</p><p>  scanf("%d",&new_node->password);</p><p>  new_node->next = NULL;</p><p>  before->next=new_node;</p><p>  before=new_node;</

14、p><p><b>  }</b></p><p>  new_node->next =head;</p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  流程圖1</b></p>

15、<p>  3、構(gòu)建一個實(shí)現(xiàn)出列順序的算法</p><p>  基本思想:用ptr只向當(dāng)前出列的結(jié)點(diǎn),若為頭結(jié)點(diǎn)時則找到指向頭結(jié)點(diǎn)的指針,并做結(jié)點(diǎn)的刪除,若不是頭結(jié)點(diǎn),則用back指針作為指向ptr的指針,進(jìn)行結(jié)點(diǎn)的刪除。</p><p>  void selectqueue(CLink head,int n,int m)</p><p><b&g

16、t;  {</b></p><p>  CLink ptr,back,last;</p><p><b>  int i,j;</b></p><p><b>  ptr=head;</b></p><p>  for(i=0;i<n;i++)</p><p&g

17、t;<b>  {</b></p><p>  for(j=0;j<m-1;j++)</p><p><b>  {</b></p><p>  back=ptr;//定位最后一個數(shù)的接點(diǎn)賦值給back</p><p>  ptr=back->next;</p><p

18、><b>  }</b></p><p>  m=ptr->password;</p><p>  printf("第%d個出列的編號以及密碼為:%d,%d\n",i+1,ptr->number,m);</p><p>  if(ptr==head)</p><p><b>

19、;  {</b></p><p>  last=head;</p><p>  while(last->next!=head)</p><p>  last=last->next;</p><p>  last->next=head->next;</p><p>  free(ptr

20、);</p><p>  ptr=last->next;</p><p><b>  head=ptr;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {<

21、/b></p><p>  back->next=ptr->next;</p><p>  free(ptr);</p><p>  ptr=back->next;</p><p><b>  }</b></p><p><b>  }</b><

22、/p><p><b>  }</b></p><p><b>  流程圖2</b></p><p><b>  四、運(yùn)行結(jié)果及分析</b></p><p>  測試用例1:(一般數(shù)據(jù))</p><p>  測試用例2:(邊界數(shù)據(jù))</p>&l

23、t;p>  測試用例3:(錯誤數(shù)據(jù))</p><p><b>  運(yùn)行結(jié)果分析:</b></p><p> ?。?)對一般數(shù)據(jù)能否輸出正確結(jié)果? 能輸出正確結(jié)果</p><p> ?。?)對邊界數(shù)據(jù)能否給出合適的反應(yīng)?</p><p>  對于頭結(jié)點(diǎn)要出列或者第一個上限數(shù)很大時也可以給出結(jié)果</p>

24、<p>  (3)對錯數(shù)據(jù)能否給出必要的提示?</p><p><b>  提示重新輸入的語句</b></p><p> ?。?)算法的復(fù)雜度多少?</p><p>  CreateList是O(n), Selectqueue是O()</p><p><b>  五、總結(jié)</b></

25、p><p>  本次實(shí)驗(yàn)主要考察了對單循環(huán)鏈表的靈活應(yīng)用</p><p><b>  附:主要源代碼</b></p><p>  #include <stdio.h></p><p>  #include<stdlib.h></p><p>  #define OVERFLOW

26、 -1</p><p>  #define TRUE 1</p><p>  typedef int Status;</p><p>  typedef struct CNode</p><p>  { int password;</p><p>  int number;</p><p>

27、;  struct CNode *next;</p><p>  }CNode,*CLink;</p><p>  Status CreateList(CLink &head,int length)</p><p><b>  {</b></p><p>  CLink before;</p>&l

28、t;p>  CLink new_node;</p><p><b>  int i;</b></p><p>  printf("Please Input Password 1 : ");</p><p>  scanf("%d",&head->password);</p>

29、<p>  head->number=1;</p><p>  head->next=NULL;</p><p>  before=head;</p><p>  for(i=1;i<length;i++)</p><p><b>  {</b></p><p> 

30、 if(!(new_node=(CLink)malloc(sizeof(CNode))))</p><p>  return OVERFLOW;</p><p>  new_node->number = i+1;</p><p>  printf("Please Input Password %d : ", new_node->num

31、ber);</p><p>  scanf("%d",&new_node->password);</p><p>  new_node->next = NULL;</p><p>  before->next=new_node;</p><p>  before=new_node;</p&g

32、t;<p><b>  }</b></p><p>  new_node->next =head;</p><p>  return TRUE;</p><p><b>  }</b></p><p>  void selectqueue(CLink head,int n,int

33、 m)</p><p><b>  {</b></p><p>  CLink ptr,back,last;</p><p><b>  int i,j;</b></p><p><b>  ptr=head;</b></p><p>  for(i=0

34、;i<n;i++)</p><p><b>  {</b></p><p>  for(j=0;j<m-1;j++)</p><p><b>  {</b></p><p>  back=ptr;//定位最后一個數(shù)的接點(diǎn)賦值給back</p><p>  ptr=

35、back->next;</p><p><b>  }</b></p><p>  m=ptr->password;</p><p>  printf("第%d個出列的編號以及密碼為:%d,%d\n",i+1,ptr->number,m);</p><p>  if(ptr==hea

36、d)</p><p><b>  {</b></p><p>  last=head;</p><p>  while(last->next!=head)</p><p>  last=last->next;</p><p>  last->next=head->next;

37、</p><p>  free(ptr);</p><p>  ptr=last->next;</p><p><b>  head=ptr;</b></p><p><b>  }</b></p><p><b>  else</b></p

38、><p><b>  {</b></p><p>  back->next=ptr->next;</p><p>  free(ptr);</p><p>  ptr=back->next;}}}</p><p>  int main(){</p><p> 

39、 CLink head;</p><p>  CLink ptr,back,last;</p><p>  int i,j,m,n;</p><p>  printf("Please Input the Number of Persons: ");</p><p>  scanf("%d",&

40、n);</p><p>  while(n<1)</p><p><b>  {</b></p><p>  printf("Please Input the Number of Persons again: ");</p><p>  scanf("%d",&n)

41、;</p><p><b>  }</b></p><p>  printf("Please Input the frist m: ");</p><p>  scanf("%d",&m);</p><p>  while(m<1)</p><p&

42、gt;<b>  {</b></p><p>  printf("Please Input the frist m again: ");</p><p>  scanf("%d",&m);</p><p><b>  }</b></p><p> 

43、 if(!(head=(CLink)malloc(sizeof(CNode))))</p><p>  return OVERFLOW;</p><p>  CreateList(head,n);//建立循環(huán)鏈</p><p>  selectqueue(head,n,m);//選擇輸出順序</p><p><b>  }</

44、b></p><p>  設(shè)計(jì)2 棧、隊(duì)列和遞歸程序設(shè)計(jì)</p><p><b>  需求分析</b></p><p><b>  一、具體目標(biāo)包括:</b></p><p>  1、把輸入的表達(dá)式轉(zhuǎn)化為后綴表達(dá)式;</p><p>  2、利用棧結(jié)構(gòu)實(shí)現(xiàn)后綴表達(dá)式的

45、求值;</p><p>  3、根據(jù)輸入的前綴表達(dá)式建立一棵樹,并用后序遍歷的遞歸算法實(shí)現(xiàn)樹的輸出。</p><p>  二、棧以及樹的的抽象數(shù)據(jù)類型定義為:</p><p>  1、定義棧的抽象數(shù)據(jù)類型定義:</p><p>  ADT Stack{數(shù)據(jù)對象: D={ai| ai∈DateType,i=1,2,……,n,n>=0}&

46、lt;/p><p>  數(shù)據(jù)關(guān)系: R1={<ai-1,ai>| ai-1,ai∈D,i=2,……,n}</p><p><b>  基本操作:</b></p><p>  InitStack(& S)</p><p>  操作結(jié)果:構(gòu)造一個空棧S;</p><p>  Stack

47、Empty(S)</p><p>  初始條件:棧S已存在;</p><p>  操作結(jié)果:若S為空棧,則返回0,否則返回1;</p><p>  GetTop(S,&e)</p><p>  初始條件:棧S已存在;</p><p>  操作結(jié)果:若棧S不空,則以e返回棧頂元素;</p><

48、p>  Push(&S,e);</p><p>  操作結(jié)果:在棧S的棧頂插入新的棧頂元素e;</p><p>  Pop(&S,&e)</p><p>  操作結(jié)果:刪除S的棧頂元素,并以e返回其值;</p><p>  Status Match(char *str) //括弧、字符范圍匹配</p

49、><p>  初始條件:棧S已經(jīng)存在;</p><p>  操作結(jié)果:/括弧、字符范圍匹配。</p><p>  Status Involution(int a,int b)</p><p>  初始條件:需要冪運(yùn)算;</p><p>  操作結(jié)果:乘方(冪)運(yùn)算函數(shù)。</p><p>  Stat

50、us Precede(int a,int b)</p><p>  初始條件:當(dāng)前量有兩個;</p><p>  操作結(jié)果:優(yōu)先級判段函數(shù) 。</p><p>  void assort(char *str,char *str2)</p><p>  操作結(jié)果:將表達(dá)式轉(zhuǎn)化為后綴表達(dá)式</p><p>  Status

51、Callast(char *str)</p><p><b>  初始條件:輸入合理</b></p><p>  操作結(jié)果:表達(dá)式求解,操作數(shù)棧OPND,操作碼棧OPTR,最初壓入“#”</p><p><b>  }</b></p><p>  2、定義樹的抽象數(shù)據(jù)類型定義:</p>

52、<p>  ADT Stack{ 數(shù)據(jù)對象: D是具有相同特性的數(shù)據(jù)元素的集合。</p><p>  數(shù)據(jù)關(guān)系:若D為空集,則稱為空樹 。否則: (1) 在D中存在唯一的稱為根的數(shù)據(jù)元素root;(2) 當(dāng)n>1時,其余結(jié)點(diǎn)可分為m (m>0)個互不相交的有限集T1, T2, …, Tm,其中每一個子集本身又是一棵符合本定義的樹, 稱為根root的子樹。</p>&

53、lt;p>  基本操作:InitBiTree(T) 對于前綴表達(dá)式實(shí)現(xiàn)樹的初始化 </p><p>  PreorderT(T->lchild):后序遍歷樹并輸出,</p><p><b>  二、概要設(shè)計(jì)</b></p><p>  我想把本設(shè)計(jì)題目的實(shí)現(xiàn)劃分成成如下幾個模塊實(shí)現(xiàn),包括:</p><p>&

54、lt;b>  1、主模塊</b></p><p>  Void main(){</p><p>  輸入表達(dá)式,包括對表達(dá)式的檢查,當(dāng)輸入有誤時則重新輸入</p><p>  調(diào)用將表達(dá)式轉(zhuǎn)化為后綴表達(dá)式的模塊</p><p>  調(diào)用利用棧實(shí)現(xiàn)后綴表達(dá)式求值的模塊</p><p><b>

55、;  調(diào)用將二叉樹的模塊</b></p><p><b>  }</b></p><p>  2、assort(str,str2):將輸入的表達(dá)式轉(zhuǎn)化為后綴表達(dá)式的模塊</p><p>  3、Callast(str2):后綴表達(dá)式求值的模塊</p><p>  4、InitBiTree(T)以及Preord

56、erT(T->lchild):將輸入的前綴表達(dá)式轉(zhuǎn)化成樹并輸出的模塊</p><p><b>  三、詳細(xì)設(shè)計(jì)</b></p><p><b>  模塊1的實(shí)現(xiàn)算法</b></p><p>  基本算法:表達(dá)式的輸入并進(jìn)行檢查,當(dāng)輸入有誤則重新輸入</p><p><b>  模塊2

57、的實(shí)現(xiàn)算法</b></p><p>  void assort(char *str,char *str2)</p><p>  {SqStack OPTR;</p><p>  InitSqStack(OPTR);</p><p>  Push(OPTR,'#');</p><p><

58、b>  char ch;</b></p><p>  int n,i=0;int theta,x, a,b;</p><p>  while(*(str+i) != '#' || GetTop(OPTR) != '#')</p><p><b>  {</b></p><

59、p><b>  n=0;</b></p><p>  ch=*(str+i);</p><p>  if((ch-'0') < 0 || (ch-'0') > 9 )</p><p>  {switch(Precede(GetTop(OPTR),ch))</p><p&g

60、t;  {//比較棧頂運(yùn)算符與c的優(yōu)先級</p><p><b>  case '<':</b></p><p>  Push(OPTR,ch);</p><p><b>  ++i;</b></p><p><b>  break;</b></p&

61、gt;<p><b>  case '=':</b></p><p>  Pop(OPTR,x);</p><p>  if(x!='(')</p><p><b>  {</b></p><p>  *str2++=char(x);</p>

62、<p>  // printf(" %c",char(x));</p><p><b>  }++i;</b></p><p><b>  break;</b></p><p><b>  case '>':</b></p><

63、;p>  Pop(OPTR,theta);</p><p>  if(theta!='(')</p><p><b>  {</b></p><p>  *str2++=char(theta);</p><p>  // printf("%c",char(theta));<

64、/p><p><b>  }</b></p><p>  *str2++=' ';</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b><

65、/p><p><b>  else</b></p><p><b>  {</b></p><p>  while((ch-'0') >= 0 && (ch-'0') <= 9)</p><p><b>  {</b>&l

66、t;/p><p>  *str2++=ch;</p><p>  n=10*n+ch-'0';</p><p><b>  ++i;</b></p><p>  ch=*(str+i);//實(shí)現(xiàn)兩位數(shù)以上的數(shù)值計(jì)算</p><p><b>  }</b></

67、p><p>  *str2++=' ';//printf("%d ",n);</p><p>  }//操作數(shù)直接入棧</p><p>  }*str2='\0';}</p><p><b>  流程圖1</b></p><p><b> 

68、 模塊3的實(shí)現(xiàn)算法</b></p><p>  Status Callast(char *str2)</p><p><b>  {</b></p><p>  SqStack OPND;</p><p>  InitSqStack(OPND);</p><p><b>  

69、char ch;</b></p><p>  int n,i=0;int theta,x, a,b;</p><p>  while(*(str2+i) !='\0')</p><p><b>  {</b></p><p><b>  n=0;</b></p&g

70、t;<p>  ch=*(str2+i);</p><p>  if((ch-'0') >=0&&(ch-'0')<=9 )</p><p>  {while((ch-'0') >= 0 && (ch-'0') <= 9)</p><p

71、>  {n=10*n+ch-'0';</p><p><b>  ++i;</b></p><p>  ch=*(str2+i);//實(shí)現(xiàn)兩位數(shù)以上的數(shù)值計(jì)算</p><p><b>  }</b></p><p>  Push(OPND,n);</p><

72、p>  if(ch==' ')</p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><

73、p>  if(ch==' ')</p><p><b>  i++;</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Pop(OPND,b);</p><p>  P

74、op(OPND,a);</p><p>  Push(OPND,Operate(a,int(ch),b));</p><p><b>  i++ ;</b></p><p><b>  }} }</b></p><p>  return GetTop(OPND);}</p><p

75、><b>  流程圖2</b></p><p><b>  模塊4的實(shí)現(xiàn)算法</b></p><p>  基本思想將輸入的前綴表達(dá)式運(yùn)用遞歸算法轉(zhuǎn)化成樹,先建立根節(jié)點(diǎn)再依次建立左子樹和右子樹,并后序遍歷輸出樹。</p><p><b>  四、運(yùn)行結(jié)果及分析</b></p><

76、;p>  測試用例1:(一般數(shù)據(jù))</p><p>  測試用例2:(錯誤數(shù)據(jù))</p><p><b>  運(yùn)行結(jié)果分析:</b></p><p> ?。?)對一般數(shù)據(jù)能否輸出正確結(jié)果?</p><p><b>  能輸出正確結(jié)果</b></p><p>  對邊界數(shù)

77、據(jù)能否給出合適的反應(yīng)?</p><p>  只要輸入正確都可以給出合適的反應(yīng)</p><p> ?。?)對錯輸入能否給出必要的提示?</p><p>  提示出錯的原因以及重新輸入的提示</p><p>  算法的復(fù)雜度多少?每個模塊都是Strlen(str)</p><p><b>  總結(jié)</b&g

78、t;</p><p>  本實(shí)驗(yàn)主要考察了對棧和樹的操作,以及對表達(dá)式轉(zhuǎn)化的應(yīng)用。</p><p><b>  附:主要源代碼</b></p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #i

79、nclude<malloc.h></p><p>  #include <string.h></p><p>  #define OK 1</p><p>  #define ERROR 0</p><p>  #define OVERFLOW -1</p><p>  #define TRUE

80、 1</p><p>  #define FALSE 0</p><p>  #define STACK_INIT_SIZE 100</p><p>  #define STACKINCREMENT 10</p><p>  typedef int Status;</p><p>  typedef int SElem

81、Type;</p><p>  typedef struct</p><p><b>  //棧的定義</b></p><p><b>  {</b></p><p>  SElemType *base;</p><p>  SElemType *top;</p>

82、<p>  int stacksize;</p><p><b>  }SqStack;</b></p><p>  typedef struct BiTNode</p><p><b>  {</b></p><p>  char data;</p><

83、p>  struct BiTNode *lchild, *rchild;</p><p>  }BiTNode, *BiTree;</p><p>  Status InitSqStack(SqStack &S)</p><p><b>  //初始化一個棧</b></p><p><b>  

84、{</b></p><p>  S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));</p><p>  if(!S.base) exit(OVERFLOW);</p><p>  S.top=S.base;</p><p>  S.stacksize=STA

85、CK_INIT_SIZE;</p><p>  return OK;</p><p><b>  }</b></p><p>  Status Push(SqStack &S,SElemType e)</p><p><b>  //插入一元素</b></p><p>

86、;<b>  {</b></p><p>  if(S.top-S.base==S.stacksize)</p><p><b>  {</b></p><p>  S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemTyp

87、e));</p><p>  if(!S.base) exit(OVERFLOW);</p><p>  S.top=S.base+S.stacksize;</p><p>  S.stacksize+=STACKINCREMENT;</p><p><b>  }</b></p><p>  *

88、S.top++=e;</p><p>  return OK;</p><p><b>  }</b></p><p>  Status Pop(SqStack &S,SElemType &e)</p><p><b>  //刪除一元素</b></p><p&g

89、t;<b>  {</b></p><p>  if(S.top == S.base)</p><p>  return ERROR;</p><p><b>  else</b></p><p>  e=*--S.top;</p><p>  return OK;</

90、p><p><b>  }</b></p><p>  Status GetTop(SqStack S)</p><p>  //取棧頂元素,用e帶回</p><p><b>  {</b></p><p>  if(S.top == S.base)</p><

91、;p>  return ERROR;</p><p><b>  else</b></p><p>  return *(S.top-1);</p><p><b>  }</b></p><p>  Status Match(char *str)</p><p>  

92、//括弧、字符范圍匹配</p><p><b>  {</b></p><p>  SqStack S;</p><p>  int hasErr=0,i=0;</p><p>  SElemType e;</p><p>  InitSqStack(S);</p><p>

93、;<b>  char ch;</b></p><p>  for(i=0;*(str+i)!='#';++i)</p><p><b>  {</b></p><p>  if(*(str+i)=='/'&&(*(str+i+1)==0))</p><p

94、><b>  {</b></p><p>  printf("\n警告:0不能做分母出錯\n");</p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  else</b></p>

95、<p><b>  continue;</b></p><p><b>  }</b></p><p><b>  i=0;</b></p><p>  while((ch=*(str+i))!='#' && hasErr==0)</p>&

96、lt;p><b>  {</b></p><p>  switch(ch)</p><p><b>  {</b></p><p><b>  case '(':</b></p><p>  Push(S,ch);break;</p><

97、;p><b>  case ')':</b></p><p>  if(S.top==S.base){hasErr=1;break;}</p><p><b>  else{</b></p><p><b>  Pop(S,e);</b></p><p>

98、  if(e!='('){hasErr=1;break;}</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  ++i;</b><

99、;/p><p><b>  }</b></p><p>  if(!(hasErr==0 && S.top==S.base))</p><p><b>  {</b></p><p>  printf("\n警告:括號不匹配\n");</p><p

100、>  return FALSE;</p><p><b>  }</b></p><p>  for(i=0;(ch=*(str+i))!='#';++i)</p><p><b>  {</b></p><p>  if(ch=='('||ch==')

101、'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='^'||ch=='#'||((ch-'0')>=0&&(ch-'0')<=9))</p><p><b>  conti

102、nue;</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("\n警告:字符匹配出錯\n");</p><p>  return FALSE;</p><p><

103、;b>  }</b></p><p><b>  }</b></p><p>  return TRUE;</p><p><b>  }</b></p><p>  Status Involution(int a,int b)</p><p>  //乘方

104、(冪)運(yùn)算函數(shù)</p><p><b>  {</b></p><p>  if(0==b)return 1;</p><p>  if(1==b)return a;</p><p>  int num=a;</p><p>  for(int i=2;i<=b;++i)</p>

105、<p><b>  num*=a;</b></p><p>  return num;</p><p><b>  }</b></p><p>  Status Operate(int a,int theta,int b)</p><p><b>  {</b>&

106、lt;/p><p>  switch(theta){</p><p>  case '+':return a+b;</p><p>  case '-':return a-b;</p><p>  case '*':return a*b;</p><p>  case 

107、9;/':return a/b;</p><p>  case '%':return a%b;</p><p>  case '^':return Involution(a,b);</p><p>  default:return ERROR;</p><p><b>  }</b>

108、;</p><p><b>  }</b></p><p>  Status Precede(char a,char b)</p><p><b>  //優(yōu)先級判段函數(shù)</b></p><p><b>  {</b></p><p><b>

109、  switch(a)</b></p><p><b>  {</b></p><p><b>  case '#':</b></p><p>  if('#'==b)return '=';</p><p>  else return &#

110、39;<';</p><p><b>  case '+':</b></p><p><b>  case '-':</b></p><p>  if('+'==b||'-'==b||')'==b||'#'==b)

111、return '>';</p><p>  else return '<';</p><p><b>  case '*':</b></p><p><b>  case '/':</b></p><p><b>

112、  case '%':</b></p><p>  if('('==b||'^'==b)return '<';</p><p>  else return '>';</p><p><b>  case '^':</b><

113、;/p><p>  if('('==b)return '<';</p><p>  else return '>';</p><p><b>  case '(':</b></p><p>  if(')'==b)return 

114、9;=';</p><p>  else return '<';</p><p>  default:return ERROR;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void ass

115、ort(char *str,char *str2)</p><p><b>  {</b></p><p>  SqStack OPTR;</p><p>  InitSqStack(OPTR);</p><p>  Push(OPTR,'#');</p><p><b>

116、;  char ch;</b></p><p>  int n,i=0;int theta,x, a,b;</p><p>  while(*(str+i) != '#' || GetTop(OPTR) != '#')</p><p><b>  {</b></p><p>

117、;<b>  n=0;</b></p><p>  ch=*(str+i);</p><p>  if((ch-'0') < 0 || (ch-'0') > 9 )</p><p><b>  {</b></p><p>  switch(Preced

118、e(GetTop(OPTR),ch))</p><p>  {//比較棧頂運(yùn)算符與c的優(yōu)先級</p><p><b>  case '<':</b></p><p>  Push(OPTR,ch);</p><p><b>  ++i;</b></p><p

119、><b>  break;</b></p><p><b>  case '=':</b></p><p>  Pop(OPTR,x);</p><p>  if(x!='(')</p><p><b>  {</b></p>

120、<p>  *str2++=char(x);</p><p>  // printf(" %c",char(x));</p><p><b>  }</b></p><p><b>  ++i;</b></p><p><b>  break;</b&

121、gt;</p><p><b>  case '>':</b></p><p>  Pop(OPTR,theta);</p><p>  if(theta!='(')</p><p><b>  {</b></p><p>  *str2

122、++=char(theta);</p><p>  // printf("%c",char(theta));</p><p><b>  }</b></p><p>  *str2++=' ';</p><p><b>  break;</b></p>

123、<p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  while((ch-'0') >= 0 &

124、amp;& (ch-'0') <= 9)</p><p><b>  {</b></p><p>  *str2++=ch;</p><p>  n=10*n+ch-'0';</p><p><b>  ++i;</b></p><p

125、>  ch=*(str+i);//實(shí)現(xiàn)兩位數(shù)以上的數(shù)值計(jì)算</p><p><b>  }</b></p><p>  *str2++=' ';</p><p>  //printf("%d ",n);</p><p>  }//操作數(shù)直接入棧</p><p&

126、gt;<b>  }</b></p><p>  *str2='\0';</p><p><b>  }</b></p><p>  Status Callast(char *str2)</p><p><b>  {</b></p><p&

127、gt;  SqStack OPND;</p><p>  InitSqStack(OPND);</p><p><b>  char ch;</b></p><p>  int n,i=0;int theta,x, a,b;</p><p>  while(*(str2+i) !='\0')</p

128、><p><b>  {</b></p><p><b>  n=0;</b></p><p>  ch=*(str2+i);</p><p>  if((ch-'0') >=0&&(ch-'0')<=9 )</p><p

129、><b>  {</b></p><p>  while((ch-'0') >= 0 && (ch-'0') <= 9)</p><p><b>  {</b></p><p>  n=10*n+ch-'0';</p><

130、p><b>  ++i;</b></p><p>  ch=*(str2+i);//實(shí)現(xiàn)兩位數(shù)以上的數(shù)值計(jì)算</p><p><b>  }</b></p><p>  Push(OPND,n);</p><p>  if(ch==' ')</p><p&g

131、t;<b>  i++;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(ch==' ')</p><p&g

132、t;<b>  i++;</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Pop(OPND,b);</p><p>  Pop(OPND,a);</p><p>  Push(OPND,O

133、perate(a,int(ch),b));</p><p><b>  i++ ;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  

134、return GetTop(OPND);</p><p><b>  }</b></p><p>  BiTree InitBiTree(BiTree T)</p><p>  { if (!(T=(BiTree)malloc(sizeof(BiTNode))))</p><p><b>  return

135、0;</b></p><p>  T->lchild=NULL;</p><p>  T->rchild=NULL;</p><p><b>  return T;</b></p><p><b>  }</b></p><p>  BiTree Cr

136、eateBiTree(BiTree T)</p><p><b>  {</b></p><p><b>  char ch;</b></p><p>  scanf("%c",&ch);//按前序次序輸入節(jié)點(diǎn)信息</p><p>  if (ch==' '

137、;)</p><p>  T = NULL;</p><p><b>  else {</b></p><p>  if (!(T=(BiTNode *)malloc(sizeof(BiTNode))))</p><p><b>  exit(0);</b></p><p>

138、;  T->data = ch; // 生成根結(jié)點(diǎn)</p><p>  T->lchild =CreateBiTree(T->lchild); // 構(gòu)造左子樹</p><p>  T->rchild =CreateBiTree(T->rchild); // 構(gòu)造右子樹</p><p><b>

139、;  }</b></p><p>  return T;</p><p>  } // CreateBiTree ,無頭節(jié)點(diǎn)</p><p>  void PreorderT(BiTree T)</p><p><b>  {</b></p><p><b>  if (T

140、)</b></p><p><b>  {</b></p><p>  PreorderT(T->lchild );</p><p>  PreorderT(T->rchild );</p><p>  printf("%c", T->data );}}</p>

141、;<p>  int main()</p><p><b>  {</b></p><p>  char str[200],str2[400];</p><p><b>  BiTree T;</b></p><p>  printf("請輸入表達(dá)式,以‘#’結(jié)束:\n&qu

142、ot;);</p><p>  scanf("%s",str);</p><p>  str[strlen(str)+1]='\0';</p><p>  while(FALSE == Match(str))</p><p><b>  {</b></p><p&g

143、t;  printf("重新輸入表達(dá)式:\n");</p><p>  scanf("%s",str);</p><p>  str[strlen(str)+1]='\0';</p><p><b>  }</b></p><p>  printf("后綴

144、表達(dá)式:");</p><p>  assort(str,str2);</p><p>  puts(str2);</p><p>  putchar('\n');</p><p>  printf("表達(dá)式的值為:%d\n",Callast(str2));</p><p>

145、;  printf("input the string: ");</p><p>  T= InitBiTree(T);</p><p>  getchar();</p><p>  T->lchild =CreateBiTree(T->lchild );</p><p>  printf("The

146、Tree is: ");</p><p>  PreorderT(T->lchild);}</p><p>  設(shè)計(jì)3 數(shù)組和廣義表</p><p><b>  一、需求分析</b></p><p><b>  一、抽象數(shù)據(jù)類型</b></p><p> 

147、 ADT SMatrix {</p><p>  數(shù)據(jù)對象: D={aj1,j2, ...,,ji, ...,jn| ji =0,...,bi -1, i=1,2,..,n }</p><p>  數(shù)據(jù)關(guān)系: Row={<aij,aij+1>|1<=i<=m,1<=j<=n-1} </p><p>  Col={<a

148、ij,ai+1j>|1<=i<=m-1,1<=j<=n}</p><p><b>  }</b></p><p><b>  2、基本操作:</b></p><p> ?。?)status LogicMatrix(SMatrix M,SMatrix N,SMatrix *Q)</p>

149、;<p>  操作結(jié)果:求矩陣邏輯乘積Q=M*N </p><p> ?。?)status SumMatrix(SMatrix M,SMatrix N,SMatrix *Q)</p><p>  操作結(jié)果:M+N=Q</p><p><b>  二、概要設(shè)計(jì)</b></p><p>  1、用三元組順序表

150、存儲表示</p><p>  2、通過求兩個矩陣的和及乘積來求的關(guān)系的傳遞閉包</p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p><b>  四、運(yùn)行結(jié)果及分析</b></p><p><b>  運(yùn)行結(jié)果分析</b></p><p><

151、;b>  能給出正確結(jié)果</b></p><p>  算法復(fù)雜度:SumMatrix(At1,N,&At2) O(n) </p><p>  LogicMatrix(M,Temp,&N) O()</p><p><b>  五、總結(jié)</b></p><p>  主要應(yīng)用三元組處理矩陣,利

152、用矩陣的加法和乘法求自反閉包、對稱閉包和傳遞閉包</p><p><b>  附:主要源代碼</b></p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #define MAXSIZE 1250</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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論