数据结构C语言——广义表

很久没有发博客记录了,不过应该也没人关心这个,哈哈哈。
突然想起来,学习也不能只是干学,稍微做点记录。
之前我对html、css、js基础有了一定的理解,也学了一些模板,不过现在我想先把计算机基础给补上,所以把数据结构理一理!
近在学习数据结构C语言版,有一些心得,跟大家分享一下
可能会有很多比较基础的知识,大佬勿喷!
ok,我现在在学习广义表的结构,前边学的其他存储结构我后边会再整理一下。下边是我对广义表的一些理解,大家可以适当的参考一下,如果方便的话,也麻烦帮我指出不足之处,给我这个想要继续往上的学习者一点反馈!

数据结构C语言——广义表

广义表(Generalized List)
下边我就一般用L表示广义表
基本定义我就不多写了,网上已经有很多了,大家可以上网自行搜索
一、基本概念
L=(a1,a2,a3,……);
a1可以是不可再分的元素,就是原子;也可以是可以再分的子表;

L1=(a1,a2,a3,a4,a5,a6);

  1. 表头:对于非空的广义表,第一个元素就是表头元素,就像上边的a1,就是广义表L1的表头元素;
  2. 表尾:对于L1来说,表尾元素就是除了a1外的全部元素组成的元素序列(a2,a3,a4,a5,a6),是L1的一个子表;
  3. 长度:就是广义表的元素个数,L1长度为6;
  4. 深度:广义表里嵌套的最大层数,简单来说就是所有原子元素套的括号层数最多的,那个层数就是这里所说的深度;

二、实现
1、准备工作
把那些数字用一些有含义的符号表示可读性好点

#include<stdio.h>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef char AtomType;

2、广义表的定义

typedef enum{
   
	ATOM,LIST
	//这个相当于是一个集合,ElemTag类型的元素可以等于这两个属性
}ElemTag;
typedef struct GLNode{
   
	ElemTag tag;//区分原子结点、表结点
	union{
   
		AtomType atom;//tag==ATOM时,atom存放原子结点值
		struct{
   //tag==LIST时,表示是子表
			struct GLNode *hp;
			struct GLNode *tp;
		}ptr;//表结点的指针域,ptr.hp指向表头,ptr.tp指向表尾
	}un;
}GLNode,*GList;//广义表

3、函数声明

void InitGList(GList &L);//创建一个原子结点e
void CreatGList(GList &c,char ch);//创建一个长度为2的广义表,表头是原子结点,值为ch
GLNode *MakeAtom(AtomType e);//创建原子结点
Status GListEmpty(GList L);//判断广义表L是否为空
Status InsertHead(GList &L,GLNode *p);//在广义表L的表头插入p元素
int GListLength(GList L);//求广义表L的长度
Status InsertTail(GList &L,GLNode *p);//在广义表L的表尾添加新的结点
int CopyGList(GList &T,GList L);//由广义表L复制得到广义表T
GLNode *GetHead(GList L);//获取广义表L的表头
GLNode *GetTail(GList L);//获取广义表L的表尾(第一层的尾结点)
GLNode *GetTail1(GList L);//获取广义表L的表尾(最底层的尾结点)
Status DeleteHead(GList &L,GList &p);//删除一个广义表L的表头,把删除的表头保存在p中
int GListDepth(GList L);//求广义表L的深度
void visit(AtomType e);//遍历函数
Status GListTraverse(GList &L,void(*visit)(AtomType e));//广义表的遍历

4、创建一个空的广义表

void InitGList(GList &L){
   
	L = NULL;
}

5、创建一个长度为2的广义表,表头是原子结点,值为ch,表尾是一个空的子表
很笨的一个方法,应该还有更简便的,我再试试看

void CreatGList(GList &c,char ch){
   
	c=(GList)malloc(sizeof(GList));
    c->tag=LIST;
 
    c->un.ptr.hp=(GList)malloc(
  • 64
    点赞
  • 278
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值