目录
从本节开始, 复习数据结构。 空间复杂度还有时间复杂度之后利用例题学习。 这节先学习顺序表的增删查改。
首先, 顺序表有点类似于数组, 都是一块连续的内存空间。 如图:
这就是顺序表。
顺序表又分固态的顺序表和动态的顺序表。 但是固态的顺序表实用性不大,在实际生活中我们很难把握数据的数量。 固态的顺序表可能导致开辟的空间过大或者过小, 所以动态的顺序表就是我们的首选。
现在我们主要以动态的顺序表为例, 学习一下顺序表的增删查改。
本节实现的函数接口如下:
//申请一个节点函数接口
SListNode* BuySListNode(SLTDataType x);
//链表打印函数接口
void SListPrint(SListNode* phead);
//链表尾插函数接口
void SListPushBack(SListNode** pphead, SLTDataType x);
//链表头插函数接口
void SListPushFront(SListNode** pphead, SLTDataType x);
//单链表的尾删函数接口
void SListPopBack(SListNode** pphead);
//单链表的头删函数接口
void SListPopFront(SListNode** pphead);
//单链表查找函数接口
SListNode* SListFind(SListNode* phead, SLTDataType x);
//单链表在pos位置之后插入数据函数接口
void SListInsertAfter(SListNode* pos, SLTDataType x);
//单链表在pos的位置之后删除数据函数接口
void SListEraseAfter(SListNode* pos);
//单链表在pos之前的的位置插入数据函数接口
void SLTInsert(SListNode** pphead, SListNode* pos, SLTDataType x);
//单链表在pos之前的位置删除数据函数接口
void SLTErase(SListNode** pphead, SListNode* pos);
准备文件
先准备好三个文件
两个.c文件
一个.h文件
创建顺序表蓝图
在.h文件中创建顺序表结构体, 函数声明等。
首先包含一下头文件和要保存的数据进行typedef一下, 将要保存的数据类型typedef的意义是方便后续代码的维护, 后续使用该类型时一律使用SQDataType。
然后创建结构体
typedef int SQDataType;
typedef struct SeqList
{
SQDataType* data;
int size;
int capacity;
}SQL;
如图:
动态的顺序表要用到动态内存分配, 用一个指针也就是data指向动态开辟的空间。因为要保存的数据类型是SQDataType 所以指针的类型是SQDataType, size是目前保存的数据的个数, capacity是顺序表的总容量。
创建完是这样的。
顺序表初始化函数接口
在.h文件中声明函数接口
.c中实现初始化函数:
这里我初始化设置了10个数据的空间, 也可以不开辟空间,直接让ps->data = NULL, 也就是指向空。
这里我已初始化设置10个空间为例。
顺序表的销毁函数接口
既然有初始化开辟10个空间, 就得有销毁顺序表函数接口。 不然会出现内存泄漏。
.h声明:
.c接口实现:
释放ps->data指向的空间, 然后置为空, 顺序表的数据大小size也置位0, capacity顺序表容量同样变成0.
顺序表的打印函数接口
在实现顺序表的插入操作前, 先实现打印, 方便后续我们检查顺序表写的是否正确。
.h接口声明
.c接口实现:
顺序表的插入函数接口
顺序表的插入函数接口分为:头插, 尾插, 任意位置插入。
头插就是在顺序表的第一个位置进行插入。
尾插是在顺序表所有数据接下来的位置插入。
任意位置则是在顺序表的任意一个位置插入, 这时分两种情况。
第一种情况在最后一个数据之前插入:
第二种情况是在最后一个数据之后插入。 这个时候无论这个位置多大, 都是挨着最后一个数据插入。
同时, 尾插和头插是可以通过调用任意位置插入实现。为什么这么说?
我在这里先写一下任意位置插入的函数接口声明
.h声明:
我如果调用该函数时,pos形参传的时ps->size. 那么就是尾插, 传0就是头插
所以只要我们写个任意位置插入, 尾插头插进行对他进行复用就行。
.c函数接口实现
现在我们来检查一下我们是否写对了。这里用到了我们写的打印函数。
ok, 没问题,继续往下走。
现在写头插和尾插就容易了。
.h函数声明
.c函数实现:
顺序表的删除函数接口
顺序表删除函数接口, 和顺序表的插入函数接口一样, 我们如果写一个任意位置的删除函数接口, 然后复用, 就能很快的写出尾删和, 头删的函数接口。
任意位置的删除情况如下有两种情况。
情况1, 要删除的位置大于最后一个数据的位置, 删除的永远是最后一个位置。
情况二, 要删除的位置在数据的中间。
、
.h函数声明
.c函数的实现
现在来测试一下是否有错误:
ok, 没有错误, 其实到了这里就差不多了, 只剩下尾删和头删了。
.h声明:
.c文件函数接口实现