【数据结构篇】~顺序表

顺序表前言

想要学好数据结构的三大基本功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.rhkb.cn/news/402759.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应急响应-DDOS-技术指南

初步预判 通常&#xff0c;可从以下几方面判断服务器/主机是否遭受DDoS攻击查看防火墙、流量监控设备、网络设备等是否出现安全告警或大量异常数据包。如图所示&#xff0c;通过流量对比&#xff0c;发现在异常时间段存在大量UDP数据包&#xff0c;并且与业务无关。 通过安全设…

uniapp多图上传uni.chooseImage上传照片uni.uploadFile,默认上传9张图

uniapp多图上传uni.chooseImage上传照片uni.uploadFile 代码示例&#xff1a; /**上传照片 多图*/getImage() {uni.chooseImage({count: 9, //默认9sizeType: [original, compressed], //可以指定是原图还是压缩图&#xff0c;默认二者都有sourceType: [album], //从相册选择/…

8 Java常用API(基本语法6)-- Object和Objects类、Math、System、浅克隆和深克隆、手动下载导入第三方jar包

文章目录 前言一、Math(工具类)1 属性2 常见方法二、System(工具类,和系统相关的)1 public static void exit(int status) --- 终止当前运行的 Java 虚拟机。2 public static long currentTimeMillis() --- 以毫秒为单位返回当前unix时间。3 public static void arraycopy(Obj…

在Windows上配置VSCode MinGW+CMake(包括C++多线程编程的两套API:posix和win32)

创建目录 首先&#xff0c;需要电脑上安装VSCode, 并且创建三个文件夹&#xff1a;cmake、MinGW-posix、MinGW-w32 文件下载 下载posix-seh posix和win32分别是c多线程变成的两套API,可根据不同需求安装&#xff0c;现在先下载配置环境需要的几个文件 百度搜索MinGW-64 点…

Apache--简介与基本使用

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Apache简介 Apache HTTP Server&#xff08;在Red Hat发行版中俗称Apache或httpd&#xff09;是由Apache Software Foundation在Apache License…

WPF打印控件内容

当我们想打印控件内容时&#xff0c;如一个Grid中的内容&#xff0c;可以用WPF中PrintDialog类的PrintVisual()方法来实现 界面如下&#xff1a; XAML代码如下 <Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width"300"…

pygame开发课程系列(4): 游戏元素

第四章 游戏元素 在本章中&#xff0c;我们将深入探讨如何在 Pygame 中处理游戏元素&#xff0c;包括键盘输入、鼠标输入、图像加载和声音播放。这些元素是构建互动游戏的基础&#xff0c;能够让你的游戏变得更生动、更有趣。 4.1 处理键盘输入 键盘输入是控制游戏角色或元素…

Redis相关介绍

本文介绍了Redis&#xff0c;一种开源的内存数据结构存储系统&#xff0c;强调其高性能、多种数据结构支持、内存存储、持久化策略、发布订阅功能及工作原理。 一、Redis的介绍 Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;即远程字典服务&#xff0c…

[000-01-030].第7节:Zookeeper工作原理

1.Zookeeper工作原理&#xff1a; 1.1.Zookeeper的工作机制 1.Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff1b;2.Zookeeper负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的…

Unity Recttransform操作

1、拉伸铺满 RectTransform rect GetComponent<RectTransform>();rect.anchorMin Vector2.zero;rect.anchorMax Vector2.one;rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Verti…

Ciallo~(∠・ω・ )⌒☆第二十篇 入门mysql 数据库

要入门MySQL数据库&#xff0c;首先需要了解数据库的基本概念和原理。MySQL是一种广泛使用的开源关系型数据库管理系统&#xff0c;它能够处理大量的数据&#xff0c;并提供了多种功能。 一、创建数据库 连接到MySQL后&#xff0c;你可以使用SQL语句来创建数据库。例如&#x…

【leetcode】删除链表的倒数第 N 个结点-25-5

方法&#xff1a;递归 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), ne…

css 文字图片居中及网格布局

以下内容纯自已个人理解&#xff0c;直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

微信小程序实例代码解读

以微信 小程序开发工具给的示例代码为例&#xff1a; 主页代码&#xff1a; index.wxml 这个文件是一个微信小程序页面的 WXML 结构,主要功能是展示一个快速开始教程的步骤和内容。 源代码&#xff1a; <!--index.wxml--> <view class"container">&l…

GAMES104:07游戏中渲染管线、后处理和其他的一切-学习笔记

文章目录 前言一&#xff0c;Ambient Occlusion环境光遮蔽1.1 Precomputed AO1.2 Screen Space Ambient Occlusion(SSAO)1.3 Horizon-based Ambient Occlusion(HBAO)1.4 Ground Truth-based Ambient Occlusion(GTAO)1.5 Rat-Tracing Ambient Occlusion 二&#xff0c;雾效2.1 D…

Spring——AOP前言(写一个小demo为了好学习AOP)

1.AOP的概念 1.1 AOP简单样例 我们来先通过一个例子来对AOP进行理解&#xff0c;这个例子就是有关Spring的事务的一个样例&#xff0c;有关Spring是怎么实现事务的&#xff0c;这个事务其实本质上就是对于我们代码的一个增强。废话不多说&#xff0c;上程序&#xff0c;请各位…

SOAP @WebService WSDL

SOAP & WebService & WSDL SOAP&#xff08;Simple Object Access Protocol&#xff09;WebService&#xff08;Web服务&#xff09;WSDL&#xff08;Web Services Description Language&#xff09; SOAP&#xff08;Simple Object Access Protocol&#xff09; **是一…

Ciallo~(∠・ω・ )⌒☆第十七篇 Ubuntu基础使用 其一

Ubuntu是一种基于Linux的操作系统&#xff0c;它是开源的、免费的&#xff0c;并且具有广泛的用户群体。 基本文件操作&#xff1a;Ubuntu使用命令行工具来进行文件操作。以下是一些常用的命令&#xff1a; 切换到用户主目录&#xff1a; cd ~ 切换到上级目录&#xff1a; cd .…

解密键盘输入:探索设备控制器的奥秘

流程初探 键盘是我们最常用的输入硬件设备之一。作为程序员&#xff0c;你知道当我们敲击键盘上的字母"A"时&#xff0c;操作系统会发生什么吗&#xff1f;下面我将简要介绍整个过程&#xff0c;以便你更容易理解为什么需要这些组件。 首先&#xff0c;让我们来看看…

Linux下 vim的用法

目录 前言 一、初始Vim 二、使用Vim 1.1命令模式 2.1底行模式 3.1插入模式 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 本篇文章会介绍vim的基本用法和为什么我们要学习vim。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供…