【数据结构篇】~顺序表

news2024/11/23 11:46:07

顺序表前言

想要学好数据结构的三大基本功1.结构体2.指针3.动态内存开辟,这三样将是贯彻整个数据结构的工具。(可以去这里了解这三大基本功)
顺序表也是线性表的一种,那线性表又是什么呢?
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的
数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… ​
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性
表在物理上存储时,通常以数组和链式结构的形式存储。

1.静态顺序表

静态顺序表顾名思义也就是不用动态开辟内存,是用定长数组实现的!
如图:在这里插入图片描述

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

2.动态顺序表

顺序表和数组的区别就在于它可以实现"增、删、查、改"等功能。

头文件

1.这是头文件

#pragma once
#include <stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int sqdatatype;//定义数据类型
typedef struct sqlist 
{ 
	sqdatatype* arr;
	 int size;//有效数据个数
	 int capacity;//容量
}Sq;
void sqcapacitycheck(Sq* sq);//检查容量
void sqlistinit(Sq* sq);//初始化

void sqDestroy(Sq* sq);//销毁
//1.'增'(尾插、头插、任意地方插入)
void sqpushback(Sq* sq, sqdatatype x);
void sqpushfront(Sq*sq,sqdatatype x);//头插
void sqinsertf(Sq* sq, size_t pos, sqdatatype n);//任意地方插入
//2.'删'(尾删、头删、任意地方删除)
void sqpopback(Sq* sq);//尾删
void sqpopfront(Sq* sq);//首删
void sqearse(Sq* sq, size_t pos);//指定位置删除


int sqfind(Sq* sq, sqdatatype n);//3.'查'(查找数据)
//4.'改'(改数据)
void sqchange(Sq* sq, sqdatatype n1, sqdatatype n2);//把n1改为n2; 

源文件

2.这是源文件

#include"sqlist.h"
//顺序表的"初始化"和"销毁"
//顺序表的"增、删、查、改"实现
// 第一次写顺序表时有许多"坑"
//1.初始化
void sqlistinit(Sq* sq)
//!!第一个坑
//这里要传 "地址" ,不能传"值",传值不会改变(形参只是实参的临时拷贝)
{
	//初始化顺序表就要把结构体里的内容全部初始化
	sq->arr = NULL;
	sq->capacity = sq->size = 0;
}
//销毁
void SqDestroy(Sq* sq)
{
	//和初始化一样,所有内容都要销毁
	free(sq->arr);
	sq->arr = NULL;
	sq->size = sq->capacity = 0;
}
//打印数据
void sqprint(Sq sq)
{
	for (int i = 0; i < sq.size; i++)
	{
		printf("%d ", sq.arr[i]);
	}
	printf("\n");
}
void sqcapacitycheck(Sq* sq)//检查容量
{
	

	if (sq->capacity == sq->size)//容量不够了
	{
		//第二个坑,capacity不能为空
		int newcapacity = (sq->capacity==0)? 4:(2*sq->capacity);
		sqdatatype* tmp= (sqdatatype*)realloc(sq->arr, newcapacity * sizeof(sqdatatype));
		//第三个坑realloc时要 乘 数据类型
		if (tmp==NULL)
	 {
		perror("realloc fail!");
		return 1;
	 }
	sq->capacity = newcapacity;
	sq->arr = tmp;
	}
	
}
//"增"的时候每次(size(有效数据个数)都要++)
// 判断容量够不够,不够就要增容!
//1.尾插()
void sqpushback(Sq* sq, sqdatatype x)
{
	assert(sq);//这里不能传空,不能对null解引用
	sqcapacitycheck(sq);
	sq->arr[sq->size++]=x;
}
//2.头插
void sqpushfront(Sq* sq, sqdatatype x)
{
	assert(sq);
	sqcapacitycheck(sq);
	for (int i=sq->size;i>0;i--)
	{
		sq->arr[i] = sq->arr[i-1];
	}
	sq->arr[0] = x;
	sq->size++;
}
//3.指定位置插入
void sqinsertf(Sq* sq, size_t pos, sqdatatype x)
{
	assert(sq);
	assert(pos <= sq->size);//(因为pos是无符号整型所以>0 )   pos得满足条件!
	sqcapacitycheck(sq);
	for (int i = sq->size; i>pos;i--)
	{
		sq->arr[i]= sq->arr[i - 1];
	}
	sq->arr[pos] = x;

	sq->size++;
}
//删除数据的时候(size都要--)
void sqpopback(Sq* sq)//尾删
{
	assert(sq);
	sqcapacitycheck(sq);
	sq->size--;
}
void sqpopfront(Sq* sq)//首删
{
	assert(sq);
	sqcapacitycheck(sq);
	for (int i=0;i<sq->size-1;i++)
	{
		sq->arr[i] = sq->arr[i+1];//最后一次把size-1给size-2
	}
	sq->size--;
}
void sqearse(Sq* sq, size_t pos)//指定位置删除
{
	assert(sq);
	assert(pos <= sq->size);//(因为pos是无符号整型所以>0 )   pos得满足条件!
	sqcapacitycheck(sq);
	for (int i = pos; i < sq->size - 1; i++)
	{
		sq->arr[i] = sq->arr[i + 1];//第一次:  arr[pos]=arr[pos+1]
		                            //最后一次:arr[size-2]=arr[size-1]
	}
	sq->size--;
}
//查找数据
int sqfind(Sq* sq, sqdatatype n)
{
	assert(sq);
	sqcapacitycheck(sq);
	for (int i = 0; i < sq->size; i++)
	{
		if (n == sq->arr[i])

		{
			printf("找到了,下标是:");
			return i;
		}
	}
}
//改数据
void sqchange(Sq* sq, sqdatatype n1, sqdatatype n2)//把n1改为n2
{
	assert(sq);
	sqcapacitycheck(sq);
	for (int i = 0; i < sq->size; i++)
	{
		if (n1 == sq->arr[i])

		{
			sq->arr[i] = n2;
		}
	}
}

