算法与数据结构之广义表

#include<stdio.h>
#include<malloc.h>
#include<windows.h>
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;
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=creategl(s);
else
g->link=NULL;
return g;
}

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 max=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>max)
max=dep;
}
g1=g1->link;
}
return(max+1);
}

elemtype maxatom(glnode *g) //求广义表中的最大原子
{
elemtype max1,max2;
if(g!=NULL)
{
if(g->tag==0)
{
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;
}
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);
}
}
}

void main()
{
glnode *g;
char a[100],*p=a;
int m;
printf(" *************欢迎使用广义表的运算系统****************\n");
printf("请输入一个广义表:(例如(b,(b,a,(#),d),((a,b),c,((#)))))\n");
gets(a);
g=creategl(p);
printf("广义表已建好\n");
while(1)
{
printf("请选择:");
printf(" 1求广义表的长度\n");
printf(" 2求广义表的深度\n");
printf(" 3输出广义表\n");
printf(" 4求广义表中的最大原子\n");
printf(" 5退出\n");
scanf("%d",&m);
switch(m)
{
case 1:printf("广义表的长度为:%d\n",gllength(g));break;
case 2:printf("广义表的深度为:%d\n",gldepth(g));break;
case 3:printf("广义表为:");dispgl(g);printf("\n");break;
case 4:printf("广义表中的最大原子为:%c\n",maxatom(g));break;
case 5:exit(0);
default:printf("输入错误\n");
}
}
}

时间: 2024-11-08 22:17:37

算法与数据结构之广义表的相关文章

数据结构的广义表,课本上GetHead((B,C))=B,为什么?

问题描述 数据结构的广义表,课本上GetHead((B,C))=B,为什么? 数据结构的广义表,课本上GetHead((B,C))=B,为什么?可网上的题为什么都做成 GetHead((B,C))=(B,C)呢,弄不明白,求大神指导 解决方案 GetHead((B,C))=B 这是对的 GetHead((B,C))=(B,C) 这个在哪里看来的 解决方案二: 哦,我知道了, GetHead(B,C)=B GetHead((B,C))=(B,C) 解决方案三: 解决方案四: 可课本上明明写着Get

javascript实现数据结构:广义表

原文:javascript实现数据结构:广义表  广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作:      LS = (a1, a2, ..., an) LS是广义表的名称,n是它的长度,ai可以是单个元素,也可以是广义表,分别称为广义表LS的原子和子表.习惯上,用大写字母表示广义表的名称,小写字母表示原子.当广义表LS非空时,称第一个元素a1为LS的表头,称其余元素组成的表(a2, a3, ..., an)是LS的表尾.   下面列举

浅谈算法和数据结构 六 符号表及其基本实现

前面几篇文章介绍了基本的排序算法,排序通常是查找的前奏操作.从本文开始介绍基本的查找算法. 在介绍查找算法,首先需要了解符号表这一抽象数据结构,本文首先介绍了什么是符号表,以及这一抽象数据结构的的API,然后介绍了两种简单的符号表的实现方式. 一符号表 在开始介绍查找算法之前,我们需要定义一个名为符号表(Symbol Table)的抽象数据结构,该数据结构类似我们再C#中使用的Dictionary,他是对具有键值对元素的一种抽象,每一个元素都有一个key和value,我们可以往里面添加key,v

算法与数据结构之顺序表顺序表

著名的计算机科学家N.Wirth教授曾提出一个公式:算法+数据结构=程序 "数组"类型表示顺序存储结构,用指针来表示链式存储结构.指针p指向下一个对象单元,p的值不是一增加1,而是增加对象类型所占的字节数. 一个结构提示类型student,没有定义变量,就不会分配存储单元,不能再程序中直接访问结构体类型名. 线性表是N个具有相同特性的数据元素的有限序列.线性表分为 顺序存储结构和链式存储结构. 顺序表: /*顺序表的建立与输出*/ #include<stdio.h>#inc

数据结构之自建算法库——广义表

本文针对数据结构基础系列网络课程(5):数组与广义表中第6课时广义表的存储结构及基本运算的实现. 广义算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:glist.h,包含定义广义表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef GLIST_H_INCLUDED #define GLIST_H_INCLUDED typedef char ElemType; typedef struct lnode { int tag; //节点类型标识 union { ElemTyp

数据结构实践项目——数组和广义表

本文针对 [数据结构基础系列网络课程(5):数组和广义表] 1. 数组的基本概念与存储结构 2. 特殊矩阵的压缩存储 3. 稀疏矩阵的三元组表示 4. 稀疏矩阵的十字链表表示 5. 广义表 6. 广义表的存储结构及基本运算的实现 [项目1 - 猴子选大王(数组版)] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,最后一只出圈的猴子为大王.输入m和n,输出猴子离开圈子的顺序,从中也可以看出最后为大王是几号

浅谈算法和数据结构 十一 哈希表

在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是他们在平均以及最差情况下的时间复杂度: 可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度. 那么有没有查找效率更高的数据结构呢,答案就是本文接下来要介绍了散列表,也叫哈希表(Hash Table) 什么是哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 哈希的思路很简单

数据结构与算法(C#实现)系列---广义树(一)

数据|数据结构|算法 数据结构与算法(C#实现)系列---广义树(一) Heavenkiller(原创) 广义树和基本树的主要区别就是有任意的度 using System; using System.Collections; namespace DataStructure { /// <summary> /// GeneralTree 的摘要说明. /// general tree is a tree which has a arbitrary degree and no empty tree

数据结构与算法(C#实现)系列---广义树(二)

数据|数据结构|算法 数据结构与算法(C#实现)系列---广义树(二) Heavenkiller(原创) public override object Key{get{return this.key;}} public override uint Degree{get{return this.degree;}} //public override uint Height{get{return this.height;}} public override bool IsEmpty()// prop