广义表的有关知识点

概念:

广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP
语言的程序也表示为一系列的广义表。

定义:

广义表是n(n≥0)个元素a1,a2,…,ai,…,其中:
  ①ai--或者是原子或者是一个广义表。
  ②广义表通常记作:
Ls=( a1,a2,…,ai,…,an)。
  ③Ls是广义表的名字,n为它的长度。
  ④若ai是广义表,则称它为Ls的子表。

注意:
  ①广义表通常用圆括号括起来,用逗号分隔其中的元素。
  ②为了区分原子和广义表,书写时用大写字母表示广义表,用小写字母表示原子。
  ③若广义表Ls非空(n≥1),则a1是Ls的表头,其余元素组成的表(a2,a3,…,an)称为Ls的表尾。
  ④广义表是递归定义的an的有限序列。

广义表表示
(1)广义表常用表示
① E=()

  E是一个空表,其长度为0。

② L=(a,b)
  L是长度为2的广义表,它的两个元素都是原子,因此它是一个线性表

③ A=(x,L)=(x,(a,b))
  A是长度为2的广义表,第一个元素是原子x,第二个元素是子表L。

④ B=(A,y)=((x,(a,b)),y)
  B是长度为2的广义表,第一个元素是子表A,第二个元素是原子y。

⑤ C=(A,B)=((x,(a,b)),((x,(a,b)),y))
  C的长度为2,两个元素都是子表。

⑥ D=(a,D)=(a,(a,(a,(…))))
  D的长度为2,第一个元素是原子,第二个元素是D自身,展开后它是一个无限的广义表。

(2)广义表的深度
  一个表的"深度"是指表展开后所含括号的层数。
【例】表L、A、B、C的深度为分别为1、2、3、4,表D的深度为∞。

(3)带名字的广义表表示
如果规定任何表都是有名字的,为了既表明每个表的名字,又说明它的组成,则可以在每个表的前面冠以该表的名字,于是上例中的各表又可以写成:
①E()
②L(a,b)
③A(x,L(a,b))
④B(A(x,L(a,b)),y)
⑤C(A(x,l(a,b)),B(A(x,L(a,b)),y))
⑥D(a,D(a,D(…)))

广义表运算 

由于广义表是对线性表和树的推广,并且具有共享和递归特性的广义表可以和有向图(见第7章)建立对应,因此广义表的大部分运算与这些数据结构上的运算类似。

在此,只讨论广义表的两个特殊的基本运算:取表头head(Ls)和取表尾tail(Ls)。

根据表头、表尾的定义可知:

任何一个非空广义表的表头是表中第一个元素,它可以是原子,也可以是子表,而其表尾必定是子表。
【例】
  L(a,b)
  B(A(x,L(a,b)),y)

head(L)=a, tail(L)=(b)
head(B)=A, tail(B)=(y)
由于tail(L)是非空表,可继续分解得到:
head(tail(L))=b, tail(tail(L))=()
对非空表A和(y),也可继续分解。

注意:

广义表()和(())不同。前者是长度为0的空表,对其不能做求表头和表尾的运算;

而后者是长度为l的非空表(只不过该表中惟一的一个元素是空表),对其可进行分解,得到的表头和表尾均是空表()。

广义表的存储结构

头尾链表存储结构

typedef enum {ATOM, LIST} ElemTag; /* ATOM=0,表示原子;LIST=1,表示子表*/
typedef struct GLNode
{
    ElemTag tag; /*标志位tag用来区别原子结点和表结点*/
    union
    {
        AtomType atom; /*原子结点的值域atom*/
        struct { struct GLNode * hp, *tp;} htp; /*表结点的指针域htp, 包括表头指针域hp和表尾指针域tp*/
    } atom_htp; /* atom_htp 是原子结点的值域atom和表结点的指针域htp的联合体域*/
} *G

扩展线性存储

typedef enum {ATOM,LIST} ElemTag;
typedef struct GLNode
{
    ELemTag tag;
    union
    {
        AtomType atom;
        struct GLNode *hp;
    }
    struct GLNode *ht;
}*GList;

