C语言-数据结构-顺序表

news2024/11/19 21:23:03

  🌈个人主页: 会编辑的果子君

💫个人格言:“成为自己未来的主人~”  

 

目录

数据结构相关概念

顺序表

顺序表的概念和结构

线性表

顺序表分类

顺序表和数组的区别

顺序表分类

静态顺序表

动态顺序表

 头插和尾插

尾插


数据结构相关概念

数据结构是由“数据”和“结构”两词组合而来。

什么是数据?常见的数值1,2,3,4.....,教务系统里保存的用户信息,(姓名,性别,年龄,学历等),网页里肉眼可以看到的信息(文字,图片,视频等等),这些都是数据。

什么是结构?

当我们想要使用大量使用同一类型的数据时,通过手动定义大量的独立的变量对于程序来说,可读性非常差,我们可以借助数组这样的数据结构将大量的数据组织在一起,结构也可以理解为组织数据方式。

概念:数据结构是计算机存储,组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的元素的集合,数据结构反映数据的内部构成,即数据由哪部分构成,以什么方式构成,以及数据元素之间呈现的结构。

总结:

1)能够存储数据结构(如顺序表,链表等结构)

2)存储的数据能够方便查找

数据结构需要用到结构体,指针(一级指针,二级指针,指针传参),结构体指针,动态内存管理

顺序表

顺序表的概念和结构

线性表

线性表是N个具有相同特性的数据元素的有限序列,线性表是一种是实际中极其有用的数据结构,常用的线性表:顺序表,链表,栈,队列,字符串.....

线性表在逻辑上是线性结构,也就是说是连续的一条直线,但是在物理结构上并不一定是连续的

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

顺序表:逻辑结构是线性的,物理结构是连续的

顺序表分类

顺序表和数组的区别

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

顺序表分类

静态顺序表

使用定长数组存储元素

typedef int SLDataType;
#define N 10
struct SeqList {
	SLDataType a[N];//定长数组
	int size; //有效数组个数

}SL;

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

在上面的代码中,还有一个优点在于 int 可以立即替换而不影响下面的代码执行

动态顺序表

//动态顺序表-按需申请
typedef int SLDataType;
typedef struct SeqList {
	SLDataType* arr;//存储数据的底层逻辑
	int capacity;   //记录顺序表的空间
	int size;       //记录顺序表的当前的有效存储
}SL;

动态顺序表,可增容

静态顺序表,给定的数组长度,若不够,会导致后续的数据保存失败,数据丢失是非常严重的技术事故

给多了,会导致空间的大量浪费

//初始化和销毁
void SLInit(SL* ps) {
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

//检查
void SLChectCapacity(SL* 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;
	}
}

//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);//保持接口一致性

 头插和尾插

尾插

空间足够,直接插入

空间不够,扩容

扩容的原则:

一次扩充一个空间,插入一个元素还不会造成看空间浪费,程序执行效率低

一次扩容固定大小的空间(10,100)

小了造成频繁扩容

大了造成空间浪费

成倍数的增加(1.5倍,2倍)

数据插入的越多,扩容的大小越来越大

#define _CRT_SECURE_NO_WARNINGS
#include"code.2.26.h"
//初始化和销毁
void SLInit(SL* ps) {
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

//检查
void SLCheckCapacity(SL* 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;
	}
}
//顺序表的头插/尾插
void SLPushBack(SL* ps, SLDataType x) {
	//断言,粗暴的解决办法
	//assert(ps!=NULL);
	assert(ps);
	//if判断--温柔的解决办法
	/*if (ps == NULL) {
		return;
	}*/
	//空间不够,扩容
	SLCheckCapacity(ps);
	//空间足够,直接插入
	ps->arr[ps->size++] = x;
}
void SLDestroy(SL* ps) {

}
void SLPrint(SL* ps) {
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}
#define _CRT_SECURE_NO_WARNINGS
#include"code.2.26.h"
void slTest01() {
	SL s1;
	SLInit(&s1);
	//测试尾插
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);
	SLPrint(&s1); //1 2 3 4
}

int main() {
	slTest01();

	return 0;
}
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//静态顺序表

//typedef int SLDataType;
//#define N 10
//struct SeqList {
//	SLDataType a[N];//定长数组
//	int size; //有效数组个数
//
//}SL;

//动态顺序表-按需申请
typedef int SLDataType;
typedef struct SeqList {
	SLDataType* arr;//存储数据的底层逻辑
	int capacity;   //记录顺序表的空间
	int size;       //记录顺序表的当前的有效存储
}SL;

//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);//保持接口一致性
//顺序表的头部/尾部插入
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);

