数据结构——数组&串

171 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天

数组

定义

类型相同的数据元素构成的有序集合,记作A=(a1,a2,…an)

特点

  1. 结构中的数据本身可以是具有某种结构的数据,但属于同一种数据类型(数组既可以用来存储不可再分的数据元素,也可以用来存储像顺序表、链表这样的数据结构)(是可再分的数据结构)
  2. 数组一旦被定义,它的维数和维界就不再改变
  3. 随机访问 数组支持随机访问,根据下标随机访问的时间复杂度为O(1);使用二分查找,时间复杂度也是O(logn)

类型定义

顺序存储

基本操作

查找 下标/二分

插入 数组头/中/尾

删除 数组头/中/尾

特殊矩阵的压缩存储

广义表(列表)

定义

线性表的推广,是一个递归定义

表元素可以是原子或者广义表的一种线性表的扩展结构

特点

  • 广义表的长度:为表中最上层元素的个数
  • 广义表的深度:为表中括号的最大层数
  • 表头和表尾:当广义表非空时,第一个元素为广义表的表头,其余元素组成的表是广义表的表尾

存储结构

由于广义表中既可存储原子(不可再分的数据元素),也可以存储子表,因此很难使用顺序存储结构表示,通常情况下广义表结构采用链表来实现

链式存储结构

tag标签分辨子表和原子

1.嵌套表示

 typedef struct Node {
     int tag;//标志域
     union {
         char atom;//原子结点的值域
         struct {
             struct Node* hp, * tp;
         }ptr;//子表结点的指针域,hp指向表头;tp指向表尾
     }un;
 }GLNode, * Glist;
 //子表则 ptr 结构体

(a,(b,c,d))

2.两部分

表示原子的节点构成由 tag 标记位、原子值和 tp 指针构成,表示子表的节点还是由 tag 标记位、hp 指针和 tp 指针构成

 typedef struct Node {
     int tag;//标志域
     union {
         int atom;//原子结点的值域
         struct Node* hp;//子表结点的指针域,hp指向表头
     }un;
     struct Node* tp;//这里的tp相当于链表的next指针,用于指向下一个数据元素
 }GLNode, * Glist;

\