2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩69頁(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>  設(shè)計(jì)1 約瑟夫環(huán)問題</p><p><b>  一、需求分析</b></p><p><b>  一、具體目標(biāo)包括:</b></p><p>  1.實(shí)現(xiàn)單循環(huán)鏈表的初始化</p><p>  2.理解約瑟夫環(huán)的定義,用循環(huán)找到每次報(bào)數(shù)人的序號(hào)</p>&

2、lt;p>  3. 從單循環(huán)鏈表中刪除節(jié)點(diǎn),并判斷鏈表空與非空的臨界條件。</p><p>  二、單向循環(huán)鏈表的抽象數(shù)據(jù)類型定義為:</p><p>  ADT CircleList{</p><p>  數(shù)據(jù)對(duì)象:D{ai | ai∈Elemset,i=1,2,…,n,n≥0}</p><p>  數(shù)據(jù)關(guān)系:R={<ai-1,

3、ai>,<an,a1> | ai-1,ai∈D,i=2,…n}</p><p><b>  基本操作:</b></p><p>  Link InitList(int n)</p><p>  操作結(jié)果:構(gòu)造一個(gè)含有n個(gè)元素的單向循環(huán)鏈表。</p><p><b>  三、問題描述</

4、b></p><p>  設(shè)編號(hào)為1,2…,n(n>0)個(gè)人按順時(shí)針方向圍坐一圈,每人持有一個(gè) 正整數(shù)密碼。開始時(shí)任意給出一個(gè)報(bào)數(shù)上限值m,從第一人開始順時(shí)針方向自1 起順序報(bào)數(shù),報(bào)到m時(shí)停止報(bào)數(shù),報(bào)m的人出列,將他的密碼作為新的m值,從他在順指針方向上的下一個(gè)人起重新自1起順序報(bào)數(shù);下去,直到所有人全部出列為止。要求設(shè)計(jì)一個(gè)程序模擬此過程。</p><p><b>

5、  四、基本要求</b></p><p>  利用單向循環(huán)鏈表存儲(chǔ)結(jié)構(gòu)模擬此過程,按照出列的順序印出個(gè)人的編號(hào)。</p><p><b>  二、概要設(shè)計(jì)</b></p><p>  一、本程序分三個(gè)模塊</p><p><b>  1)主模塊</b></p><p&

6、gt;  Void main(){</p><p><b>  初始化;</b></p><p><b>  接受命令;</b></p><p><b>  處理命令;</b></p><p><b>  }</b></p><p&g

7、t;  2)單向循環(huán)表單元模塊,實(shí)現(xiàn)單向循環(huán)鏈表的抽象數(shù)據(jù)類型功能;</p><p>  3)節(jié)點(diǎn)結(jié)構(gòu)單元模塊,定義單向循環(huán)鏈表的節(jié)點(diǎn)結(jié)構(gòu)。</p><p><b>  三、詳細(xì)設(shè)計(jì)</b></p><p>  1、構(gòu)建一個(gè)單循環(huán)鏈表算法</p><p>  typedef struct Node *Link,Lnode

8、;</p><p>  Link InitList( int n)</p><p>  {Link p1,p2,head;</p><p><b>  int i;</b></p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b>

9、</p><p>  p2=(Link)malloc(sizeof(Lnode));</p><p>  p2->next=NULL;</p><p><b>  if(i==1)</b></p><p><b>  head=p2;</b></p><p><b

10、>  else</b></p><p>  p1->next=p2;</p><p><b>  p1=p2;</b></p><p><b>  }</b></p><p>  p1->next=head;</p><p>  return h

11、ead;</p><p><b>  }</b></p><p><b>  流程圖1</b></p><p><b>  2主模塊實(shí)現(xiàn)算法</b></p><p>  從頭結(jié)點(diǎn)開始,根據(jù)報(bào)數(shù)上限找到下一個(gè)出列人的序號(hào),并讀出該人的密碼作為新的報(bào)數(shù)上限,從此節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)開始

12、進(jìn)行新的查找。通過指針依次刪除出列人相應(yīng)的節(jié)點(diǎn),直到該鏈表中無節(jié)點(diǎn),退出循環(huán)。</p><p><b>  四、運(yùn)行結(jié)果及分析</b></p><p>  測(cè)試用例1:(一般數(shù)據(jù))</p><p>  測(cè)試用例2:(邊界數(shù)據(jù))</p><p><b>  只輸入一個(gè)人:</b></p>

