线性表《二》


广义表:

1,广义表是线性表的推广

2,对于线性表而言,n个元素都是基本的单元素;

3,广义表中,这些元素不仅可以是单元素也可以是另一个广义表

typedef struct GNode *GList;
struct GNode{
    int Tag;     /*标志域:0表示结点是单元素,1表示结点是广义表*/
    union{      /*子表指针域Sublist与单元素数据域Data复用,即共用存储空间*/
    ElementType  Data;
    GList SubList;
    }URegion;
    GList Next;          /*指向后继结点*/
};
   
Tag

Data

or

SubList 

 Nest

多重链表:链表中的节点可能同时隶属于多个链

1,多重链表中结点的指针域会有多个,如前面例子包含了Next和SubList两个指针域;

2,但包含两个指针域的链表并不一定是多重链表,比如在双向链表不是多重链表

多重链表有广泛的用途:

基本上如树、图这样相对复杂的数据结构都可以采用多重链表的方式实现存储。

【例】矩阵可以用二维数组表示,但二维数组表示有两个缺陷:

*一是数组的大小需要事先确定。

*对于“稀疏矩阵”,将造成大量的存储空间浪费。

采用一种典型的多重链表——十字链表来存储稀疏矩阵

#只存储矩阵非0元素项

结点的数据域:行坐标Row、列坐标Col、数值Value

#每个结点通过两个指针域,把同行、同列串起来;

行指针(或称为向右指针)Right

列指针(或称为向下指针)Down

用一个标识域Tag来区分头节点和非0元素节点:

头节点的标识值为“Head",矩阵非0元素结点的标识值为”Term".

堆栈:

中缀表达式

后缀表达式

堆栈:具有一定操作约束的线性表

只在一端(栈顶,Top)做插入、删除

插入数据:入栈(Push)

删除数据:出栈(Pop)

后入先出:LIst  In First Out (LIFO)

堆栈的抽象数据类型描述