第二章
线性表
什么是线性表?
具有相同数据类型的数据元素的有限序列;
顺序表
即线性表按顺序存储,每个元素逻辑上相邻,物理上也相邻,并且地址连续,常用数组存储。
存储类型可描述为:
typedef struct
{
ElementType data[ArraySize]; //存储的数据,也可用指针
int length; //数组长度
}OrderTable;
支持随机访问,时间复杂度O(1),而删除、插入则需移动大量的元素。
链表
即线性表按链式存储,与顺序表相反,逻辑相邻物理并不一定相邻,只支持顺序查找,而且删除、插入只需修改节点指针即可不需移动元素。单列表节点描述如下:
typedef struct {
ElementType data; //存数据
struct *next; //指向下一个元素
}LinkTable;
单列表可分为有头结点和无头结点两种,对于带头结点的单列表,操作时需 s = L->next,即s指向头结点下一个节点(首节点,头结点不存储元素);而不带头结点的单列表操作时只需s=L。
单列表的插入包括头插法与尾插法,所谓头插法即为新节点从头部插入(带头结点:s = L->next, L->next = s; 不带头结点:s=L;L=s;)。
尾插法即为节点从尾部插入(tail->next = s;s->next = NULL;),每次插入新节点均需找到尾结点,较头插法麻烦。
双链表
与单链表类似,仅多了一个指向前驱节点的指针域,如此做的目的是便于找前驱节点而不用再次遍历链表,结构体描述如下:
typedef struct
{
ElementType data;
struct *front,*next;
}Node;
插入、删除与单链表类似,不做赘述;
静态链表
与顺序表相似,需要分配连续存储空间,删除插入与动态链表相似;结构体描述如下:
typedef struct
{
ElementType data;//存储的数据
int next; //下一个元素的地址
}StaticTable[TableSize];
操作如 StaticTable[1].data = value; StaticTable[1].next = c; c为下一个元素地址,结构如何自行脑补