😾 博客主页: 爱吃bug的猿
😼博客专栏: 数据结构,C语言初阶进阶全流程讲解
✨ 每日激励:欲达高峰,必忍其痛;欲戴王冠,必承其重✨
😽😽😽如果喜欢博主的文章,可以给博主点波赞和关注加速博主更新
文章目录
😾 将顺序表这个工程分为3部分
😾😾函数的声明
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDatatype;
typedef struct SL
{
SLDatatype* p;
int size;
int capacity;
}SL;
void SLInit(SL* sl);
void SLDestory(SL* sl);
void SLcheckCapacity(SL* sl);
void SLPushBack(SL* sl, SLDatatype x);
void SLPrint(SL* sl);
void SLPopBack(SL* sl);
void SLPushFront(SL* sl, SLDatatype x);
void SLPopFront(SL* sl);
void SLIsert(SL* sl, int pos, SLDatatype x);
void SLErase(SL*sl,int pos);
int SLFind(SL* sl, SLDatatype x);
int SLModi
😾😾函数的实现(配合画图更容易理解哦)
- 在函数的测试里边创建了一个结构体SL sl = { 0 };
- 传入函数时,&sl传入函数,pos代表下标,x代表穿过一个整形数据
😾😾😾 顺序表的初始化
//顺序表的初始化
void SLInit(SL* sl)
{
sl->p = (SLDatatype*)malloc(sizeof(SLDatatype) * 4);
sl->size = 0;
sl->capacity = 4;
}
- 为了方便多种类型的初始化,在函数的声明中,将int重命名为SLDatatype
😾😾😾顺序表的销毁
void SLDestory(SL* sl)
{
free(sl->p);
sl->p = NULL;
sl->size = 0;
sl->capacity = 0;
}
- 结构体中的p如果出了函数还存在的话,可能会被访问到,所以置为NULL
😾😾😾顺序表的检查容量
//顺序表的检查容量
void SLcheckCapacity(SL* sl)
{
if (sl->size == sl->capacity)
{
SLDatatype* tmp = (SLDatatype*)realloc(sl->p,sizeof(SLDatatype) * sl->capacity * 2);
if (tmp == NULL)
{
return;
}
sl->p = tmp;
sl->capacity *= 2;
}
}
- 每次满了之后扩容扩2倍
😾😾😾顺序表的尾插
void SLPushBack(SL* sl, SLDatatype x)
{
SLIsert(sl, sl->size, x);
//SLcheckCapacity(sl);
//sl->p[sl->size] = x;
//sl->size++;
}
- 这里使用了两种方式,一种是已经注释的代码的尾插,一种是利用顺序表的任意下标插入,下面会讲到
- 此处说明顺序表的任意下标插入对顺序表的尾插可以进行复用
😾😾😾顺序表的的尾删
//顺序表的的尾删
void SLPopBack(SL* sl)
{
/*assert(sl->size > 0);
sl->size--;*/
SLErase(sl, sl->size - 1);
}
- 此处说明顺序表的任意下标删除对顺序表的尾删可以进行复用
😾😾😾顺序表的头插
void SLPushFront(SL* sl, SLDatatype x)
{
/*SLcheckCapacity(sl);
int end = sl->size - 1;
while (end >= 0)
{
sl->p[end + 1] = sl->p[end];
end--;
}
sl->p[0] = x;
sl->size++;*/
- 此处说明顺序表的任意下标插入对顺序表的头插可以进行复用
😾😾😾顺序表的头删
void SLPopFront(SL* sl)
{
/*assert(sl->size > 0);
int start = 0;
while (start < sl->size - 1)
{
sl->p[start + 1] = sl->p[start];
start++;
}
sl->size--;*/
SLErase(sl, 0);
}
- 此处说明顺序表的任意下标删除对顺序表的头删可以进行复用
😾😾😾顺序表的任意下标插入
void SLIsert(SL* sl, int pos, SLDatatype x)
{
assert(0 <= pos && pos <= sl->size);
SLcheckCapacity(sl);
int end = sl->size - 1;
while (end >= pos)
{
sl->p[end + 1] = sl->p[end];
end--;
}
sl->p[pos] = x;
sl->size++;
}
😾😾😾顺序表的任意下标删除
//顺序表的任意下标删除
void SLErase(SL* sl, int pos)
{
assert(0 <= pos && pos < sl->size);
while (pos < sl->size )
{
sl->p[pos - 1] = sl->p[pos];
pos++;
}
sl->size--;
}
😾😾😾顺序表的查找
//顺序表的查找
int SLFind(SL*sl, SLDatatype x)
{
int i = 0;
for (i = 0; i < sl->size; i++)
{
if (sl->p[i] == x)
{
return i;
}
}
return -1;
}
😾😾😾顺序表的修改
//顺序表的修改
void SLModify(SL* sl, int pos, SLDatatype x)
{
assert(0 <= pos && pos < sl->size);
sl->p[pos] = x;
}
😾😾 函数的测试
#define _CRT_SECURE_NO_WARNINGS 1
#include "seqlist.h"
//顺序表的增删查改
int main()
{
SL sl = { 0 };
//顺序表的初始化
SLInit(&sl);
//顺序表的尾插与尾删
//SLPushBack(&sl, 1);
//SLPushBack(&sl, 2);
//SLPushBack(&sl, 3);
//SLPushBack(&sl,4);
//SLPushBack(&sl, 1);
//SLPushBack(&sl, 1);
//SLPrint(&sl);
//SLPopBack(&sl);
//SLPopBack(&sl);
//SLPopBack(&sl);
/*SLPrint(&sl);*/
//顺序表的头插与头删
/*SLPushFront(&sl, 1);
SLPushFront(&sl, 2);
SLPushFront(&sl, 3);
SLPushFront(&sl, 1);
SLPushFront(&sl, 2);
SLPushFront(&sl, 3);
SLPrint(&sl);
SLPopFront(&sl);
SLPopBack(&sl);
SLPrint(&sl);*/
//顺序表的销毁
void SLDestory(SL * sl);
return 0;
}