分类:
* 顺序存储结构——顺序表
* 链式存储结构——链表数组
比较:spa
顺序表:
* 能够随机访问
* 占用连续空间,存储分配只能预先进行,即静态分配。一旦分配好了,在对其操做过程当中不变
* 插入操做须要移动多个元素3d
链表
* 不能够随机访问
* 不须要占用连续空间,动态分配。即在要建立新结点的时候再进行空间划分。
* 插入操做不须要移动多个元素
* 每一个结点划一部分空间存储指向下一结点位置的指针,故存储空间利用率比顺序表稍低指针
头结点可带、可不带。code
不带头结点的,head指针则指向开始结点,当head为null时,链表为空。blog
带头结点的,head指针始终不为空。head -> next 为null时,链表为空。ip
头结点不存储信息,只是做为标记io
双链表就是在单链表结点上增添了一个指针域,指向当前结点的前驱。这样就能够方便的由其后继来找到其前驱,而实现输出终端结点到开始结点的数据序列。class
一样,双链表也分为带头结点的双链表和不带头结点的双链表,状况相似于单链表。带头结点的双链表 head->next 为null
的时候链表为空。不带头结点的双链表head为null的时候链表为空。cli
只要将单链表的最后一个指针域(空指针)指向链表中第一个结点便可(这里之因此说第一个结点而不说是头结点是由于,若是循环单链表是带头结点的则最后一个结点的指针域要指向头结点;若是循环单链表不带头结点,则最后一个指针域要指向开始结点)。
带头结点的循环单链表当head等于head->next时链表为空;
不带头结点的循环单链表当head等于null时链表为空。
循环双链表的构造源自双链表,即将终端结点的nnext指针指向链表中第一个结点,将链表中第一个结点的prior指针指向终端结点。
带头结点的循环双链表当head->next和heaad->prior两个指针都等于head时链表为空。
不带头结点的循环双链表当head等于null的时候为空。
这种链表借助一维数组来表示,例如:
线性表的定义
#define MAX 100 //这里定义一个整型常量MAX,值为100 ###线性表的定义 #define MAX 100 1. 顺序表的结构定义 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; //定义单链表结点类型