//打印顺序表
void SLPrint(SL* ps);
#define _CRT_SECURE_NO_WARNINGS
#include"code.2.26.h"
void slTest01() {
	SL s1;
	SLInit(&s1);
	//测试尾插
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);

	SLErase(&s1, 1);
	SLPrint(&s1); //1 2 3 4

}

int main() {
	slTest01();

	return 0;
}
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//静态顺序表

//typedef int SLDataType;
//#define N 10
//struct SeqList {
//	SLDataType a[N];//定长数组
//	int size; //有效数组个数
//
//}SL;

//动态顺序表-按需申请
typedef int SLDataType;
typedef struct SeqList {
	SLDataType* arr;//存储数据的底层逻辑
	int capacity;   //记录顺序表的空间
	int size;       //记录顺序表的当前的有效存储
}SL;

//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);//保持接口一致性
//顺序表的头部/尾部插入
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
//顺序表的头部/尾部删除
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
//指定位置之前插入数据
//删除指定位置数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
//打印顺序表
void SLPrint(SL* ps);
#define _CRT_SECURE_NO_WARNINGS
#include"code.2.26.h"
//初始化和销毁
void SLInit(SL* ps) {
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

//检查
void SLCheckCapacity(SL* 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;
	}
}
//顺序表的头插/尾插
void SLPushBack(SL* ps, SLDataType x) {
	//断言,粗暴的解决办法
	//assert(ps!=NULL);
	assert(ps);
	//if判断--温柔的解决办法
	/*if (ps == NULL) {
		return;
	}*/
	//空间不够,扩容
	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];
	}
	ps->arr[0] = x;
	ps->size++;
}
//顺序表的头部/尾部删除
void SLPopBack(SL* ps) {
	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];
	}
	ps->size--;
}
//指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x) {
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);

	SLCheckCapacity(ps);
	//pos及之后的数据往后挪动一位,pos空出来
	for (int i = ps->size; i > pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;
}
//删除指定位置数据
void SLErase(SL* ps, int pos) {
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	//pos以后的数据往前挪动一位
	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}
