《数据结构复习》扩展线性链表的广义表

typedef char DataType;

//广义表结点类型的定义
typedef struct GLNode
{
	int tag;//结点类型表示
	union
	{
		DataType data;
		struct GLNode *hp;//表结点的表头指针
	}val;
	struct GLNode *tp;   //相当于线性链表的next,指向下一个元素结点
};

在这里插入图片描述

//扩展线性链表存储
//ch1_9
#include<stdio.h>
#include<stdlib.h>

typedef char DataType;
typedef struct GLNode
{
	int tag;//表结点1	原子结点0
	union
	{
		DataType data;
		struct GLNode* hp;//表结点的表头结点
	}val;
	struct GLNode* tp;   //指向下一个元素
}*GList;

//递归求广义表的深度
int gldepth(GList g) {
	int max = 0, dep;
	if (0 == g->tag)	//原子结点,深度为0
		return 0;
	g = g->val.hp;	//跳转到表头结点
	if (NULL == g)	//空表,深度为1
		return 1;
	while (g != NULL) {
		if (1 == g->tag) {	//1为表结点,递归调用
			dep = gldepth(g);
			if (dep > max)
				max = dep;	//用max记录深度
		}
		g = g->tp;
	}
	return max + 1;
}
//求广义表长度
int GLLenght(GList g)
{
	int n = 0;
	g = g->val.hp;//表头结点
	while (NULL != g)
	{
		n++;
		g = g->tp;//表头结点的next
	}
	return n;
}
//复制广义表
GList GLCopy(GList p)
{
	GList q;
	if (NULL == p)	//空表
		return NULL;
	q = (GList)malloc(sizeof(GList));//分配空间

	q->tag = p->tag;
	if (1 == p->tag)
		q->val.hp = GLCopy(p->val.hp);//复制表头结点
	else
		q->val.data = p->val.data;
	q->tp = GLCopy(p->tp);//复制next结点
	return q;
}
//创建广义表
GList CreatGL(char* s)
{
	GList h;
	char ch;
	ch = *s;          //取一个扫描字符
	s++;              //串指针向后移动一位

	if ('\0' != ch)   //串未结束标识
	{
		h = (GList)malloc(sizeof(GList));     //创建一个新结点
		if ('(' == ch)                //当前字符为左括号
		{
			h->tag = 1;         //新结点为表头结点
			h->val.hp = CreatGL(s);    //递归构造子表并链接到表头节点上
		}
		else if (')' == ch)         //当前字符为右括号
		{
			h = NULL;
		}
		else
		{
			h->tag = 0;   //新结点为原子结点
			h->val.data = ch;
		}
	}
	//ch=串结束标志
	else   
		h = NULL;
	ch = *s;
	s++;
	if (h != NULL)
	{
		if (',' == ch)
		{
			h->tp = CreatGL(s);
		}
		else
		{
			h->tp = NULL;
		}
	}
	return h;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值