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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論