void SLDestroy(SL* ps) {

}
void SLPrint(SL* ps) {
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

 

 

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

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

相关文章

统计分析笔记3

文章目录 统计检验选择正确的统计检验统计检验是做什么的&#xff1f;何时进行统计检验选择参数化测试&#xff1a;回归、比较或相关性选择非参数检验 假设检验的假设条件skewness什么是零偏度right skewleft skew计算skewnesswhat to do if your data is skewed kurtosis怎么计…

《大模型时代-ChatGPT开启通用人工智能浪潮》精华摘抄

原书很长&#xff0c;有19.3w字&#xff0c;本文尝试浓缩一下其中的精华。 知识点 GPT相关 谷歌发布LaMDA、BERT和PaLM-E&#xff0c;PaLM 2 Facebook的母公司Meta推出LLaMA&#xff0c;并在博客上免费公开LLM&#xff1a;OPT-175B。 在GPT中&#xff0c;P代表经过预训练(…

C++:类与对象(1)

创作不易&#xff0c;谢谢支持&#xff01; 一、面向过程和面向对象 1、C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 如我们要实现洗衣服&#xff1a; 2、而C是基于面向对象的&#xff0c;关注的是…

跨境电商与支付介绍

1、跨境电商定义和分类&#xff1b; 2、国际贸易清结算&#xff1b; 3、跨境支付&#xff1b; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同&#xff0c;交易双方属于不同的国家。因此&#xff0…

积累:使用QPushButton模拟开关按键

1. 效果图 2. 源码实现 2.1 设置 QPushButton 默认样式 QPushButton{border:none;border-image: url(:/image/close.png); }2.2 主要实现源码 void MainWindow::on_switch_btn_clicked() {if(m_switchisopen){ui->switch_btn->setStyleSheet("QPushButton{\border…

可观测性在威胁检测和取证日志分析中的作用

在网络中&#xff0c;威胁是指可能影响其平稳运行的恶意元素&#xff0c;因此&#xff0c;对于任何希望避免任何财政损失或生产力下降机会的组织来说&#xff0c;威胁检测都是必要的。为了先发制人地抵御来自不同来源的任何此类攻击&#xff0c;需要有效的威胁检测情报。 威胁…

单片机蓝桥杯实训(一)—— 初步了解赛点(省赛)资源包

本篇文章是我在准备单片机蓝桥杯赛事中的第一篇文章&#xff0c;旨在记录初步了解该赛事省赛的赛点资源包&#xff0c;以便更好的提前准备和训练相关的模块代码。文章末尾附有资源包的链接。 一、赛点资源包 赛点资源包所提供的资源如下&#xff1a; 二、赛点资源包解读 这里…

Android+uniapp微信小程序的高校二手商品交易系统卖家vue+springboot/php/nodejs-python

高校的二手商品市场绝对是一个大市场&#xff0c;每年都有毕业生要毕业&#xff0c;每年都有新生来报到&#xff0c;二手商品网站为广大用户提供了一个很好的供需平台&#xff0c;人们可以将自己不用的东西放在网上&#xff0c;也可在网上找到自己需要的东西&#xff0c;物美价…

2024.2.28每日一题

LeetCode 使二叉树所有路径值相等的最小代价 2673. 使二叉树所有路径值相等的最小代价 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点…

RunnerGo UI自动化测试脚本如何配置

RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度可复用的测试脚本&#xff0c;测试团队无需复杂的代码编写即可开展低代码的自动化…

智能工业革新,自研工业操作系统携手AI解决行业痛点

一台银色的机械臂流畅地伸展出“手臂”&#xff0c;精准地从料框中抓取目标工件&#xff0c;并将其安装在指定位置进行固定。整个过程中&#xff0c;机械臂的动作顺滑&#xff0c;无一丝卡顿。这可不是什么科幻电影中的场景&#xff0c;而是真实发生在一家电力装备企业智能生产…

二次供水物联网:HiWoo Cloud助力城市水务管理升级

随着城市化的快速推进&#xff0c;二次供水系统作为城市基础设施的重要组成部分&#xff0c;其稳定运行和高效管理显得至关重要。然而&#xff0c;传统的二次供水管理方式在应对复杂多变的城市供水需求时&#xff0c;显得力不从心。为了破解这一难题&#xff0c;HiWoo Cloud平台…

MATLAB中的makeweight函数

W makeweight(dcgain,[freq,mag],hfgain) W makeweight(dcgain,[freq,mag],hfgain,Ts) W makeweight(dcgain,[freq,mag],hfgain,Ts,N) W makeweight(dcgain,wc,hfgain,___) W makeweight(dcgain,wc,hfgain&#xff0c;___)表示增益交叉频率wc。该语法相当于将…

高通 AI Hub 上手指南

文章介绍 2月26日&#xff0c;高通在2024年世界移动通信大会&#xff08;MWC2024&#xff09;上发布高通AI Hub&#xff0c; AI Hub 简化了AI 模型部署到边缘设备的过程。可以利用AI-hub云端托管 Qualcomm 设备上&#xff0c;在几分钟内完成模型的优化、验证和部署。本文以Pyto…

osi模型,tcp/ip模型(名字由来+各层介绍+中间设备介绍)

目录 网络协议如何分层 引入 osi模型 tcp/ip模型 引入 命名由来 介绍 物理层 数据链路层 网络层 传输层 应用层 中间设备 网络协议如何分层 引入 我们已经知道了网络协议是层状结构,接下来就来了解了解下网络协议如何分层 常见的网络协议分层模型是OSI模型 和 …

JavaEE:多线程(3):案例代码

多线程基础知识要点 案例一&#xff1a;单例模式 是一种设计模式 软件设计需要框架&#xff0c;这是硬性的规定&#xff1b;设计模式是软性的规定。遵循好设计模式&#xff0c;代码的下限就被兜住了 单例 单个实例&#xff08;对象&#xff09; 某个类在一个进程中只应该创…

【mysql】1812 - Tablespace is missing for table `job`.`xxl_job_log`.

打开表提示&#xff1a; 1812 - Tablespace is missing for table job.xxl_job_log. 1812-表“job”缺少表空间xxl_job_log。 尝试删除表重建表 DROP TABLE IF EXISTS job.xxl_job_log; 提示&#xff1a; 1051 - Unknown table job.xxl_job_log 1051-未知表“job.xxl_job_lo…

基于springboot实现二次元商品购物系统项目【项目源码+论文说明】

基于springboot实现二次元商品购物系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xff0…

网站三合一缩略图片介绍展示源码

网站三合一缩略图片介绍展示源码&#xff0c;PHP源码&#xff0c;运行需要php环境支持&#xff0c;效果截图如下 蓝奏云下载&#xff1a;https://wfr.lanzout.com/ihY8y1pgim6j

pytorch 图像的卷积操作

目录 1.卷积核基本参数说明 2.卷积相关操作说明 3.卷积操作示例 1.卷积核基本参数说明 pytorch进行图像卷积操作之前&#xff0c;需要把图像素格式进行分离&#xff0c;比如一个图像为rgb格式&#xff0c;把R&#xff0c;G,B取出来作为一个ndarray&#xff0c;前文讲过&#…