一、线性表
1.线性表的存储结构
分类:
* 顺序存储结构——顺序表 * 链式存储结构——链表比较:
顺序表:
* 可以随机访问 * 占用连续空间,存储分配只能预先进行,即静态分配。一旦分配好了,在对其操作过程中不变 * 插入操作需要移动多个元素链表
* 不可以随机访问 * 不需要占用连续空间,动态分配。即在要创建新结点的时候再进行空间划分。 * 插入操作不需要移动多个元素 * 每个结点划一部分空间存储指向下一结点位置的指针,故存储空间利用率比顺序表稍低2.链表的5中形式
单链表
头结点可带、可不带。
不带头结点的,head指针则指向开始结点,当head为null时,链表为空。
带头结点的,head指针始终不为空。head -> next 为null时,链表为空。
头结点不存储信息,只是作为标记
双链表
双链表就是在单链表结点上增添了一个指针域,指向当前结点的前驱。这样就可以方便的由其后继来找到其前驱,而实现输出终端结点到开始结点的数据序列。
同样,双链表也分为带头结点的双链表和不带头结点的双链表,情况类似于单链表。带头结点的双链表 head->next 为null
的时候链表为空。不带头结点的双链表head为null的时候链表为空。循环单链表
只要将单链表的最后一个指针域(空指针)指向链表中第一个结点即可(这里之所以说第一个结点而不说是头结点是因为,如果循环单链表是带头结点的则最后一个结点的指针域要指向头结点;如果循环单链表不带头结点,则最后一个指针域要指向开始结点)。
带头结点的循环单链表当head等于head->next时链表为空;
不带头结点的循环单链表当head等于null时链表为空。循环双链表
循环双链表的构造源自双链表,即将终端结点的nnext指针指向链表中第一个结点,将链表中第一个结点的prior指针指向终端结点。
带头结点的循环双链表当head->next和heaad->prior两个指针都等于head时链表为空。
不带头结点的循环双链表当head等于null的时候为空。静态链表
这种链表借助一维数组来表示,例如:
线性表的基本操作
线性表的定义
#define MAX 100 //这里定义一个整型常量MAX,值为100###线性表的定义#define MAX 1001. 顺序表的结构定义typedef struct{ int data[MAX]; //存放顺序表元素的数组(默认是int型,可根据题目要求将int换成其他类型)。存放顺序表的长度。 int length; //存放顺序表的长度。} Sqlist; //顺序表类型的定义。
单链表结点定义
typedef struct LNode{ int data; //data中存放结点数据域(默认是int型)。 struct LNode *next; //指向后继结点的指针。}LNode;//定义单链表结点类型。
双链表结点定义
typedef struct DLNode{ int data; //data中存放结点数据域(默认是int型) struct DLNode *prior; //指向后继结点的指针 struct DLNode *next; //指向前驱结点的指针}DLNode; //定义单链表结点类型