数组 广义表

  一、数组,为n(>0)个元素的,有穷序列,记作A = (a1,a2,...,an),a(n>=i>=1) 或者为相同数据类型的原子项,或者为相同定义的数组Bi;ai为原子项时,数组的维度为1,为数组Bi时,数组的维度为ai的维度+1;

  1、数组的顺序存储,按行优先存储,按列优先存储;

低维下标大小升序排列存放,按行优先存储

 高维下标到低维下标升序排列,按列优先存储

  2、

  二、广义表,是由n(>=0)个元素,组成的有穷序列,记作,LS = (d1,d2,...,dn), di或是原子或是子广义表,d1为表头(head),剩余元素构成的子表 (d2,...dn)为表尾(tail)

  1、广义表特点

  1)、为递归结构;

  (2)、数据元素宏观上为线性关系,微观上体现出复杂的多维关系;

  2、广义表的存储结构

  广义表,LS = (d1,d2,...dn),中的数据元素di或是原子或是子广义表,具有不同的结构,很难用顺序存储表示,通常采取链式存储来表示

  (1)、头尾链表存储结构;

  表GList,是由若干tag为LIST即1的数据元素,采取链式存储构成,每个数据元素的头尾指针,指向具体的数据(或为原子或为广义表

typedef enum{ATOM, LIST} ElemTag; /* 标记类型 */
typedef struct GLNode{
    ElemTag tag;   /* 数据元素类型 标记 */
    union{
        AtomType atom; /* 原子, 数据元素 */
        struct{
            struct GLNode *hp; /* head pointer */
            struct GLNode *tp; /* tail pointer */
        }htp;         /* 广义表(头尾指针), 数据元素 */
    }atom_htp; /* 联合体(原子、广义表) */
}GLNode, *GList; /* 定义广义表及广义表指针数据类型 */

  (2)、扩展线性链表存储结构;

  表GList至少有一个结点(空表时),每个结点由原子或一个表尾指针构成,当tag为0时,结点存储原子,尾指针指向尾元素,当tag为1时,结点存储广义表指针,尾指针指向尾元素;

typedef enum{ATOM, LIST} ElemTag; /* 标记类型 */
typedef struct GLNode{
    ElemTag tag;   /* 数据元素类型标记 */
    union{
        AtomType atom; /* 原子,数据元素 */        
        struct GLNode *hp; /* head pointer */        
    }atom_htp; /* 联合体(原子、广义表) */
    struct GLNode *tp; /* tail pointer */    
}GLNode, *GList; /* 定义广义表及广义表指针数据类型 */
原文地址:https://www.cnblogs.com/GoldenEllipsis/p/12735948.html