-顺序表-

news2024/11/25 20:23:16

一、小概述

二、代码解析

下面利用顺序表实现增删改查的功能:

//动态顺序表
#include <iostream>
using namespace std;
typedef int SLDataType;//适用于多种类型
typedef struct SeqList
{
	SLDataType* a;//数组
	int size;//表示数组中存储了多少个元素
	int capacity;//表示数组实际能够储存的空间容量是多少
}SL;//SL为SeqList的别名

1)初始化顺序表

void SeqlistInit(SL* ps)//初始化,将数组置为空
{
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

2)尾插法

//尾差法
void SeqListPushBack(SL* ps,SLDataType x)
{
	//要先检查数组的容量与现所储存元素个数的匹配度
	//当capacity=size时
	if (ps->capacity == ps->size)
	{
		//利用三目运算符,判断数组原来的容量是否为空
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		//利用realloc函数进行扩容,形成新的数组
		//realloc(数组的地址,扩容空间的字节数)
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
		//验证是否扩容成功
		if (tmp == NULL)
		{
			cout << "realloc fail!" << endl;//扩容失败,异常退出
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	//进行尾插操作
	ps->a[ps->size] = x;
	ps->size++;
}

每写一步就要测试一步的代码!如:一下为初始化和尾差法的测试

编写打印函数来验证结果:

void SeqListPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		cout << ps->a[i]<<" ";
	}
	cout << endl;
}
void TestSeqList1()//测试函数,每写一个接口函数,就要进行一次测试
{
	SL sl;//定义一个结构体
	SeqListInit(&sl);//初始化操作
	cout << "尾插法测试:" << endl;
	SeqListPushBack(&sl, 1);//尾插法测试,capacity=4
	SeqListPushBack(&sl, 2);
	SeqListPushBack(&sl, 3);
	SeqListPushBack(&sl, 4);
	SeqListPushBack(&sl, 5);//capacity=8,size=5
	SeqListPrint(&sl);//1 2 3 4 5 
	cout << "---------------" << endl;
}

3)顺序表的销毁

//顺序表销毁
void SeqListDestory(SL* ps)
{
	//把空间还给系统,防止内存泄露
	free(ps->a);//free释放的是动态分配的内存空间,而不是清空内存中的数据
	//free后要自己清空a中的数据,如果没有清空就会造成内存泄露
	ps->a = NULL;
	ps->capacity = ps->size = 0;//滞空
}

4)尾删法

//尾删法(删除掉数组中的最后一个元素,直接size-1)
void SeqListPopBack(SL* ps)
{
	//法1:使用if循环语句,判断size是否大于0
	//法2:使用断言(简单粗暴)
	assert(ps->size > 0);//当size<=0时,直接终止程序,不再运行,提高效率
	ps->size--;
}

5)头插法

要先检查数组的容量

//检查数组的容量(要放在头插法的前面,否则编译器会找不到相对应的标识符)
void SeqListCheckCapacity(SL* ps)
{
	//重复尾插法的操作
	//空间已满/空间为0,进行扩容操作
	if (ps->capacity == ps->size)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			cout << "realloc fail!" << endl;
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
}
// 头插法
void SeqListPushFront(SL* ps, SLDataType x)
{
	//在挪动数据进行插入前,要先检查数组的容量!
	SeqListCheckCapacity(ps);//数组空间不够时,进行扩容操作
	//将数组中的元素依次向后挪动
	int end = ps->size - 1;//end表示数组中的最后一个元素
	while (end >= 0)
	{
		ps->a[end+1] = ps->a[end];
		end--;
	}
	//放入新插入的数据
	ps->a[0] = x;
	ps->size++;
}

6)头删法

// 头删法
void SeqListPopFront(SL* ps)
{
	//当数组中的元素个数>0时,将数组中的元素依次往前挪动
	assert(ps->size > 0);
	int begin = 1;//数组中的第二个元素,即要被删除元素的下一个元素
	while (begin<ps->size)
	{
		ps->a[begin-1] = ps->a[begin];
		begin++;
	}
	ps->size--;
}

7)查找

//查找
int SeqListFind(SL* ps, SLDataType x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}

8)在指定位置插入数据

