廣義表的基本運算和實現
#include <stdio.h>
#include <malloc.h>
#include "glnode.h"
int GLLength(GLNode *g) //求廣義表g的長度
{
int n=0;
GLNode *g1;
g1=g->val.sublist; //g指向廣義表的第一個元素
while (g1!=NULL)
{
n++; //累加元素個數
g1=g1->link;
}
return n;
}
int GLDepth(GLNode *g) //求廣義表g的深度
{
GLNode *g1;
int max=0,dep;
if (g->tag==0) //爲原子時返回0
return 0;
g1=g->val.sublist; //g1指向第一個元素
if (g1==NULL) //爲空表時返回1
return 1;
while (g1!=NULL) //遍歷表中的每一個元素
{
if (g1->tag==1) //元素爲子表的情況
{
dep=GLDepth(g1); //遞歸調用求出子表的深度
if (dep>max) //max爲同一層所求過的子表中深度的最大值
max=dep;
}
g1=g1->link; //使g1指向下一個元素
}
return(max+1); //返回表的深度
}
GLNode *CreateGL(char *&s) //返回由括號表示法表示s的廣義錶鏈式存儲結構
{
GLNode *g;
char ch=*s++; //取一個字符
if (ch!='\0') //串未結束判斷
{
g=(GLNode *)malloc(sizeof(GLNode));//創建一個新節點
if (ch=='(') //當前字符爲左括號時
{
g->tag=1; //新節點作爲表頭節點
g->val.sublist=CreateGL(s); //遞歸構造子表並鏈到表頭節點
}
else if (ch==')')
g=NULL; //遇到')'字符,g置爲空
else if (ch=='#') //遇到'#'字符,表示爲空表
g=NULL;
else //爲原子字符
{
g->tag=0; //新節點作爲原子節點
g->val.data=ch;
}
}
else //串結束,g置爲空
g=NULL;
ch=*s++; //取下一個字符
if (g!=NULL) //串未結束,繼續構造兄遞節點
if (ch==',') //當前字符爲','
g->link=CreateGL(s); //遞歸構造兄遞節點
else //沒有兄弟了,將兄弟指針置爲NULL
g->link=NULL;
return g; //返回廣義表g
}
void DispGL(GLNode *g) //輸出廣義表g
{
if (g!=NULL) //表不爲空判斷
{ //先處理g的元素
if (g->tag==0) //g的元素爲原子時
printf("%c", g->val.data); //輸出原子值
else //g的元素爲子表時
{
printf("("); //輸出'('
if (g->val.sublist==NULL) //爲空表時
printf("#");
else //爲非空子表時
DispGL(g->val.sublist); //遞歸輸出子表
printf(")"); //輸出')'
}
if (g->link!=NULL)
{
printf(",");
DispGL(g->link); //遞歸輸出後續表的內容
}
}
}