分节目录
数据结构(完结)
数据结构Part1 绪论与线性表
数据结构Part2 栈和队列
数据结构Part3 串
数据结构Part4 树与二叉树
数据结构Part5 图
数据结构Part6 查找
数据结构Part7 排序
第一章 绪论
1.基本概念:数据,数据元素,数据对象,数据类型(原子类型,结构类型,抽象数据类型),数据结构
2.数据结构三要素:逻辑结构(线性,非线性),存储结构(顺序存储,链式存储,索引存储,散列存储),数据的运算(算法)
3.算法特征:有穷性,确定性,可行性,输入,输出;算法目标:正确性,可读性,健壮性,效率与低存储量需求
4.效率度量:时间复杂度与空间复杂度
第二章 线性表
1. 线性表的定义与基本操作
1.1 概念
定义:由相同数据类型的有限序列。
表中元素具有:有限性,顺序性,单个元素,类型相同(所占空间大小相同),抽象性。
线性表是一种逻辑结构,顺序表与链表是指存储结构。
1.2 基本操作
// 基本操作
InitList(&L) //初始化表。构造一个空的线性表L,分配内存空间。
DestroyList(&L) //销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
ListInsert(&L,i,e) //插入操作。在表L中的第i个位置上插入指定元素e。
ListDelete(&L,i,&e) //删除操作。删除表L中第i个位置的元素,并用e返回删除元素。
LocateElem(L,e) //按值查找操作。在表L中查找具有给定关键字值的元素。
GetElem(L,i) //按位查找操作。获取表L中第i个位置的元素的值。
Length(L) //求表长。返回线性表L的长度,即L中数据元素的个数。
PrintList(L) //输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L) //判空操作。若L为空表,则返回true,否则返回false。
查->改/增/删,查的基本操作是表非空情况下的遍历。
2. 顺序表
2.1 概念
1.定义:线性表的顺序存储表示称为顺序表,表中元素的逻辑顺序与其物理顺序相同。
loc(A) + (i-1) * sizeof(ElemType)
2.静态分配的顺序表:静态数组,创建时固定表的大小。
3.动态分配的顺序表:动态数组,扩容时申请一篇更大的区域,复制过去。
2.2 操作
随机访问,存储密度高,适合查找,不适合增删;通常不可扩容,且扩容的代价大。
3. 链表
3.1 单链表
定义:线性表的链式存储表示称为单链表,分为带头节点和不带头节点两种。
操作:头插法,逆序建立链表;尾插法,需要增加一个尾指针,正向建立链表。判断链表为空的条件,链表遍历。
难点:指定节点a前插入b,可以在指定节点a后插入b,然后交换a,b节点的数据元素。
翻转单链表:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head) return head;
ListNode* pre = nullptr;
ListNode* p = head;
while (p) {
ListNode* temp = p->next;
p->next = pre;
pre = p;
p = temp;
}
return pre;
}
};
3.2 双链表
每个节点既有next指针,也有prior指针。
3.3 循环链表
最后一个节点的不指向NULL而是指向头节点。
if(L->next == L) //链表为空
if(p->next == L) //p为尾节点,用于遍历
循环单链表:只需定义一个尾指针指向尾部,可以快速的对头尾进行操作,可用于队列的实现。
循环双链表:prior与next都指向L。
3.4 静态链表
借助数组来描述线性表的链式存储结构
addr | data | next |
---|---|---|
0 | 2 | |
1 | b | 6 |
2 | a | 1 |
3 | d | -1 |
4 | ||
5 | ||
6 | c | 3 |
初始化:头节点->next=-1,其余节点->next=-2,next保存下一个节点的实际位置的序号,尾节点的next为-1。
应用:FAT表(文件分配表),不支持指针的高级语言