// 在指定位置插入数据
void SeqListInsert(SL* ps,int pos,SLDataType x)
{
	//在插入数据前要先检查数组是否需要扩容!
	//断言
	assert(pos >= 0 && pos <= ps->size);
	SeqListCheckCapacity(ps);//检查数组的容量
	//插入新的数据
	int end = ps->size - 1;
	while (pos<=end)
	{
		ps->a[end+1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}

9)删除指定位置的数据

// 在指定位置删除数据
void SeqListErase(SL* ps,int pos)
{
	assert(pos >= 0 && pos <= ps->size);
	int begin = pos+1;
	//挪动数据
	while (begin<=ps->size)
	{
		ps->a[begin-1] = ps->a[begin];
		begin++;
	}
	ps->size--;
}

测试函数汇总

void TestSeqList1()//测试函数,每写一个接口函数,就要进行一次测试
{
	SL sl;//定义一个结构体
	SeqListInit(&sl);//初始化操作
	cout << "尾插法测试:" << endl;
	SeqListPushBack(&sl, 1);//尾插法测试,capacity=4
	SeqListPushBack(&sl, 2);
	SeqListPushBack(&sl, 3);
	SeqListPushBack(&sl, 4);
	SeqListPushBack(&sl, 5);//capacity=8,size=5
	SeqListPrint(&sl);
	cout << "---------------" << endl;
	cout << "头插法测试:" << endl;
	SeqListPushFront(&sl,1);//头插法测试
	SeqListPushFront(&sl,2);
	SeqListPushFront(&sl,3);
	SeqListPushFront(&sl,4);
	SeqListPushFront(&sl,5);
	SeqListPrint(&sl);
	cout << "---------------" << endl;
	cout << "头删法测试:" << endl;
	SeqListPopFront(&sl);//头删法测试
	SeqListPopFront(&sl);
	SeqListPopFront(&sl);
	SeqListPopFront(&sl);
	SeqListPopFront(&sl);
	SeqListPrint(&sl);
	cout << "---------------" << endl;
	cout << "查找元素测试:" << endl;
	cout <<SeqListFind(&sl, 3) << endl;
	cout << "---------------" << endl;
	cout << "在指定位置插入数据测试:" << endl;
	SeqListInsert(&sl, 3, 9);//1 2 3 9 4 5
	//若不知道数据的位置,可以与查找函数配合使用
	//int pos = SeqListFind(&sl, 4);
	//if (pos != -1)
	//{
	//	SeqListInsert(&sl, pos, 89);
	//}
	SeqListPrint(&sl);
	cout << "---------------" << endl;
	cout << "在指定位置删除数据测试:" << endl;
	SeqListErase(&sl,4);
	SeqListPrint(&sl);
	cout << "---------------" << endl;
	cout << "在销毁数组测试:" << endl;
	SeqListDestory(&sl);//销毁数组,即将数组变为初始化的状态
	SeqListPrint(&sl);
}
int main()
{
	TestSeqList1();
	return 0;
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【车载开发系列】ParaSoft单元测试环境配置(一)

【车载开发系列】ParaSoft单元测试环境配置(一) ParaSoft单元测试环境配置 【车载开发系列】ParaSoft单元测试环境配置(一)一. 什么是bdf文件二. bdf文件构成三. 新规做成bdf文件四. 导入bdf文件创建测试工程五. 获取编译器信息六. 新增自定义编译器Step1:打开向导Step2:…

Xcode 16 RC (16A242) 发布下载,正式版下周公布

Xcode 16 RC (16A242) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-16/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Xcode 16 的新功…

【拓扑系列】拓扑排序

【拓扑系列】拓扑排序 前言认识有向无环图认识AOV网&#xff1a;顶点活动图拓扑排序 1. 课程表1.1 题目来源1.2 题目描述1.3 题目解析 2. 课程表 II2.1 题目来源2.2 题目描述2.3 题目解析 3. LCR 114. 火星词典3.1 题目来源3.2 题目描述3.3 题目解析 前言 认识有向无环图 图中…

AI基础 L13 Constraint Satisfaction Problems I约束满足问题

Defining Constraint Satisfaction Problems A constraint satisfaction problem (CSP) consists of three components, X, D, and C: • X is a set of variables, {X1, . . . , Xn}. • D is a set of domains, {D1, . . . , Dn}, one for each variable • C is a set of co…

STM32+ESP8266 WiFi连接机智云平台APP远程控制教程

本文档将介绍如何用STM32ESP8266 WiFi模块从零开始连接上机智云&#xff0c;并通过APP进行远程控制。 机智云官网&#xff1a;机智云|智能物联网操作系统 (gizwits.com) 准备&#xff1a;STM32、ESP8266、手机、可上网的WiFi。 1.创建设备 1.1 注册登陆 请自行注册账号并登陆…

脱离八股文,真实开发中的延时处理需求实现思路(超时订单处理为例)

前言 咱们聊聊那些在开发过程中经常遇到的延时处理需求吧。比如说&#xff0c;网购时那些迟迟不付款的订单&#xff0c;或者是社交软件里那些需要稍后处理的消息&#xff0c;再或者是金融交易中那些需要等待确认的交易。这些都是咱们得搞定的活儿。 不过&#xff0c;很多时候&a…

JS面试真题 part3

JS面试真题 part3 11、bind、call、apply区别&#xff1f;如何实现一个bind12、JavaScript中执行上下文和执行栈是什么13、说说JavaScript中的事件模型14、解释下什么是事件代理&#xff1f;应用场景&#xff1f;15、说说你对闭包的理解&#xff1f;闭包使用场景 11、bind、cal…

make 程序规定的 makefile 文件的书写语法

&#xff08;1&#xff09; 常用的 gcc 选项&#xff1a; &#xff08;2&#xff09; make 的作用&#xff1a; &#xff08;3&#xff09; 搭建 make 的实验环境 &#xff0c; linux 的很简单&#xff0c; windows 的复杂一点&#xff1a; windows 上 make 环境的搭建&#…

python爬虫基础:了解html

编辑器vscode <!DOCTYPE html> <html><head><title>第一个网页</title></head><body><h1>字体</h1><h2>字体</h2><h3>字体</h3><p>Lorem, ipsum dolor sit amet consectetur adipisicing…

电商平台如何实现自动监控订单签收状态,加快资金划拨进程?

资金划拨作为交易流程的核心环节之一&#xff0c;直接关系到商家资金回笼的速度、消费者购物体验的满意度以及平台自身的信誉与稳定性。 区别于自营电商&#xff0c;电商平台入驻了许多第三方商家&#xff0c;为了保障交易安全和控制风险&#xff0c;在交易未完成之前&#xff…

Java 入门指南:Java 并发编程 —— 同步工具类 Semephore(信号量)

文章目录 同步工具类Semephore核心功能限制并发访问量公平与非公平策略灵活性与适应性 常用方法使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之…

Spring和MyBatis常见面试题总结

文章目录 1 Spring 基础1.1 说一下你对 Spring 的理解&#x1f525;1.2 Spring,Spring MVC,Spring Boot 之间什么关系?1.3 Spring 框架中用到了哪些设计模式&#xff1f;&#x1f525;1.4 说说自己对于 Spring MVC 了解?1.5 Spring MVC 的核心组件有哪些&#xff1f;1.6 Spri…

flutter开发实战-GoRouter路由go与push区别实践

flutter开发实战-GoRouter路由go与push区别实践 GoRouter是一个flutter的声明性路由包&#xff0c;使用路由器API提供一个方便的、基于url的API&#xff0c;用于在不同屏幕之间导航。可以定义URL模式、使用URL导航、处理深度链接以及许多其他与导航相关的场景。 之前使用了Go…

Vue3封装table表格右键菜单功能

1) 效果&#xff0c;右键单击单元格&#xff0c;打开菜单弹窗: 点击菜单选项&#xff0c;可选择只读/编辑&#xff0c;可在只读/编辑方法中&#xff0c;拿到该行列表格的数据&#xff0c;进行相关操作 2) 思路 1、右键菜单组件 出现的时机&#xff0c;是右键单击table表格row-…

移动安全需求分析与安全保护工程

移动应用安全威胁与需求分析 移动应用系统组成&#xff1a; 移动应用&#xff1a;简称App 通信网络&#xff1a;无线网络&#xff0c;移动通信网络及互联网 应用服务端&#xff1a;由相关服务器构成&#xff0c;负责处理来自App相关信息或数据 移动应用安全分析 Android系统…

【0基础】制作HTML网页小游戏——贪吃蛇(附详细解析)

我在昨天的文章&#xff08;贪吃蛇HTML源码&#xff09;里面分享了网页版贪吃蛇小游戏的源码&#xff0c;今天就来给大家详细讲解一下每部分代码是如何运作的&#xff0c;以及以后要如何美化贪吃蛇的UI界面&#xff0c;在哪里修改等。 目录 一、代码运作 1、HTML结构: 2、C…

数组的常用算法

数组是同类型数据的集合。便于整体处理数据&#xff0c;数组操作的主要算法有&#xff1a; 1求极值 2查找 3排序 2查找 cprimer plus第11.1节278--279页 4数组和指针的区别&#xff1a;数组表示法和指针表示法 数组表示法1 int a[4]{2,4,1,5}; for(int i0;i<4;i)cou…

JAVA 的excel数据批量导入解析 现在都用什么API工具 Apache POI 、EasyExcel 、easypoi有什么区别

&#x1f4dd;个人主页&#x1f339;&#xff1a;个人主页 ⏩收录专栏⏪&#xff1a;SpringBoot &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339;&#xff0c;让我们共同进步&#xff01; 在Java中&#xff0c;处理Excel数据批量导入解析时&#xff0c;常…

通讯录

在写一个程序前需要了解的知识&#xff0c;需要对通讯录的流程了如指掌&#xff0c;才能写出一个完整的程序 。 写一个主函数&#xff0c;里面包含菜单、对菜单的选择、以及循环。创建个人信息结构体&#xff0c;多人构成的结构体数组。分析每一个函数&#xff1a; 1).增加信…

webstorm修改主题色和配色常用插件(全部实用)包含主题、界面、开发效率等

Windows 用户打开setting 选择配色 更换主题看这里 效率插件 Rainbow Brackets 推荐理由&#xff1a;用各种鲜明的颜色显示括号&#xff0c;这样可以很容易分清楚括号配对问题。 Key promoter 推荐理由&#xff1a;只要是鼠标操作能够用快捷键替代的&#xff0c;Key Promoter…