广义表的扩展定义之后的实现代码
时间:2010-04-23 来源:sjtlqy
/*************************************************
CreateGList(返回:void)创建一个广义表
PrintGList(返回:void)打印一个广义表
GListDepth(返回:int)求广义表的深度
**************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef enum{ATOM, LIST}ElemTag; /*ATOM==0:原子,LIST==1:子表*/
typedef struct GLNode
{
int tag; /*公共部分,区分原子和表结点*/
union /*原子结点和表结点的联合部分*/
{
char atom; /*原子结点的值域*/
struct GLNode *sublist; /*表结点表头指针*/
};
struct GLNode *next; /*下一个元素结点*/
}GList;
void CreateGList(GList **gl);
void PrintGList(GList *gl);
int GListDepth(GList *gl);
int main(void)
{
GList *gl;
printf("建立一个广义表,以右括号结束\n");
CreateGList(&gl);
printf("输出广义表:");
PrintGList(gl);
printf("\n");
printf("广义表的深度:");
printf("%d\n", GListDepth(gl->sublist));
return 0;
}
void CreateGList(GList **gl)
{
char ch;
scanf("%c", &ch);
getchar(); /*吞食scanf留下的换行*/
if(ch == '#') /*如果输入的是#表示为空*/
{
*gl = NULL;
}
else if(ch == '(') /*如果是左括号就递归构件子表*/
{
*gl = (GList *)malloc(sizeof(GList));
(*gl)->tag = LIST;
CreateGList(&((*gl)->sublist));
}
else /*就是只有原子的情况下*/
{
*gl = (GList *)malloc(sizeof(GList));
(*gl)->tag = ATOM;
(*gl)->atom = ch;
}
scanf("%c", &ch); /*此处输入的必为逗号或者右括号*/
getchar();
if((*gl) == NULL)
{
;
}
else if(ch == ',') /*如果是逗号就递归构件下一个子表*/
{
CreateGList(&((*gl)->next));
}
else if(ch == ')') /*如果是右括号就结束*/
{
(*gl)->next = NULL;
}
}
int GListDepth(GList *gl)
{
int max, dep;
if(!gl)
return 1;
for(max = 0; gl; gl = gl->next)
{
if(gl->tag == LIST)
{
dep = GListDepth(gl->sublist); /*求以gl->sunlist的子表深度*/
if(dep > max)
{
max = dep;
}
}
}
return max + 1; /*各元素的深度的最大值加一*/
}
void PrintGList(GList *gl)
{
if(gl->tag == LIST)
{
printf("("); /*先输出左括号*/
if(gl->sublist == NULL)
{
printf("#");
}
else
{
PrintGList(gl->sublist); /*递归打印子表*/
}
printf(")"); /*结束打印右括号*/
}
else
{
printf("%c", gl->atom);
}
if(gl->next != NULL) /*如果没结束就继续递归打印子表*/
{
printf(", ");
PrintGList(gl->next);
}
}
相关阅读 更多 +