手写版概括(个人理解)
一、顺序表:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构 简单来说,就是用数组来储存数据,顺序表内部也是一个数组来存放数据,
在最开始给定数组的长度,然后依次向结构体内存入数据,用另一个变量来表示当前有效数据,也代表是最后一个数组的下标
// 顺序表的静态存储
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
SLDataType array[N]; // 定长数组
size_t size; // 有效数据的个数
}SeqList;
// 顺序表的动态存储
typedef struct SeqList
{
SLDataType* array; // 指向动态开辟的数组
size_t size ; // 有效数据个数
size_t capicity ; // 容量空间的大小
}SeqList;
以及动态储存的方法,不给定数组长度,改用指针来标记数据存储位置,来实现在物理位置上的顺序存储,我们知道数组本身也是指针,array[N]中array是指向数组第一个元素的指针,array[n] = array+n,所以一开始创建一个指针*array,用array+size就可以表示size下标的地址。
二、链表
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 简单来说链表的每一个数据地址都有自己的地址,跟上一个数据的地址不连续。
和顺序表来作比较的话“顺序表中每一个数据住的是楼房,每一个数据住一层楼,他跟上一个数据只有一层之隔。链表中的数据住的是独栋别墅,他个上一个数据可能隔了一个街区”
链表的结构体,在每个结构体都有一个data来储存数据,用一个自身结构体的指针 *next来指向下一给结点,而每一个结构体都是一个结点
单链表
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType _data;
struct SListNode* _next;
}SListNode;
//也可以把结点封装成一个结构体
typedef struct SList
{
SListNode* _head;
}SList;
链表中一个重要的操作,便是结点在链表中的插入,以下用图介绍
newnode->next = node->next;
node->next = newnode;
单链表的缺点也显现出来了,如果我此时的node指针以及走到第3个数据了,那他有没有办法再回到上一个结点,所以才有了双链表
双链表
顾名思义,就是由两条“链”,也就是说,每个结点的前后都能链接一个结点,所以从当前结点返回到上一个结点或是到下一个结点都方便的多。
typedef int LTDataType;
typedef struct ListNode
{
LTDataType _data;
struct ListNode* _next;
struct ListNode* _prev;
}ListNode;
typedef struct List
{
ListNode* _head;
}List;
这里存在的一些关系:
node->prev = NULL;
node->next = node2->prev;
node->next->data = node2->data;
node4->next = NULL;
node->next和node->prev是指针,得到的是地址,只有node->next->datac才能得到下一个结点对应的值
而双链表的插入就相对麻烦的多。
newnode->next = node->next;
newnode->prev = node;
node->next->prev = newnode;
node->next = newnode;
三、栈
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
可以理解为栈只能在一个口进出
数据保持先进后出的原则;先进来的数据被压至栈底(压栈),数据出栈的是最后一个被压栈的栈顶元素。
栈可以用顺序表或链表实现。
typedef int STDataType;
#define N 10
typedef struct Stack
{
STDataType _a[N];
int _top; // 栈顶
}Stack;
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
实际上是和顺序表一样的结构。
四、队列
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头
简单想象为,去食堂排队打饭,新来的人只能从队尾进入,不能插队,只有队首的人打完饭走了,后面的人才能前进,所以“先到先得”。
typedef int QUDataType;
typedef struct QueueNode
{
struct QueueNode* _next;
QUDataType _data;
}QueueNode;
typedef struct Queue
{
QueueNode* _front; // 队头
QueueNode* _rear; // 队尾
}Queue;
和单链表的实现一样