原文地址:https://www.cnblogs.com/schips/p/10658217.html

时间: 2024-08-06 04:20:23

广义表的有关知识点的相关文章

c++数据结构之广义表

最近学习了广义表,我们知道广义表也是一种线性表,而顾名思义广义表就是不止一个表,下面来举个栗子: A=( ) B=(1 , 2,3) C=(1 ,2 ,3, ( a , b ,c) ) D=(1, 2, 3, (a,( b,c),d),4) 以上A,B,C,D都是广义表,只不过深度不一样,也就是括号的对数不一样,A是个特殊的广义表,即空表.B里面有三个元素,C里面有6个元素,包括一个子表(a,b,c),C也同理,只不过多了一层子表.由此可总结为一句话:表里有表 这样看可能不太直观,下面以广义表C

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

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

数据结构与算法系列研究四——数组和广义表

稀疏矩阵的十字链表实现和转置 一.数组和广义表的定义 数组的定义1:一个 N 维数组是受 N 组线性关系约束的线性表.           二维数组的逻辑结构可形式地描述为:           2_ARRAY(D,R)              其中 D={aij} | i=0,1,...,b1-1; j=0,1,...,b2-1;aij∈D0}              R={Row,Col}              Row={<aij,ai,j+1>|0<=i<=b1-1;

广义表的实现

/*--------------------------------------------------------------------- 广义表的存储结构 ---------------------------------------------------------------------*/ #include<stdio.h> #include<stdlib.h> typedef char ElemType;//元素类型是字符型 //广义表的存储结构 struct GN

广义表的实现(法二)

#include<iostream> #include<string> using namespace std; enum elemTag {ATOM,LIST}; class GList; class GLnode { private: elemTag Tag; //标志是原子还是子表 0:原子 1:子表 union { char data; //原子结点值域 struct //表结点指针域 { GLnode *hp; GLnode *tp; }ptr; }; friend cl

广义表

其中包括广义表的创建.输出.拷贝构造.赋值运算符重载.析构.有效数据个数以及广义表深度 #pragma once #include<iostream> #include<assert.h> #include<ctype.h> using namespace std; enum Type {  HEAD, VALUE, SUB };//头结点.值.子表 struct GeneralizedNode {  Type _type;  //广义表结点类型  Generalize

数据结构之广义表

#include<stdio.h> //广义表的头尾链表存储结构 typedef int AtomType; typedef enum NodeType{ATOM,LIST}ElemTag;//ATOM表示原子结点,LIST表示表节点 typedef struct GLNode{ ElemTag tag; union{ AtomType atom; struct List{ struct GLNode* hp,*tp; } htp; }atom_htp; }GLNode,*GList; //求

数据结构——广义表

定义 Python中的list就是一种广义表,使用起来非常方便.广义表的特点就是能够存储不同类型的元素,也支持嵌套使用,即表中还有表.关于广义表的定义还有几本操作归纳如下: ADT Linear List: 元素组成: 能存储不同元素类型的表结构叫做广义表,支持嵌套操作. 基本操作: InitGList() 创建一个空表 DestoryGList() 销毁一个表 GListLength()  获取表的长度 GListDepth()  获取表的深度 PrintList() 遍历一次表 Insert

33. 蛤蟆的数据结构笔记之三十三广义表实现二

33. 蛤蟆的数据结构笔记之三十三广义表实现二 本篇名言:" 希望是附丽于存在的,有存在,便有希望,有希望,便是光明.--鲁迅" 我们继续来看下广义表的其他代码实现.代码均来自网络,解释来自蛤蟆,均亲测可行. 欢迎转载,转载请标明出处: 1.  广义表实现二 1.1         main 创建两个链表的指针head和L. 输入一个字符串,调用GLCreate函数创建广义表.显示,获取头表,尾表,输出长度,深度,原子个数,复制列表,Merge列表,遍历,比较广义表操作. 如下图1: