版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告</p><p><b> 廣義表的存儲(chǔ)與運(yùn)算</b></p><p><b> ——廣義表</b></p><p> 班 級: 軟件112班 </p><p> 姓 名:
2、 </p><p> 指導(dǎo)教師: </p><p> 成 績: </p><p><b> 目錄</b></p><p><b> 需求分析3</b>
3、;</p><p><b> 題目3</b></p><p><b> 要求3</b></p><p><b> 對題目分析3</b></p><p><b> 數(shù)據(jù)的輸入輸出3</b></p><p> 算法測試
4、設(shè)計(jì)用例4</p><p><b> 概要設(shè)計(jì)4</b></p><p> 各抽象數(shù)據(jù)類型的定義4</p><p> 廣義表的擴(kuò)展線性鏈表表示4</p><p> 廣義表的圖形表示5</p><p> 帶表頭結(jié)點(diǎn)的鏈?zhǔn)酱鎯?chǔ)5</p><p> 廣義表
5、的運(yùn)算問題流程圖5</p><p><b> 詳細(xì)設(shè)計(jì)8</b></p><p><b> 1.功能目錄8</b></p><p><b> 2.主函數(shù)9</b></p><p> 3.字符串變廣義表10</p><p> 4.
6、廣義表的復(fù)制11</p><p> 5.廣義表的輸出12</p><p> 6.廣義表的長度12</p><p> 7.廣義表的深度13</p><p> 8.廣義表的表頭13</p><p> 9.廣義表的表尾14</p><p> 10.廣義表變?yōu)樽址?/p>
7、14</p><p> 11.查找廣義表中的字符15</p><p><b> 調(diào)試分析15</b></p><p><b> 測試結(jié)果15</b></p><p> 1.字符串變廣義表16</p><p> 2.廣義表的復(fù)制16</p>
8、;<p> 3.廣義表的長度17</p><p> 4.廣義表的深度17</p><p> 5.廣義表的表頭18</p><p> 6.廣義表的表尾18</p><p> 7.廣義表變?yōu)樽址?9</p><p> 8.查找廣義表中的字符19</p>&l
9、t;p> 9.重新設(shè)定廣義表20</p><p><b> 參考文獻(xiàn)21</b></p><p><b> 需求分析</b></p><p><b> 題目</b></p><p> 選擇合適的存儲(chǔ)結(jié)構(gòu)表示廣義表</p><p>&
10、lt;b> 要求</b></p><p> (1)用大寫字母表示廣義表,用小寫字母表示原子,并提供設(shè)置廣義表的值的功能。</p><p> (2)取廣義表L的表頭和表尾的函數(shù)head(L)和tail(L)。</p><p> (3)能用這兩個(gè)函數(shù)的復(fù)合形式求出廣義表中的指定元素。</p><p> (4)由廣義表的
11、字符串形式到廣義表的轉(zhuǎn)換函數(shù)Str.To-Lists(S):Lists,例如Str.To-Lists(’(a,(a,b),c)’)的值為一個(gè)廣義表。</p><p> (5)由廣義表到廣義表的字符串形式的轉(zhuǎn)換函數(shù)Lists-To-Str(L):String。</p><p> (6)最好能設(shè)置多個(gè)廣義表。</p><p><b> 對題目分析<
12、/b></p><p> 本題主要考察廣義表的應(yīng)用,所以之前先要對廣義表要有一定的了解。線性表被定義為一個(gè)有限的序列(a1,a2,a3,…,an)其中ai被限定為是單個(gè)數(shù)據(jù)元素。廣義表也是n個(gè)數(shù)據(jù)元素d1,d2,d3,…,dn的有限序列,但不同的是,廣義表中的di 則既可以是單個(gè)元素,還可以是一個(gè)廣義表,通常記作:GL=(d1,d2,d3,…,dn)。GL是廣義表的名字,通常廣義表的名字用大寫字母表示。n
13、是廣義表的長度。若其中di是一個(gè)廣義表,則稱di是廣義表GL的子表。在廣義表GL中,d1是廣義表GL的表頭,而廣義表GL其余部分組成的表(d2,d3,…,dn)稱為廣義表的表尾。由此可見廣義表的定義是遞歸定義的。因?yàn)樵诙x廣義表時(shí),又使用了廣義表的概念。線性表被定義為一個(gè)有限的序列(a1,a2,a3,…,an)其中ai被限定為是單個(gè)數(shù)據(jù)元素。廣義表也是n個(gè)數(shù)據(jù)元素d1,d2,d3,…,dn的有限序列,但不同的是,廣義表中的di 則既可以
14、是單個(gè)元素,還可以是一個(gè)廣義表,通常記作:GL=(d1,d2,d3,…,dn)。GL是廣義表的名字,通常廣義表的名字用大寫字母表示。n是廣義表的長度。若其中di是一個(gè)廣義表,則稱</p><p><b> 數(shù)據(jù)的輸入輸出</b></p><p> 輸入:數(shù)據(jù)要求輸入一個(gè)廣義表</p><p> 例如:((a,b),c,(d,e))<
15、/p><p> ?。?1,2,3),4)</p><p> 輸出:輸出9種有關(guān)廣義表的操作如下:</p><p><b> 1 字符串變廣義表</b></p><p><b> 2 廣義表的復(fù)制</b></p><p><b> 3 廣義表的長度</b&g
16、t;</p><p><b> 4 廣義表的深度</b></p><p><b> 5 廣義表的表頭</b></p><p><b> 6 廣義表的表尾</b></p><p> 7 廣義表變?yōu)樽址?lt;/p><p> 8 查找廣義表中的字符&
17、lt;/p><p><b> 9 重新設(shè)定廣義表</b></p><p><b> 0 推出程序</b></p><p><b> 算法測試設(shè)計(jì)用例</b></p><p> ?。ǎ╝,b),c,(d,e))</p><p><b> 概要
18、設(shè)計(jì)</b></p><p> 各抽象數(shù)據(jù)類型的定義</p><p> GList:廣義表的類型定義</p><p> GList *StrToLists(char *&s):字符串變?yōu)閺V義表的函數(shù)</p><p> char *ListsToStr(GList *L,int k):廣義表變?yōu)樽址暮瘮?shù)</
19、p><p> GList *CopyGList(GList *p):復(fù)制廣義表的函數(shù)</p><p> int length(GList *L):計(jì)算廣義表長度的函數(shù)</p><p> int depth(GList *L):計(jì)算廣義表深度的函數(shù)</p><p> int Find(GList *L,char ch):計(jì)算廣義表深度的函數(shù)
20、</p><p> void PrintGList(GList *L):打印廣義表的函數(shù)</p><p> GList *head(GList *&L):取廣義表表頭的函數(shù)</p><p> GList *tail(GList *&L):取廣義表表尾的函數(shù)</p><p> 廣義表的擴(kuò)展線性鏈表表示</p>
21、<p> typedef struct GLNode</p><p><b> {</b></p><p> int tag; // tag為公共部分,只能為1和0,1代表</p><p> //表結(jié)點(diǎn),0代表原子結(jié)點(diǎn) </p><p> union
22、 // 原子結(jié)點(diǎn)和表結(jié)點(diǎn)的聯(lián)合部分 </p><p><b> {</b></p><p> ElemType data; // 原子結(jié)點(diǎn)的值域</p><p> struct GLNode *ph; // 表結(jié)點(diǎn)的表頭的表頭指針 </p><
23、p><b> }ptr;</b></p><p> struct GLNode *pt; // 相當(dāng)于線性鏈表的next,指向下一個(gè)元</p><p><b> //素結(jié)點(diǎn) </b></p><p> }GList; // 廣義表類型GLis
24、t是一種擴(kuò)展的線性鏈表</p><p><b> 廣義表的圖形表示</b></p><p><b> 圖1</b></p><p> 帶表頭結(jié)點(diǎn)的鏈?zhǔn)酱鎯?chǔ)</p><p><b> D </b></p><p><b> 圖2&l
25、t;/b></p><p> 廣義表的運(yùn)算問題流程圖</p><p><b> 結(jié)構(gòu)圖</b></p><p><b> 流程圖</b></p><p><b> 圖3 主函數(shù)</b></p><p> 圖4 字符串變廣義表</p&
26、gt;<p><b> 圖5 輸出廣義表</b></p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p> 功能目錄:void Menu()</p><p> void Menu()</p><p><b> {</b></p>&l
27、t;p> printf(" 廣義表的相關(guān)運(yùn)算\n");</p><p> printf("====================\n");</p><p> printf("1 字符串變廣義表\n");</p><p> printf("2 廣義表的復(fù)制\n");<
28、;/p><p> printf("3 廣義表的長度\n");</p><p> printf("4 廣義表的深度\n");</p><p> printf("5 廣義表的表頭\n");</p><p> printf("6 廣義表的表尾\n");</p&
29、gt;<p> printf("7 廣義表變?yōu)樽址甛n");</p><p> printf("8 查找廣義表中的字符\n");</p><p> printf("9 重新設(shè)定廣義表\n");</p><p> printf("0 推出程序\n");</p&
30、gt;<p> printf("====================\n");</p><p> printf(" 請 選 擇 0 -- 9\n"); </p><p><b> }</b></p><p><b> 函數(shù)功能:</b></p>
31、<p> 此函數(shù)為功能菜單選擇函數(shù),當(dāng)在主函數(shù)中輸完廣義表字符串并按回車后,調(diào)用此函數(shù),由這個(gè)函數(shù)打印出有關(guān)函數(shù)的各項(xiàng)操作。</p><p> 主函數(shù):int main()</p><p> int main()</p><p><b> {</b></p><p> while(EOF)<
32、/p><p><b> {</b></p><p> GList *L=NULL;</p><p> int n=0,i=0,a;</p><p> char ch,*str=NULL,string[50]={},s[50]={};</p><p> printf("輸入要建立廣義
33、表的字符串(形如((a,b),c,(d,e)):");</p><p> scanf("%s",&string);</p><p> getchar();</p><p> str=string;</p><p> L=StrToLists(str);</p><p>&l
34、t;b> Menu();</b></p><p> while(EOF)</p><p><b> {</b></p><p> printf("請輸入您需要進(jìn)行的步驟:");</p><p> scanf("%d",&a);</p>
35、<p> getchar();</p><p><b> switch(a)</b></p><p><b> {</b></p><p> case 1:printf("字符串變廣義表:");</p><p> PrintGList(L);</p&
36、gt;<p> printf("\n");</p><p><b> break;</b></p><p> case 2:printf("廣義表的復(fù)制是:");</p><p> PrintGList(CopyGList(L));</p><p> pri
37、ntf("\n");</p><p><b> break;</b></p><p> case 3:printf("廣義表的長度是:%d\n",length(L));</p><p><b> break;</b></p><p> case 4:p
38、rintf("廣義表的深度是:%d\n",depth(L));</p><p><b> break;</b></p><p> case 5:printf("廣義表的表頭是:");</p><p> PrintGList(head(L));</p><p> printf
39、("\n");</p><p><b> break;</b></p><p> case 6:printf("廣義表的表尾是:");</p><p> PrintGList(tail(L));</p><p> printf("\n");</p&
40、gt;<p><b> break;</b></p><p> case 7:printf("廣義表變字符串:");</p><p> str=ListsToStr(L,i);</p><p> strcpy(s,str);</p><p> printf("%s\n
41、",s);</p><p><b> break;</b></p><p> case 8:printf("查找廣義表中的字符\n");</p><p> printf("輸入需要查找的字符:");</p><p> scanf("%c",&a
42、mp;ch);</p><p> n=Find(L,ch);</p><p><b> if(n!=0)</b></p><p><b> {</b></p><p> printf("所選字符所在位置:%d\n",Find(L,ch));</p><
43、p><b> }</b></p><p><b> break;</b></p><p> case 9:break;</p><p> case 0:return 0;</p><p> default:printf("輸入錯(cuò)誤!");</p>&
44、lt;p><b> }</b></p><p> if(a==9)break;</p><p><b> } </b></p><p><b> }</b></p><p><b> return 0;</b></p&
45、gt;<p><b> }</b></p><p><b> 函數(shù)功能:</b></p><p> 當(dāng)程序運(yùn)行時(shí),首先運(yùn)行的就是主函數(shù)。在此函數(shù)中,首先打印出輸入提示,提供出入的樣例。輸入完成之后,將數(shù)據(jù)保存進(jìn)內(nèi)存,然后后通過調(diào)用Menu函數(shù)提供用戶功能選擇提示,再打印輸入提示,然后根據(jù)輸入的選項(xiàng)執(zhí)行不同的操作,通過循環(huán)可以進(jìn)
46、行不同的操作選擇。</p><p> 字符串變廣義表:GList *StrToLists(char *&s)</p><p> GList *StrToLists(char *&s) //字符串變廣義表 </p><p><b> {</b></p><p><b> G
47、List *h;</b></p><p><b> char ch;</b></p><p><b> ch=*s++;</b></p><p> if(ch!='\t')</p><p><b> {</b></p><
48、p> h=new GList;</p><p> if(ch=='(')</p><p><b> {</b></p><p><b> h->tag=1;</b></p><p> h->ptr.ph=StrToLists(s);</p>
49、<p><b> }</b></p><p> else if(ch==')')</p><p><b> h=NULL;</b></p><p><b> else</b></p><p><b> {</b><
50、/p><p><b> h->tag=0;</b></p><p> h->ptr.data=ch;</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b&
51、gt;</p><p><b> h=NULL;</b></p><p><b> ch=*s++;</b></p><p> if(h!=NULL)</p><p> if(ch==',')</p><p> h->pt=StrToLists
52、(s);</p><p><b> else</b></p><p> h->pt=NULL;</p><p><b> return h;</b></p><p><b> }</b></p><p><b> 函數(shù)功能:&l
53、t;/b></p><p> 將一串字符串以廣義表的形式保存,先判斷表頭是原子結(jié)點(diǎn)還是表結(jié)點(diǎn),是表節(jié)點(diǎn)的話,標(biāo)志位tag=1,然后遞歸輸入表頭。是原子結(jié)點(diǎn)的話tag=0,將數(shù)據(jù)存入ptr.data中。輸入玩表頭之后同樣以遞歸輸入表尾。</p><p> 廣義表的復(fù)制:GList *CopyGList(GList *p)</p><p> GList *C
54、opyGList(GList *p)</p><p><b> {</b></p><p><b> GList *q;</b></p><p> if(p==NULL)</p><p> return NULL;</p><p> q=new GList;<
55、/p><p> q->tag=p->tag;</p><p> if(p->tag==1)</p><p> q->ptr.ph=CopyGList(p->ptr.ph);</p><p><b> else </b></p><p> q->ptr.da
56、ta=p->ptr.data;</p><p> q->pt=CopyGList(p->pt);</p><p><b> return q;</b></p><p><b> }</b></p><p><b> 函數(shù)功能:</b></p>
57、;<p> 將一個(gè)廣義表復(fù)制給另一個(gè)廣義表。新建一個(gè)廣義表,將形參的表頭和表尾分別賦給新建的廣義表,再返回新建的廣義表。</p><p> 廣義表的輸出:void PrintGList(GList *L)</p><p> void PrintGList(GList *L)</p><p><b> {</b></p
58、><p> if(L!=NULL)</p><p><b> {</b></p><p> if(L->tag==1)</p><p><b> {</b></p><p> printf("(");</p><p>
59、 if(L->ptr.ph==NULL)</p><p> printf(" ");</p><p><b> else</b></p><p> PrintGList(L->ptr.ph);</p><p><b> }</b></p><
60、;p><b> else</b></p><p> printf("%c",L->ptr.data);</p><p> if(L->tag==1)</p><p> printf(")");</p><p> if(L->pt!=NULL)<
61、;/p><p><b> {</b></p><p> printf(",");</p><p> PrintGList(L->pt);</p><p><b> }</b></p><p><b> }</b></
62、p><p><b> }</b></p><p><b> 函數(shù)功能:</b></p><p> 輸出廣義表。首先判斷標(biāo)志位,tag=1,則輸出‘(’,然后遞歸輸出表頭,tag=0,則輸出ptr.data中的數(shù)據(jù)。表尾指針pt不為空時(shí),輸出‘,’在遞歸輸出表尾,為空則輸出‘)’。</p><p>
63、 廣義表的長度:int length(GList *L)</p><p> int length(GList *L)</p><p><b> {</b></p><p><b> int n=0;</b></p><p> L=L->ptr.ph;</p><p
64、> while(L!=NULL)</p><p><b> {</b></p><p><b> n++;</b></p><p><b> L=L->pt;</b></p><p><b> }</b></p><
65、;p><b> return n;</b></p><p><b> }</b></p><p><b> 函數(shù)功能:</b></p><p> 計(jì)算一個(gè)廣義表的長度。循環(huán)指向廣義表的表尾同時(shí)每指一次n加一,知道廣義表為空。</p><p> 廣義表的深度:in
66、t depth(GList *L)</p><p> int depth(GList *L)</p><p><b> {</b></p><p> int max=0;</p><p><b> int dep;</b></p><p> if(L->tag
67、==0)</p><p><b> return 0;</b></p><p> L=L->ptr.ph;</p><p> if(L==NULL)</p><p><b> return 1;</b></p><p> while(L!=NULL)</
68、p><p><b> {</b></p><p> if(L->tag==1)</p><p><b> {</b></p><p> dep=depth(L);</p><p> if(dep>max)</p><p><b&
69、gt; max=dep;</b></p><p><b> }</b></p><p><b> L=L->pt;</b></p><p><b> }</b></p><p> return(max+1);</p><p>
70、<b> }</b></p><p><b> 函數(shù)功能:</b></p><p> 計(jì)算一個(gè)廣義表的深度。分別計(jì)算每個(gè)廣義表原子的長度,再取其中的最大值。</p><p> 廣義表的表頭:GList *head(GList *&L)</p><p> GList *head(GL
71、ist *&L)</p><p><b> {</b></p><p><b> GList *p;</b></p><p> p=new GList;</p><p> p=CopyGList(L); </p><p> p->ptr.ph->
72、pt=NULL;</p><p> return(p->ptr.ph);</p><p><b> }</b></p><p><b> 函數(shù)功能:</b></p><p> 返回一個(gè)廣義表的表頭。即返回廣義表的表頭指針。</p><p> 廣義表的表尾:G
73、List *tail(GList *&L)</p><p> GList *tail(GList *&L)</p><p><b> {</b></p><p> return(L->ptr.ph->pt);</p><p><b> }</b></p>
74、;<p><b> 函數(shù)功能:</b></p><p> 返回一個(gè)廣義表的表尾。即返回廣義表的表尾指針。</p><p> 廣義表變?yōu)樽址篶har *ListsToStr(GList *L,int k)</p><p> char *ListsToStr(GList *L,int k)</p><p
75、><b> {</b></p><p> static int i=1;</p><p><b> if(k==0)</b></p><p><b> {</b></p><p> memset(str,'\0',sizeof(str));<
76、;/p><p> memset(s,'\0',sizeof(s));</p><p> s[k++]='(';</p><p> L=L->ptr.ph;</p><p><b> i=0;</b></p><p><b> }</b&g
77、t;</p><p> if(L->tag==1)</p><p><b> {</b></p><p> s[++i]='(';</p><p> ListsToStr(L->ptr.ph,k);</p><p><b> }</b>&
78、lt;/p><p><b> else</b></p><p><b> {</b></p><p> s[++i]=L->ptr.data;</p><p><b> }</b></p><p> if(L->pt!=NULL)<
79、;/p><p><b> {</b></p><p> s[++i]=',';</p><p> ListsToStr(L->pt,k);</p><p><b> }</b></p><p><b> else</b><
80、;/p><p><b> {</b></p><p> s[++i]=')';</p><p><b> } </b></p><p> return(s);</p><p><b> }</b></p><p&
81、gt;<b> 函數(shù)功能:</b></p><p> 將一個(gè)廣義表變?yōu)橐淮址?。首先判斷?biāo)志位,tag=1,則提取一個(gè)‘(’,然后遞歸提取表頭,tag=0,則提取ptr.data中的數(shù)據(jù)。如果表尾指針pt不為空則提取‘,’,然后遞歸提取表尾,為空則提取‘)’。</p><p> 查找廣義表中的字符:int Find(GList *L,char ch)</
82、p><p> int Find(GList *L,char ch)</p><p><b> {</b></p><p> int n=0,i=0;</p><p> char *str=NULL,s[50]={};</p><p> str=ListsToStr(L,i);</p&g
83、t;<p> for(int i=0;str[i];i++)</p><p><b> {</b></p><p> if(str[i]==ch)</p><p> return ++i;</p><p><b> }</b></p><p> pr
84、intf("所選字符不在廣義表內(nèi)!\n"); </p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 函數(shù)功能:</b></p><p> 返回需要查找的字符在廣義表中的第一個(gè)位置。先將
85、廣義表變?yōu)橐粋€(gè)字符串,然后在計(jì)算所需要尋找的字符在字符串中的第幾位。</p><p><b> 調(diào)試分析</b></p><p> 新建廣義表時(shí)容易忘了新建空間;</p><p> 調(diào)用函數(shù)時(shí)大小寫有時(shí)會(huì)弄錯(cuò);</p><p> 第二次輸入時(shí)沒有跳出輸入界面就跳過了,因?yàn)榈谝淮蔚腅nter沒有吸收,可用getch
86、ar()吸收Enter;</p><p><b> 測試結(jié)果</b></p><p> 測試用例:((a,b),c,(d,e));</p><p> ?。?1,2,3),4);</p><p> 數(shù)據(jù)輸入:((a,b),c,(d,e))</p><p><b> 執(zhí)行操作<
87、/b></p><p><b> 字符串變廣義表:</b></p><p><b> 廣義表的復(fù)制:</b></p><p><b> 廣義表的長度:</b></p><p><b> 廣義表的深度:</b></p><p
88、><b> 廣義表的表頭:</b></p><p><b> 廣義表的表尾:</b></p><p><b> 廣義表變?yōu)樽址?lt;/b></p><p> 查找廣義表中的字符:</p><p><b> 重新設(shè)定廣義表:</b></
89、p><p><b> 參考文獻(xiàn)</b></p><p> [1].譚浩強(qiáng).《C程序設(shè)計(jì)》. 清華大學(xué)出版社,2010年6月第四版</p><p> [2].譚浩強(qiáng).《C++程序設(shè)計(jì)》.清華大學(xué)出版社,2004年6月第四版</p><p> [3].嚴(yán)蔚敏、吳偉明.《數(shù)據(jù)結(jié)構(gòu)》(C語言版).清華大學(xué)出版社,2011年7
90、月</p><p><b> 源程序</b></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #include<string.h></p><p> typedef cha
91、r ElemType;</p><p> typedef struct GLNode</p><p><b> {</b></p><p> int tag; // tag為公共部分,只能為1和0,1代表表結(jié)點(diǎn),0代表原子結(jié)點(diǎn) </p><p> union
92、 // 原子結(jié)點(diǎn)和表結(jié)點(diǎn)的聯(lián)合部分 </p><p><b> {</b></p><p> ElemType data; // 原子結(jié)點(diǎn)的值域</p><p> struct GLNode *ph; // 表結(jié)點(diǎn)的表頭的表頭指針 </p><p>
93、<b> }ptr;</b></p><p> struct GLNode *pt; // 相當(dāng)于線性鏈表的next,指向下一個(gè)元素結(jié)點(diǎn) </p><p> }GList; // 廣義表類型GList是一種擴(kuò)展的線性鏈表 </p><p> char str[50]
94、,s[50];</p><p> GList *StrToLists(char *&s) //字符串變廣義表 </p><p><b> {</b></p><p><b> GList *h;</b></p><p><b> char ch;</b&g
95、t;</p><p><b> ch=*s++;</b></p><p> if(ch!='\t')</p><p><b> {</b></p><p> h=new GList;</p><p> if(ch=='(')</
96、p><p><b> {</b></p><p><b> h->tag=1;</b></p><p> h->ptr.ph=StrToLists(s); //遞歸構(gòu)建表頭 </p><p><b> }</b></p><
97、;p> else if(ch==')')</p><p><b> h=NULL;</b></p><p><b> else</b></p><p><b> {</b></p><p><b> h->tag=0;</b
98、></p><p> h->ptr.data=ch;</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> h=NULL;<
99、/b></p><p><b> ch=*s++;</b></p><p> if(h!=NULL)</p><p> if(ch==',')</p><p> h->pt=StrToLists(s); //遞歸構(gòu)建表尾 </p><p><
100、b> else</b></p><p> h->pt=NULL;</p><p><b> return h;</b></p><p><b> }</b></p><p> char *ListsToStr(GList *L,int k) //
101、將廣義表變成字符串 </p><p><b> {</b></p><p> static int i=1;</p><p><b> if(k==0)</b></p><p><b> {</b></p><p> memset(str,
102、39;\0',sizeof(str));</p><p> memset(s,'\0',sizeof(s));</p><p> s[k++]='(';</p><p> L=L->ptr.ph;</p><p><b> i=0;</b></p>&l
103、t;p><b> }</b></p><p> if(L->tag==1)</p><p><b> {</b></p><p> s[++i]='(';</p><p> ListsToStr(L->ptr.ph,k); //
104、遞歸提取表頭 </p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> s[++i]=L->ptr.data;</p><p><b> }<
105、;/b></p><p> if(L->pt!=NULL)</p><p><b> {</b></p><p> s[++i]=',';</p><p> ListsToStr(L->pt,k); //遞歸提取表尾 </p><
106、p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> s[++i]=')';</p><p><b> } </b></p><p&
107、gt; return(s);</p><p><b> }</b></p><p> GList *CopyGList(GList *p) //復(fù)制廣義表 </p><p><b> {</b></p><p><b> GList *q
108、;</b></p><p> if(p==NULL)</p><p> return NULL;</p><p> q=new GList;</p><p> q->tag=p->tag;</p><p> if(p->tag==1)</p><p>
109、q->ptr.ph=CopyGList(p->ptr.ph);</p><p><b> else </b></p><p> q->ptr.data=p->ptr.data;</p><p> q->pt=CopyGList(p->pt);</p><p><b>
110、 return q;</b></p><p><b> }</b></p><p> int length(GList *L) //返回廣義表的長度 </p><p><b> {</b></p><p><b>
111、int n=0;</b></p><p> L=L->ptr.ph;</p><p> while(L!=NULL)</p><p><b> {</b></p><p><b> n++;</b></p><p><b> L=L-&g
112、t;pt;</b></p><p><b> }</b></p><p><b> return n;</b></p><p><b> }</b></p><p> int Find(GList *L,char ch)
113、 //查找廣義表中的元素 </p><p><b> {</b></p><p> int n=0,i=0;</p><p> char *str=NULL,s[50]={};</p><p> str=ListsToStr(L,i);</p><p> for(int i=0;str
114、[i];i++)</p><p><b> {</b></p><p> if(str[i]==ch)</p><p> return ++i;</p><p><b> }</b></p><p> printf("所選字符不在廣義表內(nèi)!\n"
115、); </p><p><b> return 0;</b></p><p><b> } </b></p><p> int depth(GList *L) //返回廣義表的深度 </p><p><b> {</b>
116、</p><p> int max=0;</p><p><b> int dep;</b></p><p> if(L->tag==0)</p><p><b> return 0;</b></p><p> L=L->ptr.ph;</p>
117、;<p> if(L==NULL)</p><p><b> return 1;</b></p><p> while(L!=NULL)</p><p><b> {</b></p><p> if(L->tag==1)</p><p><
118、b> {</b></p><p> dep=depth(L);</p><p> if(dep>max)</p><p><b> max=dep;</b></p><p><b> }</b></p><p><b> L=L-
119、>pt;</b></p><p><b> }</b></p><p> return(max+1);</p><p><b> }</b></p><p> void PrintGList(GList *L) //打印廣義表 </
120、p><p><b> {</b></p><p> if(L!=NULL)</p><p><b> {</b></p><p> if(L->tag==1)</p><p><b> {</b></p><p>
121、printf("(");</p><p> if(L->ptr.ph==NULL)</p><p> printf(" ");</p><p><b> else</b></p><p> PrintGList(L->ptr.ph);</p>&l
122、t;p><b> }</b></p><p><b> else</b></p><p> printf("%c",L->ptr.data);</p><p> if(L->tag==1)</p><p> printf(")");
123、</p><p> if(L->pt!=NULL)</p><p><b> {</b></p><p> printf(",");</p><p> PrintGList(L->pt);</p><p><b> }</b><
124、/p><p><b> }</b></p><p><b> }</b></p><p> GList *head(GList *&L) //返回廣義表的表頭 </p><p><b> {</b></p><p>
125、<b> GList *p;</b></p><p> p=new GList;</p><p> p=CopyGList(L); </p><p> p->ptr.ph->pt=NULL;</p><p> return(p->ptr.ph);</p><p>&l
126、t;b> }</b></p><p> GList *tail(GList *&L) //返回廣義表的表尾 </p><p><b> {</b></p><p> return(L->ptr.ph->pt);</p><p><b> }
127、</b></p><p> void Menu() //打印菜單 </p><p><b> {</b></p><p> printf(" 廣義表的相關(guān)運(yùn)算\n");</p><p> printf(&qu
128、ot;====================\n");</p><p> printf("1 字符串變廣義表\n");</p><p> printf("2 廣義表的復(fù)制\n");</p><p> printf("3 廣義表的長度\n");</p><p> p
129、rintf("4 廣義表的深度\n");</p><p> printf("5 廣義表的表頭\n");</p><p> printf("6 廣義表的表尾\n");</p><p> printf("7 廣義表變?yōu)樽址甛n");</p><p> pri
130、ntf("8 查找廣義表中的字符\n");</p><p> printf("9 重新設(shè)定廣義表\n");</p><p> printf("0 推出程序\n");</p><p> printf("====================\n");</p><
131、p> printf(" 請 選 擇 0 -- 9\n"); </p><p><b> }</b></p><p> int main()</p><p><b> {</b></p><p> while(EOF)</p><p><
132、;b> {</b></p><p> GList *L=NULL;</p><p> int n=0,i=0,a;</p><p> char ch,*str=NULL,string[50]={},s[50]={};</p><p> printf("輸入要建立廣義表的字符串(形如((a,b),c,(d,
133、e)):");</p><p> scanf("%s",&string);</p><p> getchar();</p><p> str=string;</p><p> L=StrToLists(str);</p><p><b> Menu();<
134、/b></p><p> while(EOF)</p><p><b> {</b></p><p> printf("請輸入您需要進(jìn)行的步驟:");</p><p> scanf("%d",&a);</p><p> getchar
135、();</p><p><b> switch(a)</b></p><p><b> {</b></p><p> case 1:printf("字符串變廣義表:");</p><p> PrintGList(L);</p><p> prin
136、tf("\n");</p><p><b> break;</b></p><p> case 2:printf("廣義表的復(fù)制是:");</p><p> PrintGList(CopyGList(L));</p><p> printf("\n");
137、</p><p><b> break;</b></p><p> case 3:printf("廣義表的長度是:%d\n",length(L));</p><p><b> break;</b></p><p> case 4:printf("廣義表的深度是:
138、%d\n",depth(L));</p><p><b> break;</b></p><p> case 5:printf("廣義表的表頭是:");</p><p> PrintGList(head(L));</p><p> printf("\n");<
139、;/p><p><b> break;</b></p><p> case 6:printf("廣義表的表尾是:");</p><p> PrintGList(tail(L));</p><p> printf("\n");</p><p><b&
140、gt; break;</b></p><p> case 7:printf("廣義表變字符串:");</p><p> str=ListsToStr(L,i);</p><p> strcpy(s,str);</p><p> printf("%s\n",s);</p>
141、<p><b> break;</b></p><p> case 8:printf("查找廣義表中的字符\n");</p><p> printf("輸入需要查找的字符:");</p><p> scanf("%c",&ch);</p>&
142、lt;p> n=Find(L,ch);</p><p><b> if(n!=0)</b></p><p><b> {</b></p><p> printf("所選字符所在位置:%d\n",Find(L,ch));</p><p><b> }<
143、;/b></p><p><b> break;</b></p><p> case 9:break;</p><p> case 0:return 0;</p><p> default:printf("輸入錯(cuò)誤!");</p><p><b> }
144、</b></p><p> if(a==9)break;</p><p><b> } </b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 表達(dá)式求值廣義表的運(yùn)算課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--廣義表運(yùn)算的驗(yàn)算設(shè)計(jì)
- 課程設(shè)計(jì)---多用戶電能表課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--課程表設(shè)計(jì)
- 課程設(shè)計(jì)--《哈希表的操作》設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告--數(shù)字電壓表
- 課程設(shè)計(jì)報(bào)告--數(shù)據(jù)哈希表應(yīng)用
- 數(shù)字電壓表課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)----課程設(shè)計(jì)報(bào)告
- fpga課程設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告--萬用表設(shè)計(jì)
- 課程設(shè)計(jì)1線性表課程設(shè)計(jì)
- 直流數(shù)字電流表課程設(shè)計(jì)報(bào)告
- 萬用表課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告
- 哈希表課程設(shè)計(jì)
評論
0/150
提交評論