详解全部都注释起来了哦!

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

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

相关文章

系列:水果甜度个人手持设备检测-无损检测常用技术和方式汇总

系列:水果甜度个人手持设备检测 -- 无损检测常用技术和方式汇总 概述 无损检测以不损坏被检测对象的使用性能为前提&#xff0c;以物理或化学方法为手段&#xff0c;借助相应的设备器材&#xff0c;按照规定的技术要求&#xff0c;对材料、零部件、结构件进行有效的检验和测…

软件测试第1章 软件测试是什么

目录​​​​​​​ 内容说明 一、软件测试与质量概览需要熟悉什么 二、如何理解质量保证 三、软件测试的误区-程序员和测试的关系 四、软件测试是什么&#xff1f; 五、软件测试的目的 六、软件测试与软件质量保证 七、软件测试的必要性 八、软件测试的基本概念分析 …

HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】 介绍基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码-能管系统软件架构

js 深入学习各种继承方法使用场景

前言 问题&#xff1a; JS 如何实现继承呢&#xff1f;主要有几种继承方式及分别适用于哪些场景呢&#xff1f; 我们学习高级语言&#xff0c;就必须学习面向对象&#xff0c;想要成为高手&#xff0c;就必须学习别人不会的&#xff0c;就比如JS中的继承&#xff0c;好多前端人…

ASP.NET在线交流论坛管理系统

ASP.NET在线交流论坛管理系统 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 用户功能有个人信息管理 帖了信息管理 意见反馈信息管理 点赞管理 收藏管理 后台管理员可以进行用户管理 …

部署及使用seata

目录 1.下载seata1.7.0.zip 2.上传至云服务器&#xff0c;使用unar工具解压 3.配置application.yml&#xff0c;主要配置如下参数 4.为seata执行mysql脚本 5.配置nacos配置中心 *6.启动seata服务器 问题&#xff1a;“cause:can not register RM,err:can not connect to…

国外项目管理软件最佳实践:选型与应用

国内外主流的10款国外项目管理软件对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、ProofHub、Zoho Projects、Hive。 在寻找适合的国外项目管理软件时&#xff0c;你是否感到不知从何选择&#xff1f;市场上琳琅满目的选项往往令人眼花缭乱&…

微软披露Office最新零日漏洞,可能导致数据泄露