13、<p>  測(cè)試用例3(錯(cuò)誤數(shù)據(jù))</p><p><b>  初始報(bào)數(shù)上限為負(fù)數(shù)</b></p><p><b>  運(yùn)行結(jié)果分析:</b></p><p>  (1)對(duì)一般數(shù)據(jù)能否輸出正確結(jié)果?能</p><p>  (2)對(duì)邊界數(shù)據(jù)能否給出合適的反應(yīng)?能</p>&l

14、t;p>  (3)對(duì)錯(cuò)誤數(shù)據(jù)能否做出合適的反應(yīng)?</p><p>  (4)算法的復(fù)雜度多少?正比于2n加所有人密碼和</p><p><b>  五、總結(jié)</b></p><p>  本次實(shí)驗(yàn)主要考察了對(duì)單循環(huán)鏈表的應(yīng)用。</p><p><b>  附:主要源代碼</b></p>

15、;<p>  #include<stdio.h></p><p>  #include<malloc.h></p><p>  #define ElemType int//typedef int ElemType;</p><p>  struct Node</p><p>  {ElemType da

16、ta;</p><p>  ElemType number;</p><p>  struct Node *next;</p><p><b>  };</b></p><p>  typedef struct Node *Link,Lnode;</p><p>  Link InitList(

17、int n)</p><p>  {Link p1,p2,head;</p><p><b>  int i;</b></p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b></p><p>  p2=(Link)malloc(

18、sizeof(Lnode));</p><p>  p2->next=NULL;</p><p><b>  if(i==1)</b></p><p><b>  head=p2;</b></p><p><b>  else</b></p><p

19、>  p1->next=p2;</p><p><b>  p1=p2;</b></p><p><b>  }</b></p><p>  p1->next=head;</p><p>  return head;</p><p><b>  }

20、</b></p><p>  void main()</p><p><b>  {</b></p><p>  int n,m,i,j,w=0;</p><p>  Link head=NULL,p,q;</p><p>  printf("輸入總?cè)藬?shù):");&l

21、t;/p><p>  scanf("%d",&n);</p><p>  head=InitList(n);</p><p>  p=head->next;</p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b><

22、/p><p>  printf("輸入第%d人的密碼:",i);</p><p>  scanf("%d",&p->data);</p><p>  p->number=i;</p><p>  p=p->next;</p><p><b>  }

