广义表

目的:

  1. 领会广义表的存储结构
  2. 掌握广义表基本运算算法设计。
    内容:
    编写程序,实现广义表的各种基本运算,并在此基础上设计一个程序,完成以下功能:
  3. 建立广义表g=“(b,(b,a,(#),d),((a,b),c,((#))))”的链式存储结构;
  4. 输出广义表G的长度;
  5. 输出广义表g的深度;
  6. 输出广义表g的最大原子;
  7. 输出广义表g的原子个数;
#include<iostream>
#include<cstdio>
using namespace std;
typedef char DataType; 
typedef struct Node
{
	int flag;//标记是原子还是子表
	union
	{
		DataType data;//原子的值 
		Node *List;//子表首地址 
	}val;
	Node *next;
}GLNode;

//初始化广义表
void InitGLNode(GLNode *&g)
{
	g = (GLNode*)malloc(sizeof(GLNode));
	g->next = NULL;
	g->val.List = NULL;
}
//广义表的长度 
int GLNodeLength(GLNode *g) 
{
	int length = 0;
	GLNode *p = g->val.List;
	while(p != NULL)
	{
		length++;
		p = p->next;
	}
	return length;
}
//广义表的深度
int GLNodeDepth(GLNode *g) 
{
	int depth,max = 0;
	GLNode *p = g->val.List;
	if(g->flag == 0)return 0;//是原子返回0
	if(p == NULL)return 1;//是空表返回1 
	while(p != NULL)
	{
		if(p->flag == 1)
		{
			depth = GLNodeDepth(p);
			max = max>depth ? max:depth;
		}
		p = p->next;
	}
	return max+1;
}
//最大原子 
DataType  MaxGLNode(GLNode *g)
{
	DataType max = '#';
	GLNode *p = g->val.List;
	while(p != NULL)
	{
		if(p->flag == 1)//子表 
			max = max>MaxGLNode(p) ? max:MaxGLNode(p);
		else max = max>p->val.data ? max:p->val.data;
		p = p->next;
	}
	return max;
}
//广义表原子个数 
int GLNodeCount(GLNode *g)
{
	int count = 0;
	GLNode *p = g->val.List;
	while(p != NULL)
	{
		if(p->flag == 1)//子表 
			count += GLNodeCount(p);
		else count++;
		p = p->next;
	}
	return count;
}
//建立广义表 
GLNode* CreateGLNode(char *&s)
{
	GLNode *g;
	char c = *s++;
	if(c != '\0')
	{
		g = (GLNode*)malloc(sizeof(GLNode));
		if(c == '(')
		{
			g->flag = 1;
			g->val.List = CreateGLNode(s);
		}
		else if(c == '#') g = NULL;
		else
		{
			g->flag = 0;
			g->val.data = c;
		}
	}
	else g = NULL;
	c = *s++;
	if(g != NULL)
	{
		if(c == ',')
			g->next = CreateGLNode(s);
		else g->next = NULL;
	}
	return g;
}
//输出广义表
void OutGLNode(GLNode *g)
{
	if (g!=NULL )
	{
		if (g->flag == 0)
			cout<<g->val.data;
		else
		{ 
			cout<<"(";
			if (g->val.List == NULL)
				cout<<'#';
			else
				OutGLNode(g->val.List);
			cout<<')';
		}
		if (g->next != NULL)
		{
			cout<<',';
			OutGLNode(g->next);
		}
	}
}
//销毁广义表
void Destroy(GLNode *&g)
{
	GLNode *p,*q;
	p = g->val.List;
	while(p)
	{
		if(p->flag == 0)
		{
			q = p->next;
			free(p);
			p = q;
		}
		else
		{
			q = p->next;
			Destroy(p);
			p = q;
		}
	}
	free(g);
}
int main()
{
	GLNode *g;
	char *c = "(b,(b,a,(#),d),((a,b),c,((#))))";
	//初始化广义表
	cout<<"初始化广义表"; 
	InitGLNode(g); 
	//1. 建立广义表g="(b,(b,a,(#),d),((a,b),c,((#))))"的链式存储结构
	cout<<"\n\n1. 建立广义表g=\"(b,(b,a,(#),d),((a,b),c,((#))))\"的链式存储结构";
	g = CreateGLNode(c);
	
	//2. 输出广义表
	cout<<"\n\n2. 输出广义表:"; 
	OutGLNode(g);

	//3. 输出广义表G的长度;
	cout<<"\n\n3. 输出广义表G的长度;"<<GLNodeLength(g);
	
	//4. 输出广义表g的深度;
	cout<<"\n\n4. 输出广义表g的深度;"<<GLNodeDepth(g);
	
	//5. 输出广义表g的最大原子;
	cout<<"\n\n5. 输出广义表g的最大原子;"<<MaxGLNode(g);
	
	//6. 输出广义表g的原子个数;
	cout<<"\n\n6. 输出广义表g的原子个数;"<<GLNodeCount(g);
	
	//7. 销毁广义表
	cout<<"\n\n7. 销毁链表";
	Destroy(g);
	return 0;
}

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值