近日&#xff0c;微软披露了 Office 中一个未修补的零日漏洞&#xff0c;如果被成功利用&#xff0c;可能导致敏感信息在未经授权的情况下泄露给恶意行为者。 该漏洞被追踪为 CVE-2024-38200&#xff08;CVSS 得分&#xff1a;7.5&#xff09;&#xff0c;被描述为一个欺骗漏洞…

关于xilinx的FFTIP的使用和仿真

工具&#xff1a;vivado2018.3&#xff0c;modelsim10.6d 场景&#xff1a;在进行数据进行频谱分析的时候&#xff0c;使用FPGA来完成FFT的计算可以加快数据的计算速度。 下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生&#xff0c;通过IP产生的波形数据…

旧手机NAS方案

这里写目录标题 1、参考2、alpine-term-v16.0-release.apk下载安装3、电脑端ssh连接3、安装docker3.1 网络配置3.2 配置APK源 1、参考 【Docker与Termux】闲置旧安卓手机上的NAS无缝部署方案 https://blog.csdn.net/AnRanGeSi/article/details/138717589 【Alpine Term】Andr…

线程与进程(5)

目录 信号量&#xff08;线程的同步 &#xff09; 信号量的分类&#xff1a; 框架&#xff1a; &#xff08;1&#xff09;信号量的定义(semaphore): &#xff08;2&#xff09;信号量的初始化&#xff1a; &#xff08;3&#xff09;信号量的PV 操作 &#xff08;4&#…

Ubuntu Linux安装Go语言

Golang是Google公司在2007年开始开发的一种静态强类型、编译型语言。Go语言被设计成一门简单、高效且可靠的编程语言&#xff0c;旨在解决大规模网络服务和分布式系统开发中的复杂性问题。Go语言结合了动态语言的开发速度和C/C等编译型语言的性能与安全性&#xff0c;提供了强大…

[DL]深度学习_针对图像恢复的高效扩散模型DiffIR

DiffIR: Efficient Diffusion Model for Image Restoration Abstract 扩散模型(DM)通过将图像合成过程建模为去噪网络的顺序应用&#xff0c;实现了SOTA的性能。然而&#xff0c;与图像合成不同的是&#xff0c;图像恢复(IR)对生成符合ground-truth的结果有很强的约束。因此&am…

家穷就去互联网

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

AI编程工具合集(附使用地址)

在AI编程工具领域&#xff0c;随着技术的飞速发展&#xff0c;越来越多的工具正在改变编程的方式。以下是目前排名前十的AI编程工具合集&#xff0c;提供了丰富的功能来提升开发效率&#xff0c;并在多个编程场景中帮助开发者解决问题。 1. GitHub Copilot • 是什么: GitHub C…

打靶笔记--medium_socnet

medium_socnet 靶机地址:https://www.vulnhub.com/entry/boredhackerblog-social-network,454/ 内容简介&#xff1a; 这是本系列的第04次打靶&#xff0c;我选择了一个中等难度的靶机。在这次打靶过程中&#xff0c;我们将使用到以下攻击手段&#xff1a; 主机发现 端口扫…

javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级,nginx配置跨域

文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理&#xff1a;添加以下http响应头2.3. 四种跨域实现方式及优先级&#xff08;从高到低&#xff09; 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…

鸿蒙内核源码分析(内存规则篇) | 内存管理到底在管什么

先说如果没有内存管理会怎样? 那就是个奴才们能把主子给活活踩死&#xff0c; 想想主奴不分&#xff0c;吃喝拉撒睡都在一起&#xff0c;称兄道弟的想干啥? 没规矩不成方圆嘛&#xff0c;这事业肯定搞不大&#xff0c;单片机时代就是这种情况. 裸机编程&#xff0c;指针可以…

【笔记】MSPM0G3507使用RT-Thread FinSH——MSPM0G3507与RT_Thread(四)

接上篇 KEIL 添加 FinSH 源码 添加自己的函数实现rt_hw_console_getchar 修改为&#xff1a; #include "C:\ti\mspm0_sdk_2_01_00_03\examples\nortos\LP_MSPM0G3507\driverlib\G3507_RTT\ti_msp_dl_config.h"//ti_msp_dl_config.h的绝对地址RT_WEAK char rt_hw_con…