23、</b></p><p>  while(w==0)</p><p><b>  {</b></p><p>  printf("輸入初始報(bào)數(shù)上限:");</p><p>  scanf("%d",&m);</p><p><b&g

24、t;  if(m<0)</b></p><p>  printf("輸入錯(cuò)誤信息!\n");</p><p><b>  else</b></p><p><b>  {</b></p><p><b>  w=1;</b></p&g

25、t;<p>  for(j=1;j<=n;j++)</p><p><b>  {</b></p><p><b>  if(m==1)</b></p><p>  q=head->next;</p><p><b>  else</b></p&

26、gt;<p>  for(i=1;i<m;i++)</p><p><b>  {</b></p><p>  head=head->next;</p><p>  q=head->next;</p><p><b>  }</b></p><p&

27、gt;  printf("%d ",q->number);</p><p>  m=q->next->data;</p><p>  head->next=head->next->next;</p><p><b>  free(q);</b></p><p>&l

28、t;b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  設(shè)計(jì)2 迷宮問題</p><p><b>  一、需求分

29、析</b></p><p><b>  一、具體目標(biāo):</b></p><p>  1、生成一個(gè)m x n的迷宮,0和1分別表示迷宮中的通路和障礙。</p><p>  2、存在回路時(shí),找出回路;</p><p>  3、不重復(fù)走過的路。</p><p>  二、棧的抽象數(shù)據(jù)類型的定義

30、:</p><p>  ADT Stack {</p><p>  數(shù)據(jù)對(duì)象:D={ ai|ai ∈ElemSet,i=1,2,...,n,n≥0}</p><p>  數(shù)據(jù)關(guān)系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }</p><p><b>  基本操作:</b>

31、</p><p>  InitStack(SqStack *S)</p><p>  Push(SqStack *S,SNodeEType e)</p><p>  Pop(SqStack *S,SNodeEType *e)</p><p>  StackEmpty(SqStack *S)</p><p>  } AD

32、T Stack</p><p><b>  三、問題描述:</b></p><p>  迷宮時(shí)一些互相連通的交叉路口的集合,給定一個(gè)迷宮入口,一個(gè)迷宮出口,當(dāng)從入口到出口存在通路時(shí)輸出其中的一條通路,當(dāng)從入口到出口不存在通路時(shí)輸出無通路存在。</p><p><b>  二、概要設(shè)計(jì)</b></p><

33、p><b>  1、主模塊</b></p><p>  void main ()</p><p><b>  {</b></p><p>  構(gòu)造一個(gè)空棧,實(shí)現(xiàn)其初始化、插入、刪除操作;</p><p><b>  輸入迷宮入口位置;</b></p><

34、;p><b>  判斷是否有回路;</b></p><p>  輸出出口位置或“沒有找到!”</p><p><b>  }</b></p><p><b>  2、主要模塊</b></p><p><b>  三、詳細(xì)設(shè)計(jì)</b></p>

35、;<p>  Status Pop(SqStack *S,SElemType *e)</p><p>  { //若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK,否則返回ERROR</p><p>  SElemType *e1;</p><p>  if(S->top ==S->base)</p><p>

36、  return ERROR;</p><p>  e->di=S->top->di;</p><p>  e->ord=S->top->ord;</p><p>  e->seat.x=S->top->seat.x;</p><p>  e->seat.y=S->top-&g

37、t;seat.y;</p><p>  e1=S->top;</p><p>  S->top=S->top->next;</p><p><b>  free(e1);</b></p><p>  return OK;</p><p><b>  }</b

38、></p><p><b>  流程圖:</b></p><p><b>  2、主函數(shù):</b></p><p>  void main(){</p><p>  SqStack S;</p><p>  SElemType e;</p><p&g

39、t;  int mase[N][N]={0};</p><p>  int i,j,n,m;</p><p>  struct Post start, end;</p><p>  Imase(mase,&start,&end,&n,&m);</p><p>  if(MazePath(&S,mase,

40、&start,&end))</p><p><b>  {</b></p><p>  while(!StackEmpty(&S))</p><p><b>  {</b></p><p>  Pop(&S,&e);</p><p> 

41、 mase[e.seat.x][e.seat.y]=4;</p><p><b>  }</b></p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b></p><p>  for(j=1;j<=m;j++)</p><p>

42、;<b>  {</b></p><p>  if(mase[i][j]==2)</p><p>  mase[i][j]=0;</p><p>  if(mase[i][j]==0)</p><p>  printf(" ");</p><p>  else if(ma

43、se[i][j]==1)</p><p>  printf(" ● ");</p><p><b>  else</b></p><p>  printf(" ○ ");</p><p><b>  }</b></p><p>  pr

44、intf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else </b></p><p>  printf("沒找到!");</p><p&

45、gt;<b>  }</b></p><p><b>  流程圖:</b></p><p><b>  四、運(yùn)行結(jié)果及分析</b></p><p><b>  五、總結(jié)</b></p><p>  1.本次只有一個(gè)核心算法,即求迷宮的路徑。</p&g

46、t;<p>  2.棧的元素中step域沒有多大用,可以省略。</p><p><b>  附:主要源代碼</b></p><p>  #include<stdio.h></p><p>  #include<malloc.h></p><p>  #include<stdli

47、b.h></p><p>  #define Status int</p><p>  #define OK 1</p><p>  #define OVERFLOW 0</p><p>  #define TRUE 1</p><p>  #define FALSE 0</p><p>

48、  #define ERROR 0</p><p>  #define N 100</p><p>  struct Post</p><p><b>  {</b></p><p><b>  int x;</b></p><p><b>  int y;<

49、/b></p><p><b>  };</b></p><p>  typedef struct Post *PostType;</p><p>  struct Node</p><p><b>  {</b></p><p><b>  int ord;

50、</b></p><p>  struct Post seat;</p><p><b>  int di;</b></p><p>  struct Node *next;</p><p><b>  };</b></p><p>  typedef struc

51、t Node SElemType;</p><p>  struct Stack</p><p><b>  {</b></p><p>  SElemType *base;</p><p>  SElemType *top;</p><p><b>  };</b><

52、/p><p>  typedef struct Stack SqStack;</p><p>  Status InitStack(SqStack *S)</p><p>  { //構(gòu)造一個(gè)空棧S</p><p>  S->base=(SElemType *)malloc(sizeof(SElemType));</p&g

53、t;<p>  S->base->ord=0;</p><p>  if(!S->base)</p><p>  exit(OVERFLOW); //存儲(chǔ)分配失敗</p><p>  S->top=S->base;</p><p>  return OK;</p><p> 

54、 } //InitStack</p><p>  void Push(SqStack *S,SElemType *e)</p><p>  { //插入元素e為新的棧頂元素</p><p>  e->next=S->top;</p><p><b>  S->top=e;</b></p>

55、<p><b>  }//Push</b></p><p>  Status Pop(SqStack *S,SElemType *e)</p><p>  { //若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK,否則返回ERROR</p><p>  SElemType *e1;</p><p>  i

56、f(S->top ==S->base)</p><p>  return ERROR;</p><p>  e->di=S->top->di;</p><p>  e->ord=S->top->ord;</p><p>  e->seat.x=S->top->seat.x;&l

57、t;/p><p>  e->seat.y=S->top->seat.y;</p><p>  e1=S->top;</p><p>  S->top=S->top->next;</p><p><b>  free(e1);</b></p><p>  ret

58、urn OK;</p><p><b>  }</b></p><p>  Status StackEmpty(SqStack *S)</p><p>  { //判斷棧S是否為空,若不空返回TRUE,否者返回FALSE</p><p>  if(S->top==S->base)</p>&l

59、t;p>  return TRUE;</p><p><b>  else </b></p><p>  return FALSE;</p><p><b>  }</b></p><p>  void Nextpos(PostType seat,int di,PostType curpose

60、)</p><p><b>  {</b></p><p>  switch(di)</p><p><b>  {</b></p><p>  case 1:curpose->x=seat->x;</p><p>  curpose->y=(seat-&g

61、t;y)+1;</p><p><b>  break;</b></p><p>  case 2:curpose->x=seat->x+1;</p><p>  curpose->y=seat->y;</p><p><b>  break;</b></p>

62、<p>  case 3:curpose->x=seat->x;</p><p>  curpose->y=seat->y-1;</p><p><b>  break;</b></p><p>  case 4:curpose->x=seat->x-1;</p><p> 

63、 curpose->y=seat->y;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  Status MazePath(SqStack *S,int mase[

64、N][N],PostType start,PostType end)</p><p>  { //若迷宮mase中存在從入口start到出口end的通道,則求得一條放在棧中(從棧底到棧頂),并返回TRUE,否則返回FALSE;</p><p>  SElemType *e;</p><p>  PostType curpos=start;</p>&l

65、t;p>  int curstep=1;</p><p>  InitStack(S);</p><p><b>  do{</b></p><p>  if(mase[curpos->x][curpos->y]==0)</p><p>  { //當(dāng)前位置可以通過,即未曾走過的道路</p>

66、<p>  mase[curpos->x][curpos->y]=2; //留下痕跡</p><p>  e=(SElemType *)malloc(sizeof(SElemType));</p><p><b>  if(!e)</b></p><p>  exit(OVERFLOW);//存儲(chǔ)分配失敗</p&

67、gt;<p>  e->ord=curstep;</p><p>  //e->seat=(PostType )malloc(sizeof(struct Post));</p><p>  e->seat.x=curpos->x;</p><p>  e->seat.y=curpos->y;</p>&

68、lt;p><b>  e->di=1;</b></p><p>  Push(S,e);//加入路徑</p><p>  if(curpos->x==end->x && curpos->y==end->y )//到達(dá)出口</p><p>  return TRUE;</p>&l

69、t;p>  Nextpos(&S->top->seat,1,curpos);</p><p>  curstep++;</p><p><b>  }</b></p><p><b>  else</b></p><p>  { //當(dāng)前位置不通</p>&l

70、t;p>  if(!StackEmpty(S))</p><p><b>  {</b></p><p>  while(S->top->di==4 && !StackEmpty(S))</p><p><b>  {</b></p><p>  e=(SElemT

71、ype *)malloc(sizeof(SElemType));</p><p><b>  if(!e)</b></p><p>  exit(OVERFLOW);//存儲(chǔ)分配失敗</p><p><b>  Pop(S,e);</b></p><p>  curstep--;</p>

72、<p><b>  free(e);</b></p><p><b>  }</b></p><p>  if(S->top->di<4)</p><p><b>  {</b></p><p>  S->top->di++;<

73、/p><p>  Nextpos(&S->top->seat,S->top->di,curpos);}</p><p><b>  }</b></p><p><b>  }</b></p><p>  }while(!StackEmpty(S));</p&

74、gt;<p>  return FALSE;</p><p><b>  }</b></p><p>  void Imase(int mase[N][N],PostType start,PostType end,int *n1,int *m1)</p><p><b>  {</b></p>

75、<p>  int n,m,x,y,i,j;</p><p>  printf("輸入迷宮的行列數(shù)(沒有外墻小于90):");</p><p><b>  do{</b></p><p>  scanf("%d,%d",&n,&m);</p><p>  

76、}while(n<=0 && m<=0);</p><p><b>  *n1=n;</b></p><p><b>  *m1=m;</b></p><p>  for(i=0;i<=m+1;i++)</p><p><b>  {</b>&

77、lt;/p><p>  mase[0][i]=1;</p><p>  mase[n+1][i]=1;</p><p><b>  }</b></p><p>  for(j=0;j<=n+1;j++)</p><p><b>  {</b></p><

78、p>  mase[j][0]=1;</p><p>  mase[j][m+1]=1;</p><p><b>  }</b></p><p>  printf("輸入設(shè)置障礙的點(diǎn)的坐標(biāo),以(0,0)為結(jié)束\n");</p><p><b>  do{</b></p&

79、gt;<p>  scanf("%d,%d",&x,&y);</p><p>  if(x>n || y>m || x<0 || y<0)</p><p>  printf("輸入數(shù)據(jù)錯(cuò)誤,重新輸入");</p><p><b>  else</b>&

80、lt;/p><p>  mase[x][y]=1;</p><p>  }while(x!=0 && y!=0);</p><p><b>  do{</b></p><p>  printf("輸入開始坐標(biāo):");</p><p>  scanf("%d

81、,%d",&start->x,&start->y);</p><p>  printf("輸入結(jié)束坐標(biāo):");</p><p>  scanf("%d,%d",&end->x,&end->y);</p><p>  }while(!(start->x<

82、;=n && start->y<=m && start->x>0 && start->y>0 && end->x<=n && end->y<=m && end->x>0 && end->y>0));</p><p>&l

83、t;b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p>  SqStack S;</p><p>  SElemType e;</p><p>  int mase[N][N]={0};</p>&

84、lt;p>  int i,j,n,m;</p><p>  struct Post start, end;</p><p>  Imase(mase,&start,&end,&n,&m);</p><p>  if(MazePath(&S,mase,&start,&end))</p><

85、;p><b>  {</b></p><p>  while(!StackEmpty(&S))</p><p><b>  {</b></p><p>  Pop(&S,&e);</p><p>  mase[e.seat.x][e.seat.y]=4;</p&g

86、t;<p><b>  }</b></p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b></p><p>  for(j=1;j<=m;j++)</p><p><b>  {</b></p>&

87、lt;p>  if(mase[i][j]==2)</p><p>  mase[i][j]=0;</p><p>  if(mase[i][j]==0)</p><p>  printf(" ");</p><p>  else if(mase[i][j]==1)</p><p>  p

88、rintf(" ● ");</p><p><b>  else</b></p><p>  printf(" ○ ");</p><p><b>  }</b></p><p>  printf("\n");</p><

89、;p><b>  }</b></p><p><b>  }</b></p><p><b>  else </b></p><p>  printf("沒找到!");</p><p><b>  }</b></p>

90、<p>  設(shè)計(jì)3 三元組表示的矩陣的操作實(shí)現(xiàn)。</p><p><b>  一、需求分析</b></p><p><b>  一、抽象數(shù)據(jù)類型</b></p><p>  ADT SparseMatrix {</p><p>  數(shù)據(jù)對(duì)象: D={aj1,j2, ...,,ji,

91、 ...,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={<aij,ai+1j>|1<=i<=m-1,1<=j<=n}</p><p>

92、;  } ADT Array </p><p><b>  2、基本操作:</b></p><p> ?。?)status LogicMatrix(SMatrix M,SMatrix N,SMatrix *Q)</p><p>  操作結(jié)果:求矩陣邏輯乘積Q=M*N </p><p> ?。?)status SumMa

93、trix(SMatrix M,SMatrix N,SMatrix *Q)</p><p>  操作結(jié)果:M+N=Q</p><p><b>  二、概要設(shè)計(jì)</b></p><p>  1、用三元組順序表存儲(chǔ)表示,求稀疏矩陣的轉(zhuǎn)置矩陣</p><p>  2、求兩個(gè)矩陣的和及乘積</p><p>

94、  3、求稀疏矩陣的自反閉包、對(duì)稱閉包和傳遞閉包</p><p><b>  三、詳細(xì)設(shè)計(jì)</b></p><p><b>  流程圖:</b></p><p><b>  四、運(yùn)行結(jié)果及分析</b></p><p><b>  五、總結(jié)</b></

95、p><p>  主要應(yīng)用三元組處理矩陣,利用矩陣的加法和乘法求自反閉包、對(duì)稱閉包和傳遞閉包</p><p><b>  附:主要源代碼</b></p><p>  typedef struct{</p><p>  int i,j; //該非零元的行下標(biāo)和列下表</p><p>  ElemTyp

96、e e;</p><p><b>  }Triple;</b></p><p>  typedef struct{</p><p>  Triple data[MAXSIZE+1]; //非零元三元組</p><p>  int rpos[MAXSIZE+1]; //各行第一個(gè)非零元的位置表</p>

97、<p>  int mu,nu,tu;//矩陣的行數(shù)列數(shù)和非零元個(gè)數(shù)</p><p><b>  }SMatrix;</b></p><p>  status FasteTransposeSMatrix(SMatrix M,SMatrix *T)</p><p>  {//采用三元組順序表存儲(chǔ)表示,求稀疏矩陣M的轉(zhuǎn)置矩陣T<

98、/p><p>  int t,p,q,col,num[MAXSIZE]={0},cpot[MAXSIZE]={0};</p><p>  T->mu=M.nu;</p><p>  T->nu=M.mu;</p><p>  T->tu=M.tu;</p><p><b>  if(T->

99、tu)</b></p><p><b>  {</b></p><p>  for(col=1;col<=M.nu;++col)</p><p>  num[col]=0;</p><p>  for(t=1;t<=M.tu;++t)</p><p>  ++num[M.d

100、ata[t].j];//求M中每一列非零元個(gè)數(shù)</p><p>  cpot[1]=1;//求第col列中第一個(gè)非零元在M.data中的序號(hào)</p><p>  for(col=2;col<=M.nu;++col)</p><p>  cpot[col]=cpot[col-1]+num[col-1];</p><p>  for(p=1

101、;p<=M.tu;++p)</p><p><b>  {</b></p><p>  col=M.data[p].j;</p><p>  q=cpot[col];</p><p>  T->data[q].i=M.data[p].j;</p><p>  T->data[q]

102、.j=M.data[p].i;</p><p>  T->data[q].e=M.data[p].e;</p><p>  ++cpot[col];</p><p><b>  }</b></p><p><b>  }</b></p><p>  return OK;

