题目要求:
编写一个程序exp6-5.cpp,实现广义表的各种运算,并在此基础上设计一个主程序完成如下功能
1.建立广义表g=“(b,(b,a,(#),d),((a,b),c,((#))))”的链式存储结构;
2.输出广义表g的长度;
3.输出广义表g的深度;
4.输出广义表g的最大原子。
输入代码:
#include<iostream>
#include<malloc.h>
#include<stdio.h>
using namespace std;
typedef char ElemType;
typedef struct lnode
{
int tag; //节点类型标识
union
{
ElemType data;
struct lnode *sublist;
} val;
struct lnode *link; //指向下一个元素
} GLNode;
/*
建立广义表的链式存贮结构
*/
GLNode *CreateGL(char *&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->val.sublist=NULL;
else //为原子字符
{
g->tag=0; //新节点作为原子节点
g->val.data=ch;
}
}
else
g=NULL;//串结束,g置为空
ch=*s++;//串取下一个字符
if(g!=NULL)//串未结束,继续构造兄弟节点
{
if(ch==',')
g->link=CreateGL(s);//递归构造兄弟节点
else
g->link=NULL;//没有兄弟了,将兄弟置为NULL
}
return g;//返回广义表g
}
/*
求广义表的长度
*/
int GLLength(GLNode *g)
{
int n=0;
GLNode *g1;
g1=g->val.sublist;//g1指向广义表的第一个元素
while(g1!=NULL)
{
n++;//累加元素个数
g1=g1->link;
}
return n;
}
/*
求广义表的深度
*/
int GLDepth(GLNode *g) //求广义表g的深度
{
int max=0,dep;
if (g->tag==0)
return 0;
g=g->val.sublist;//g指向第一个元素
if (g==NULL) //为空表时返回1
return 1;
while (g!=NULL) //遍历表中的每一个元素
{
if (g->tag==1) //元素为子表的情况
{
dep=GLDepth(g); //递归调用求出子表的深度
if (dep>max) max=dep; //max为同一层所求过的子表中深度的最大值
}
g=g->link; //使g指向下一个元素
}
return(max+1); //返回表的深度
}
/*
输出广义表
*/
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);//递归输出g的兄弟
}
}
}
/*
求广义表中的最大原子
*/
ElemType MaxAtom(GLNode *g)
{
ElemType Max1,Max2;
if(g!=NULL)
{
if(g->tag==0)//如果g的元素时原子
{
Max1=MaxAtom(g->link);
return (g->val.data>Max1?g->val.data:Max1);
}
else
{
Max1=MaxAtom(g->val.sublist);
Max2=MaxAtom(g->link);
return(Max1>Max2?Max1:Max2);
}
}
else
{
return 0;
}
}
int main()
{
GLNode *g;
char *str="(b,(b,a,(#),d),((a,b),c,((#))))";
g=CreateGL(str);
printf("广义表g:");
DispGL(g);
printf("\n");
printf("广义表g的长度:%d\n",GLLength(g));
printf("广义表g的深度:%d\n",GLDepth(g));
printf("最大原子:%c\n",MaxAtom(g));
return 0;
}
运行截图: