线性表
定义:线性表(List)是零个或多个数据元素的有限序列。
特性:
-
数据元素之间是有顺序的
-
数据元素个数是有限的
-
数据元素的类型必须相同
线性表的操作:
- 创建线性表
- 销毁线性表
- 清空线性表
- 将元素插入线性表
- 将元素从线性表中删除
- 获取线性表中某个位置的元素
- 获取线性表的长度
线性表的顺序存储结构
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
顺序线性表主要操作:
- 元素的插入
- 元素的删除
顺序线性表优缺点:
- 优点
- 无需为线性表中逻辑关系增加额外的空间
- 可以快速的获取表中合法位置的元素
- 缺点
- 插入和删除操作需要移动大量元素
- 当线性表长度变化较大时难以确定存储空间的容量
线性表的链式存储
为了表示每一个元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息
单链表:
-
线性表的链式存储结构中,每个节点中只包含一个指针域,这样的链表叫单链表。
-
通过每个节点的指针域将线性表的数据元素按其逻辑次序链接在一起
-
表头节点,链表中第一个节点,包含指向第一个数据元素的指针以及链表自身的一些信息
-
数据节点:链表中代表数据元素的节点,包含下一个数据元素的指针和数据元素的信息
-
尾节点:链表中最后一个数据节点,其下一元素的指针为空,表示无后继
链表链式存储结构基本操作:
-
插入操作
node->next = current->next;
current->next = node;
-
删除操作
current->next=ret->next
示例:
带头结点、位置从 0 开始的单链表,返回链表中第 3 个位置处,元素的值
LinkListNode* LinkList_Get(LinkList* list,int pos)
{
int i = 0;
TLinkList *tList = (TLinkList *)list;
LinkListNode *current = NULL;
LinkListNode *ret = NULL;
if (list==NULL||pos<0||pos>tList->length)
{
return NULL;
}
current = (LinkListNode *)tList;
for (int i=0;i<pos;i++)
{
current = current->next;
}
ret = current->next;
return ret;
}
程序执行完毕后, 当前指针指向位置 2,所以需要返回 ret = current->next;
链表链式存储结构的优缺点:
-
优点:
-
无需一次性定制链表的容量
-
插入和删除操作无需移动数据元素
-
-
缺点:
- 数据元素必须保存后继元素的位置信息
- 获取指定数据的元素操作需要顺序访问之前的元素
链表的推演
typedef struct _tag_LinkListNode LinkListNode;
// 节点指针域指针
struct _tag_LinkListNode
{
LinkListNode* next;
};
// 定义头结点
typedef struct _tag_LinkList
{
LinkListNode header;
int length;
}
// 数据元素定义示例
struct Value
{
LinkListNode node;
int v;
}