目录
1.线性表
2.顺序表
3.链表
4.顺序表和链表的区别
1.线性表
线性表是一种在实际中广泛应用的数据结构,常见的线性表有顺序表、链表、栈、队列、字符串等......
线性表在逻辑上是线性结构,也就是说是连续的一条直线。但在物理结构上不一定连续,线性表在物理上存储时通常以数组和链式结构的形式存储。
2.顺序表
2.1概念及分类
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的元素、使得线性表中在逻辑结构上相邻的数据元素存储在物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。
根据数组位置不同,顺序表一般分为:
1.静态顺序表:使用定长数组存储元素
2.动态顺序表:使用动态开辟的数组存储
2.2动态顺序表的接口实现
顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开辟多了浪费,开辟少了不够用。所以现实中基本都是用动态顺序表,根据需要动态的分配空间大小。
顺序表的实现:
typedef int SLDataType;
//顺序表的动态存储
typedef struct SeqList
{
SLDataType* arr;指向动态开辟的数组
size_t size; //有效数据个数
size_t capacity;//容量空间大小
}SeqList;
//基本增删查改接口
//顺序表初始化
void SeqListInit(SeqList* ps);
//检查空间,如果满了,进行扩容
void CheckCapacity(SeqList* ps1);
//顺序表尾插
void SeqListPushBack(SeqList* ps1, SLDataType x);
//尾删
void SeqListPopBack(SeqList* ps1);
//头插
void SeqListPushFront(SeqList* ps1, SLDataType x);
//头删
void SeqListPopFront(SeqList* ps1);
//顺序表查找
void SeqListFind(SeqList* ps1, SLDataType x);
//在pos位置插入x
void SeqListInsert(SeqList* ps1, size_t pos, SLDataType x);
//删除pos位置的值
void SeqListErase(SeqList* ps1, size_t pos);
//顺序表销毁
void SeqListDestroy(SeqList* ps1);
//打印
void SeqListPrint(SeqList* ps1);
3.链表
3.1概念及结构
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
3.2分类
3.2.1单向或双向
3.2.2带头或不带头
3.2.3循环或非循环
虽然有很多链表的结构,但是实际中最长用的就两种:
1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
//无头、单向、非循环链表增删查改的实现
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;
}SListNode;
//动态申请一个节点
SListNode* BuySListNode(SLTDataType x);
//单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDataType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDataType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDataType x);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDataType x);
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);
4.顺序表和链表的区别