最近在进行考研数据结构的二轮复习,想写一些比较重要的数据结构内容笔记,首先是线性表的学习笔记。
一、线性表的基本概念与实现
线性表的定义
- 线性表是具有相同特性数据元素的一个有限集合。序列中所含元素的个数叫做线性表的长度,一般用
n (n>=0)
来表示(n=0时表示线性表是一个空表)。
线性表的逻辑特性
- 只有一个表头元素;只有一个表尾元素;除表头元素外,其他元素都有且只有一个直接前驱;除表尾元素外,其他元素都有且仅有一个直接后继。
线性表的存储结构
- 在数据结构中,线性表的存储结构有顺序结构和链式结构两种。
- 两种存储结构的介绍:
- 顺序存储结构: 把线性表中的所有元素按照其逻辑顺序,依次存储到从指定存储位置开始的一块连续的存储空间中。
- 链式存储结构:在链式存储结构中,每个结点不仅包含所存元素的信息,还包含元素之间逻辑关系的信息。
- 链式存储结构包含5种形式:单链表,双链表,循环单链表,循环双链表,静态链表。
- 顺序表和链表的比较
- 基于空间的比较:
(1)存储空间的分配方式:顺序表的存储空间是一次性分配,链表的存储空间是多次分配。
(2)存储密度:顺序表的存储密度=1;链表的存储密度<1. - 基于时间的比较:
(1)存取方式:顺序表可以随机存取,也可以顺序存取;链表只能顺序存取(顺序存取,以读取为例,表示要读取某个元素之前必须遍历其之前的所有元素才能找到它并读取)。
(2)插入/删除时需要移动的元素个数:顺序表平均需要移动近一半的元素((n-1)/2个
);链表不需要移动元素,只需要修改指针。
- 基于空间的比较:
二、线性表的结构体定义
(一)顺序表的结构体定义
#define maxSize 100 // 定义一个整形常量,用于表示顺序表容量的最大值
typedef struct{
int data[maxSize]; // 存放顺序表元素的数组
int length; // 存放顺序表的长度
}Sqlist; // 顺序表类型定义
但在考试过程中使用顺序表时,一般使用以下简便定义:
int Sqlist[maxSize];
int length;
(二)单链表的结构体定义
typedef struct LNode{
int data; // data是存放节点的数据域
struct LNode *next; // 指向后继结点的指针
}LNode; // 定义单链表节点类型
(三)双链表的结构体定义
typedef struct DLNode{
int data; // data是存放节点的数据域
struct DLNode *prior; // 指向前驱结点的指针
struct DLNode *next; // 指向后继结点的指针
}DLNode;
(四)C内存空间分配语句
LNode *A = (LNode*)malloc(sizeof(LNode)); // 分配一个单链表节点的空间