// 广义表.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
using namespace std;
typedef struct lnode
{
int tag;
union
{
char data;
struct lnode* sublist;
}val;
struct lnode *link;
}GLNode;
GLNode* copy(GLNode *g)//复制广义表
{
if(g == NULL)
{
return NULL;
}
GLNode * p;
p = new GLNode;
p->tag = g->tag;
if(g->tag == 1)//如果是表节点
{
p->val.sublist = copy(g->val.sublist);
}
else//是原子
{
p->val.data = g->val.data;
}
p->link = copy(g->link);
return p;
}
GLNode *createGL(char *s)
{
GLNode *h;
char ch;
ch = *s;
s++;
if (ch !='\0')//串未结束判断
{
h = new GLNode;
if(ch == '(')
{
h->tag = 1;
h->val.sublist = createGL(s);//递归构造字表并链到表头结点
}
else if (ch == ')')
{
h = NULL;//遇到)字符,字表为空
}
else
{
h->tag = 0;
h->val.data = ch;//原子结点
}
}
else
{
h = NULL;
}
ch = *s;//取下一个字符
s++;
if(h != NULL)
{
if(ch == ',')
{
h->link = createGL(s);//link指向下一个元素所在结点的地址
}
else
{
h->link = NULL;
}
}
return h;
}
//广义表的长度定义为最外层包含元素个数,即相应的同层结点所构成的单链表的长度
int getLength(GLNode *g)//非递归取得广义表的长度
{
int n = 0;
g = g->val.sublist;//从广义表的第一个元素开始(因为是采用头结点)
while (g != NULL)
{
n++;
g = g->link;
}
return n;
}
int getLength1(GLNode *g)//采用递归获得广义表的长度
{
if(g != NULL)
return 1+ getLength(g->link);
else
{
return 0;
}
}
//广义表的深度:将广义表展开后所含括号的最大嵌套层数称为深度
int getDepth(GLNode* g)
{
int max = 0,dep;
if(g->tag == 0)//是原子
{
return 0;
}
g = g->val.sublist;
if(g == NULL)//空表
{
return 1;
}
while (g != NULL)
{
if(g->tag == 1)//元素为字表
{
dep = getDepth(g);
if(dep > max)
{
max = dep;
}
}
g = g->link;
}
return (max + 1);
}
void display(GLNode *g)
{
if(g != NULL)
{
if(g->tag == 1)//为表结点
{
cout<<"(";
if(g->val.sublist == NULL)
{
cout<<"";
}
else
{
display(g->val.sublist);//递归输出字表
}
}
else//是原子
{
cout<<g->val.data;
}
if(g->tag == 1)
cout<<")";
if(g->link != NULL)
{
cout<<",";
display(g->link);//递归输出后续表内容
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char *s = "(a,(b,c,d)))";
GLNode *g = createGL(s);
GLNode *p = copy(g);
display(p);
return 0;
}