103、</p><p><b>  }</b></p><p>  status SumMatrix(SMatrix M,SMatrix N,SMatrix *Q)</p><p><b>  {//M+N=Q</b></p><p>  int p,q,k=1;</p><p>

104、  if(!(M.nu==N.nu && M.mu==N.mu))</p><p>  return ERROR;</p><p>  Q->mu=M.mu;</p><p>  Q->nu=M.nu;</p><p>  for(p=1,q=1;p<=M.tu && q<=N.tu;

105、)</p><p><b>  {</b></p><p>  if(M.data[p].i==N.data[q].i)</p><p><b>  {</b></p><p>  if(M.data[p].j==N.data[q].j)</p><p><b> 

106、 {</b></p><p>  Q->data[k].i=M.data[p].i;</p><p>  Q->data[k].j=M.data[p].j;</p><p>  Q->data[k].e=1;</p><p>  p++; q++; k++;</p><p><b&g

107、t;  }</b></p><p>  else if(M.data[p].j<N.data[q].j)</p><p><b>  {</b></p><p>  Q->data[k].i=M.data[p].i;</p><p>  Q->data[k].j=M.data[p].j;&l

108、t;/p><p>  Q->data[k].e=1;</p><p><b>  p++;</b></p><p><b>  k++;</b></p><p><b>  }</b></p><p>  else if(M.data[p].j>

109、N.data[q].j)</p><p><b>  {</b></p><p>  Q->data[k].i=N.data[q].i;</p><p>  Q->data[k].j=N.data[q].j; Q->data[k].e=1;</p><p><b>  q++;k++;<

110、/b></p><p>  } </p><p><b>  }</b></p><p>  else if(M.data[p].i>N.data[q].i)</p><p><b>  {</b></p><p>  Q->data[

111、k].i=N.data[q].i;</p><p>  Q->data[k].j=N.data[q].j;</p><p>  Q->data[k].e=1;</p><p><b>  q++; k++;</b></p><p><b>  }</b></p><p

112、>  else if(M.data[p].i<N.data[q].i)</p><p><b>  {</b></p><p>  Q->data[k].i=M.data[p].i;</p><p>  Q->data[k].j=M.data[p].j;</p><p>  Q->data[

113、k].e=1;</p><p><b>  p++;</b></p><p><b>  k++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for(p;p<=

114、M.tu;p++)</p><p><b>  {</b></p><p>  Q->data[k].i=M.data[p].i;</p><p>  Q->data[k].j=M.data[p].j;</p><p>  Q->data[k].e=1;</p><p><

115、b>  k++;</b></p><p><b>  }</b></p><p>  for(q;q<=N.tu;q++)</p><p><b>  {</b></p><p>  Q->data[k].i=N.data[q].i;</p><p&

116、gt;  Q->data[k].j=N.data[q].j;</p><p>  Q->data[k].e=1;</p><p><b>  k++;</b></p><p><b>  }</b></p><p>  Q->tu=--k;</p><p>

117、  return OK;</p><p><b>  }</b></p><p>  status LogicMatrix(SMatrix M,SMatrix N,SMatrix *Q)</p><p>  {//求矩陣邏輯乘積Q=M*N,采用行邏輯鏈接存儲(chǔ)表示</p><p>  int i,t,ccol,arow,t

118、p,p,q,ctemp[MAXSIZE]={0},brow;</p><p>  if(M.nu!=N.mu)</p><p>  return ERROR;</p><p>  Q->mu=M.mu; </p><p>  Q->nu=N.nu;</p><p>  Q->tu=0;//Q初始化&l

119、t;/p><p>  if(M.tu*N.tu!=0)</p><p><b>  {//Q是非零矩陣</b></p><p>  for(arow=1;arow<=M.mu;++arow)</p><p>  {//處理M的每一行</p><p>  for(i=1;i<=N.nu;i+

120、+)</p><p>  ctemp[i]=0;//當(dāng)前行元素累加器清零</p><p>  Q->rpos[arow]=Q->tu+1;</p><p>  if(arow<M.mu)</p><p>  tp=M.rpos[arow+1];</p><p><b>  else</

121、b></p><p>  tp=M.tu+1;</p><p>  for(p=M.rpos[arow];p<tp;++p)</p><p>  {//對(duì)當(dāng)前行中每一個(gè)非零元找到對(duì)應(yīng)元在N中的行號(hào)</p><p>  brow=M.data[p].j;</p><p>  if(brow<M.mu)&

122、lt;/p><p>  t=N.rpos[brow+1];</p><p><b>  else</b></p><p><b>  t=N.tu+1;</b></p><p>  for(q=N.rpos[brow];q<t;++q)</p><p><b> 

123、 {</b></p><p>  ccol=N.data[q].j;//乘積元素在Q中的列號(hào)</p><p>  ctemp[ccol]=1;</p><p><b>  }</b></p><p>  }//求得Q中第crow行非零元</p><p>  for(ccol=1;cco

124、l<=Q->nu;++ccol)//壓縮存儲(chǔ)該行非零元</p><p>  if(ctemp[ccol])</p><p><b>  {</b></p><p>  if(++Q->tu>MAXSIZE)</p><p>  return ERROR;</p><p> 

125、 Q->data[Q->tu].i=arow;</p><p>  Q->data[Q->tu].j=ccol;</p><p>  Q->data[Q->tu].e=ctemp[ccol];</p><p><b>  }</b></p><p><b>  }<

126、;/b></p><p><b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p>  status Moutput(SMatrix *N)</p><p><b>  {</b>&

127、lt;/p><p>  int i,k=1,j;</p><p>  for(i=1;i<=N->mu;++i)</p><p><b>  {</b></p><p>  for(j=1;j<=N->nu;j++)</p><p><b>  {</

128、b></p><p>  if(k<=N->tu)</p><p>  if(N->data[k].i==i && N->data[k].j==j)</p><p><b>  {</b></p><p>  printf(" %d ",N-&g

129、t;data[k].e);</p><p>  if(k==N->tu)</p><p><b>  k=k+2;</b></p><p><b>  else</b></p><p><b>  k++;</b></p><p><b>

130、;  }</b></p><p><b>  else</b></p><p>  printf(" 0 ");</p><p>  else if(k>N->tu+1)</p><p>  printf(" 0 ");</p><p&

131、gt;  }printf("\n");</p><p>  }return OK;</p><p><b>  }</b></p><p>  status Creatrops(SMatrix *N)</p><p>  {int t,r,num[MAXSIZE]={0};</p>&

132、lt;p><b>  if(N->tu)</b></p><p>  {for(r=1;r<N->mu;++r)</p><p><b>  num[r]=0;</b></p><p>  for(t=1;t<=N->tu;++t)</p><p>  ++nu

133、m[N->data[t].i];</p><p>  N->rpos[1]=1;</p><p>  for(r=2;r<=N->mu;++r)</p><p>  N->rpos[r]=N->rpos[r-1]+num[r-1];</p><p>  }return OK;</p><

134、p><b>  }</b></p><p>  status Clear(SMatrix *N)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=1;i<=N->tu;i++)</

135、p><p>  N->data[i].e=0;</p><p>  return OK;</p><p><b>  }</b></p><p>  void main()</p><p><b>  {int i;</b></p><p>  S

136、Matrix M,N,*At,At2,At1,As,Ar,Ix,Temp;</p><p>  printf("以三元組的方式輸入關(guān)系矩陣:\n");</p><p>  printf("輸入關(guān)系矩陣的行數(shù),列數(shù),非零元個(gè)數(shù)(行列數(shù)相同):\n");</p><p>  scanf("%d,%d,%d",&

137、amp;M.mu,&M.nu,&M.tu);</p><p>  printf("輸入三元組:\n");</p><p>  for(i=1;i<=M.tu;i++)</p><p>  {printf("第%d \n",i);</p><p>  scanf("%d,

138、%d,%d",&M.data[i].i,&M.data[i].j,&M.data[i].e);</p><p><b>  }</b></p><p>  Creatrops(&M);</p><p><b>  //求轉(zhuǎn)置</b></p><p>  pr

139、intf("輸入的關(guān)系矩陣:\n");</p><p>  Moutput(&M);</p><p>  FasteTransposeSMatrix(M,&N);</p><p>  Creatrops(&N);</p><p><b>  //求對(duì)稱閉包</b></p&

140、gt;<p>  SumMatrix(M,N,&As);</p><p>  Creatrops(&As);</p><p>  for(i=1;i<=M.mu;i++)</p><p>  {Ix.data[i].i=i;</p><p>  Ix.data[i].j=i;</p><

141、;p>  Ix.data[i].e=1;</p><p><b>  }//求自反閉包</b></p><p>  Ix.mu=M.mu;</p><p>  Ix.nu=M.nu;</p><p>  Ix.tu=M.nu;</p><p>  Creatrops(&Ix);<

142、;/p><p>  SumMatrix(M,Ix,&Ar);</p><p>  Creatrops(&Ar);</p><p>  At1.mu=M.mu;</p><p>  At1.nu=M.mu;</p><p><b>  At1.tu=0;</b></p>&

143、lt;p>  At2.mu=M.mu;</p><p>  At2.nu=M.mu;</p><p><b>  At2.tu=0;</b></p><p>  for(i=2;i<=M.tu;i++)//傳遞閉包</p><p><b>  {</b></p><

144、;p>  if(i==2)</p><p><b>  {</b></p><p>  Clear(&N);</p><p>  LogicMatrix(M,M,&N);</p><p>  SumMatrix(M,N,&At2);</p><p><

145、;b>  }</b></p><p>  else if(i%2==1)</p><p>  { Clear(&Temp);</p><p>  LogicMatrix(M,N,&Temp);</p><p>  SumMatrix(At2,Temp,&At1);</p><

146、p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Clear(&N);</p><p>  LogicMatrix(M,Temp,&N);</p>

147、<p>  SumMatrix(At1,N,&At2);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(M.mu%2==1)</p><p><b>  At=&At1;</b></p

148、><p><b>  else</b></p><p><b>  At=&At2;</b></p><p>  Creatrops(At);</p><p><b>  //輸出關(guān)系矩陣</b></p><p>  printf("自反閉

149、包:\n");</p><p>  Moutput(&Ar);</p><p>  printf("\n");</p><p>  printf("對(duì)稱閉包:\n");</p><p>  Moutput(&As);</p><p>  printf(&

150、quot;\n");</p><p>  printf("傳遞閉包:\n");</p><p>  Moutput(At);</p><p>  printf("\n");</p><p><b>  }</b></p><p><b>

151、  設(shè)計(jì)4前綴表達(dá)式</b></p><p><b>  一、需求分析</b></p><p><b>  1、具體目標(biāo)包括:</b></p><p> ?。?)構(gòu)造一個(gè)隊(duì)列,實(shí)現(xiàn)對(duì)隊(duì)列元素的插入,刪除操作</p><p> ?。?)構(gòu)造一個(gè)棧,實(shí)現(xiàn)對(duì)棧的元素的插入和刪除操作,判斷棧為空

152、的條件</p><p> ?。?)利用二叉樹的遍歷的順序?qū)崿F(xiàn)把以前綴形式輸入的算術(shù)表達(dá)式轉(zhuǎn)換為中綴和后綴表達(dá)式</p><p>  2、棧的抽象數(shù)據(jù)類型的定義:</p><p>  ADT Stack {</p><p><b>  數(shù)據(jù)對(duì)象:</b></p><p>  D={ ai|ai ∈E

溫馨提示

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