数据结构之广义表

28 篇文章 1 订阅
22 篇文章 0 订阅
#include<stdio.h>
#include<stdlib.h> 
typedef struct lnode
{
	int tag;
	union{
		char data;
		struct lnode * sublist;
	} val;
	struct lnode * link;
}GLNode;

int GLLength(GLNode *g)//长度 
{
	int n=0;
	GLNode *g1;
	g1=g->val.sublist;
	while(g1!=NULL)
	{
		n++;
		g1=g1->link;
	}
	return n;
}
int GLDepth(GLNode*g)//深度 
{
	GLNode *g1;
	int maxd=0,dep;
	if(g->tag==0)
	{
		return 0;
	}
	g1=g->val.sublist;
	if(g1==NULL)
	{
		return 1;
	}
	while(g1!=NULL)
	{ 
		if(g1->tag==1)
		{
			dep=GLDepth(g1);
			if(dep>maxd)
			{
				maxd=dep;
			}
			
		}
		g1=g1->link;
	}
	return (maxd+1);
}

void DispGL(GLNode *g)//输出广义表 
{
	if(g!=NULL)
	{
		if(g->tag==0)
		{
			printf("%c",g->val.data);
		}
		else
		{
			printf("(");
			if(g->val.sublist==NULL)
			{
				printf("#");
			}
			else
			{
				DispGL(g->val.sublist);
			}
			printf(")");
		}
		if(g->link!=NULL)
		{
			printf(",");
			DispGL(g->link); 
		}
	}
}
GLNode *CreatGL(char *&s)
{
	GLNode *g;
	char ch=*s++;
	if(ch!='\0') 
	{
		g=(GLNode *)malloc(sizeof(GLNode));
		if(ch=='(')
		{
			g->tag=1;
			g->val.sublist=CreatGL(s);
		}
		else if(ch==')')
		{
			g=NULL;
		}
		else if(ch=='#')
		{
			g=NULL;
		}
		else
		{
			g->tag=0;
			g->val.data=ch;
		}
	}
	else
	{
		g=NULL;
	}
	ch=*s++;
	if(g!=NULL)
	{
		if(ch==',')
		{
			g->link=CreatGL(s);
		}
		else
		{
			g->link=NULL;
		}
	}
	return g;
}
void DestroyGL(GLNode *& g)//递归释放广义表 
{
	GLNode *g1,*g2;
	g1=g->val.sublist;
	while(g1!=NULL)
	{
		if(g1->tag==0)
		{
			g2=g1->link;
			free(g1);
			g1=g2;
		}
		else
		{
			g2=g1->link;
			DestroyGL(g1);
			g1=g2;
		}
	}
	free(g);
}
int main()
{
    GLNode *s;
    char *g="(b,(b,a,(#),d),((a,b),c,((#))))";
    s=CreatGL(g);
    printf("g:");
	DispGL(s);
    printf("\n");
    printf("%d\n",GLLength(s));
    printf("%d",GLDepth(s));
    DestroyGL(s);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
广义表是一种扩展了线性表的数据结构,能够存储多层次的数据。在C语言中,可以通过链表来实现广义表。 首先,我们需要定义广义表的节点结构。一个广义表节点包含一个元素值和两个指针,分别指向下一个元素节点和子广义表的头节点。可以使用以下结构体表示: ```c typedef struct GNode { int tag; // 标志位,用于区分元素节点和子广义表节点,0表示元素节点,1表示子广义表节点 union { int data; // 元素节点的值 struct GNode* subList; // 子广义表的头节点指针 }; struct GNode* next; // 指向下一个节点的指针 } GNode; ``` 通过上述节点结构,可以构建出一个广义表的链表。在链表中,每个节点可以是元素节点或子广义表节点。当节点的tag为0时,表示该节点是一个元素节点,此时可以通过data字段访问该节点的值。当节点的tag为1时,表示该节点是一个子广义表节点,此时可以通过subList字段访问该子广义表的头节点。 可以通过以下代码示例来创建一个包含元素和子广义表广义表: ```c GNode* createGNode(int tag, int data, GNode* subList) { GNode* node = (GNode*)malloc(sizeof(GNode)); node->tag = tag; if (tag == 0) { node->data = data; } else if (tag == 1) { node->subList = subList; } node->next = NULL; return node; } GNode* createGeneralList() { GNode* list = createGNode(1, 0, NULL); // 创建一个空的子广义表 list->next = createGNode(0, 1, NULL); // 创建一个元素节点,值为1 list->next->next = createGNode(0, 2, NULL); // 创建一个元素节点,值为2 list->subList = createGNode(1, 0, NULL); // 创建一个空的子广义表作为头节点的子表 list->subList->subList = createGNode(0, 3, NULL); // 在子广义表中创建一个元素节点,值为3 return list; } ``` 上述代码中,`createGeneralList`函数创建了一个广义表,包含了元素节点1、2和子广义表。 这只是广义表在C语言中的一种实现方式,你可以根据实际需求来选择适合的数据结构和实现方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值