数据结构(初阶)(二)----顺序表

顺序表

概念与结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储。

顺序表实现

头文件

c 复制代码
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int SLTDataType;
typedef struct SeqList 
{
	SLTDataType* arr;
	int size;
	int capacity;
}SLT;

//初始化
void SLTInit(SLT* slt);

//判断空间大小,如果不够增容
void SLTCheckCapacity(SLT* ps);

//尾插
void SLTPushBack(SLT* ps,SLTDataType x);

//打印顺序表
void SLTPrint(SLT* ps);

//头插
void SLTPushFront(SLT* ps, SLTDataType x);

//尾删
void SLTPopBack(SLT* ps);

//头删
void SLTPopFront(SLT* ps);

//查找元素,返回对应位置下标,没有返回-1
int SLTFind(SLT* ps, SLTDataType x);

//指定位置之前插入数据
void SLTInsert(SLT* ps, int pos, SLTDataType x);

//删除指定位置元素
void SLTErase(SLT* ps, int pos);

//销毁顺序表
void SLTDestory(SLT* ps);

创建与初始化

c 复制代码
#define _CRT_SECURE_NO_WARNINGS

#include"SeqList.h"

//初始化
void SLTInit(SLT* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

尾插

在插入之前我们需要先判断顺序表的空间大小是否足够,如果不够就需要对原有空间增容,判断依据是size == capacity,如果等式成立,那么空间就满了,需要增容。

增容,一般是成倍的增加,这里我们使用2倍的增容。

判断空间大小
c 复制代码
//判断空间大小,如果不够增容
void SLTCheckCapacity(SLT* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		//注意在初始状态下,空间大小为0,需要判断给定初始空间
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		//扩容有可能失败,需要创建新的指针来接收,成功后再赋给原数组
		SLTDataType* tmp = (SLTDataType*)realloc(ps->arr, newCapacity * sizeof(SLTDataType));
		if (tmp == NULL)
		{
			perrpr("SLTCheckCapacity()::realloc fail");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
}
c 复制代码
//尾插
void SLTPushBack(SLT* ps,SLTDataType x)
{
	assert(ps);
    SLTCheckCapacity(ps);
	ps->arr[ps->size++] = x;
}

头插

c 复制代码
//头插
void SLTPushFront(SLT* ps, SLTDataType x)
{
	assert(ps);
	SLTCheckCapacity(ps);
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[0] = x;
	++ps->size;
}

尾删

时间复杂度为O(1)

c 复制代码
//尾删
void SLTPopBack(SLT* ps)
{
	//顺序表不为空,且有效数据个数不为0
	assert(ps && ps->size);
	--ps->size;
}

头删

时间复杂度O(n)

c 复制代码
//头删
void SLTPopFront(SLT* ps)
{
	//顺序表不为空,且有效数据个数不为0
	assert(ps && ps->size);
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	--ps->size;
}

查找

c 复制代码
//查找元素,返回对应位置下标,没有返回-1
int SLTFind(SLT* ps, SLTDataType x)
{
	assert(ps);
	if (ps->size == 0)
	{
		return -1;
	}

	for(int i = 0;i < ps->size;i++)
	{
		if (ps->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}

指定位置之前插入数据

c 复制代码
//指定位置之前插入数据
void SLTInsert(SLT* ps, int pos, SLTDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	for (int i = ps->size; i > pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	++ps->size;
}

指定位置删除数据

c 复制代码
//删除指定位置元素
void SLTErase(SLT* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	--ps->size;
}

销毁(回收)

c 复制代码
//销毁顺序表
void SLTDestory(SLT* ps)
{
	assert(ps);
	if (ps->arr)
		free(ps->arr);
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

测试文件

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"

void test1()
{
	SLT slt;
	SLTInit(&slt);

	//尾插
	SLTPushBack(&slt,1);
	SLTPushBack(&slt,2);
	SLTPushBack(&slt,3);
	SLTPushBack(&slt,4);
	SLTPushBack(&slt,5);

	头插
	//SLTPushFront(&slt, 11);
	//SLTPushFront(&slt, 12);
	//SLTPushFront(&slt, 13);
	//SLTPushFront(&slt, 14);


	///尾删
	//SLTPopBack(&slt);
	//SLTPopBack(&slt);

	//头删
	//SLTPopFront(&slt);
	//SLTPopFront(&slt);

	//打印顺序表
	SLTPrint(&slt);

	//查找元素,返回对应位置下标,没有返回-1
	int ret = SLTFind(&slt, 12);
	printf("%d\n", ret);

	指定位置之前插入数据
	//SLTInsert(&slt, ret, 21);
	//SLTInsert(&slt, ret, 22);

	//删除指定位置元素
	SLTErase(&slt, ret);
	SLTErase(&slt, ret);

	//打印顺序表
	SLTPrint(&slt);

	销毁顺序表
	//SLTDestory(&slt);
}

int main()
{
	test1();
	
	return 0;
}
相关推荐
zhengzhouliuhaha5 小时前
智能医疗设备控费系统:以全院一体化管控,筑牢医疗资源“安全阀”
大数据·数据结构·人工智能·算法·安全·机器学习·软件需求
June`5 小时前
CUDA程序效率如何计算以及工具如何使用
算法·cuda
兰令水5 小时前
leecodecode【树形DP】【2026.6.11打卡-java版本】
java·算法·深度优先
装不满的克莱因瓶5 小时前
RLHF中的PPO算法——大语言模型对齐优化的核心引擎
人工智能·python·深度学习·算法·机器学习·语言模型·自然语言处理
hahjee5 小时前
【鸿蒙PC】kcp 移植:AtomCode Skills 4 步速通单文件 C 库适配
c语言·华为·harmonyos
SWAGGY..6 小时前
Linux系统编程:(十三)环境变量
java·linux·算法
Black蜡笔小新6 小时前
自动化AI算法训练服务器DLTM一体化训推平台构建企业专属AI能力中台
人工智能·算法·自动化
sjsjs116 小时前
力扣3558. 给边赋权值的方案数 I
算法·leetcode·职场和发展
hujinyuan201606 小时前
2025年12月中国电子学会青少年机器人技术等级考试试卷(四级) 真题+答案
算法·机器人
啦啦啦啦啦zzzz6 小时前
算法总结(双指针)
c++·算法·双指针