一、线性表基本概念
1、定义:线性表是具有相同特性数据元素的一个有限序列
- 相同特性:同一类实物归类、方便批量处理
- 有限:元素个数为n,n有限大,n可以为0
- 序列:表中元素排成一排,一对一的逻辑特性
2、逻辑结构
- 只有一个表头元素,只有一个表尾元素,表头元素无前驱,表尾元素无后继,除表头元素和表尾元素,其他元素只有一个直接前驱和一个直接后继。
3、存储结构(顺序/链式存储结构)
-
顺序表:线性表中所有元素按逻辑排序,存到连续的存储空间中
-
链表:每个结点有所存元素的信息(元素之间逻辑关系的信息)
4、两种存储结构的区别
-
顺序表:
随机访问特性;
占用连续存储空间;
存储分配预先进行,分配好则保持不变; -
链表:
不支持随机访问;
存储空间利用率较低(有指针);
存储空间动态分配(节省空间)。 -
从表整体:一般顺序表存储空间利用率低于链表;
从单个存储单元:顺序表存储空间利用率高于链表。
5、链表五种形式:单链表,双链表,循环单链表,循环双链表,静态链表。
-
单链表:结点(数据域、指针域)
头指针–指向链表中第一个结点
头结点–带头结点的链表中第一个结点
-
双链表:结点(数据域、两个指针域)
-
循环单链表:不会有空指针
-
循环双链表:不会有空指针
-
静态链表:结构体数组
一个结点:data和指针分量
二、线性表结构体定义
- 顺序表
#define MaxSize 50
typedef struct{
int data[MaxSize]; //存顺序表元素的数组
int length; //存顺序表的长度
}Sqlist;
- 单链表
typedef struct LNode
{
int data; //结点数据域
struct LNode*next; //指向后继结点的指针
}LNode;
- 双链表
//双链表定义
typedef struct DLNode
{
int data; //结点数据域
struct DLNode*prior; //指向前驱结点的指针
struct DLNode*next; //指向后继结点的指针
}DLNode;