【数据结构-C】顺序表接口

顺序表的概念及结构

1.线性表(linearlist)是n个具有相同特性的数据元素的有限序列。

2.常见的线性表:顺序表、链表、栈、队列、字符串...

3.线性表在逻辑上是线性结构,但是在物理结构上并不⼀定是连续的

4.线性表在物理上存储时,通常以数组和链式结构的形式存储。

顺序表分类

###顺序表和数组的区别

顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

###顺序表分类

####静态顺序表---就是定长数组存储元素

c 复制代码
#define N 7
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType arr[N];//定长数组
	int size;//有效个数
}SL;

静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费

####动态顺序表---可增容

c 复制代码
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* arr;
	int size;//有效元素个数
	int capacity;//有效空间
}SL;

动态顺序表的接口实现

头文件:顺序表的结构+方法的声明

源文件:实现的方法 源文件里包含头文件

###初始化和销毁

c 复制代码
#include"SeqList.h"
//初始化和销毁 
void SLInit(SL* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}
void SLDestroy(SL* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

###扩容+尾插和头插

c 复制代码
//扩容 
void SLCheckCapacity(SL* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		//满了,扩容
		//扩容可能会失败,不要将一开始的结构直接接收扩容失败了就全没了,一定要创建临时变量
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		//申请成功
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
}
//尾插 凡是插入就一定要size++
//插入之前一定要保证有位置插入
void SLPushBack(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);//先判断够不够,在插
	ps->arr[ps->size++] = x;//先插入在++
}
//头插  只要是插入就要判断空间够不够,判断函数单独封装
void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);//先判断够不够,在插
	//后移
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]最后一步:0挪到1-->结束条件
	}
	ps->arr[0] = x;
	ps->size++;
}

###打印+尾删头删

c 复制代码
//打印
void SLPrint(SL ps)//打印不会改变顺序表,不用传地址
{
	//不是指针,用点号就访问了
	for (int i = 0; i < ps.size; i++)
	{
		printf("%d ", ps.arr[i]);
	}
	printf("\n");
}

//尾删
void SLPushBack(SL* ps, SLDataType x)
{
	assert(ps);
	assert(ps->size);//删除数据表不能为空
	ps->size--;
}

//头删
void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size);
	//前移
	for (int i = 0; i > ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]--->结束条件
	}
	ps->size--;
}

###指定位置之前插⼊/删除数据

c 复制代码
//指定位置之前插⼊
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos>=0&&pos<=ps->size);
	SLCheckCapacity(ps);
	//pos及pos之后的元素后移
	//size-1挪到size 处,所以i初始为size
	for (int i = ps->size; i>pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];//arr[pos+1]=arr[pos]
	}
	ps->arr[pos] = x;
	ps->size++;
}

//指定位置前删除数据
SLErase(SL* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	//删除直接覆盖就好
	for (int i = ps->size-1; i > pos; i--)
	{
		ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]
	}
	ps->size--;
}

###查找

c 复制代码
//查找
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;//找到了就返回下标
		}
		return -1;//没找到就返回无效下标,判断find是否>0就知道有没有这个数据了
	}
}
相关推荐
瑞雪兆丰年兮2 分钟前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
唐青枫1 小时前
C 语言 strcpy() 用法详解与实战 Demo
c语言
SomeOtherTime1 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔2 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆2 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
老师我太想进步了20262 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法
Hvitur3 小时前
Java - Lambda
java·开发语言·python
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J3 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
希望我万事顺遂3 小时前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode