版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 約瑟夫環(huán)-課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--- 約瑟夫環(huán)問題
- 約瑟夫環(huán)課程設(shè)計(jì)報(bào)告
- 約瑟夫環(huán)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--約瑟夫環(huán)問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---約瑟夫(joseph)環(huán)問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)約瑟夫(joseph)環(huán)問題
- 課程設(shè)計(jì)--約瑟夫環(huán)程序設(shè)計(jì)
- 約瑟夫環(huán)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)_約瑟夫環(huán)_課程設(shè)計(jì)
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)“約瑟夫環(huán)”
- 約瑟夫環(huán)課程設(shè)計(jì)----數(shù)據(jù)結(jié)構(gòu)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--- 約瑟夫(joseph)環(huán)
- 數(shù)據(jù)結(jié)構(gòu)約瑟夫環(huán)模擬課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(約瑟夫環(huán))
- 數(shù)據(jù)結(jié)構(gòu)--約瑟夫環(huán)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---約瑟夫環(huán)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--約瑟夫環(huán)
- 數(shù)據(jù)結(jié)構(gòu)約瑟夫環(huán)的課程設(shè)計(jì)報(bào)告
- 約瑟夫生死游戲課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論