廣義表的基本運算

廣義表的基本運算和實現

#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);            //遞歸輸出後續表的內容
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章