版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--約瑟夫環(huán)問題
- 數(shù)據(jù)結(jié)構(gòu)_約瑟夫環(huán)_課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---約瑟夫(joseph)環(huán)問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)約瑟夫(joseph)環(huán)問題
- 《數(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ù)結(jié)構(gòu)約瑟夫環(huán)問題
- 數(shù)據(jù)結(jié)構(gòu)約瑟夫環(huán)問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告約瑟夫環(huán)完整版[1]
- 約瑟夫環(huán)問題課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---joseph環(huán)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---joseph環(huán)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
評論
0/150
提交評論