数据结构——顺序表(三)

news2024/10/6 14:31:37

数据结构

文章目录

  • 数据结构
  • 一、什么是顺序表
  • 二、顺序表的创建
    • 1.静态顺序表
    • 2.动态数据表
  • 三、顺序表的初始化、销毁
  • 四、顺序表的插入
    • 1.尾插
    • 2.头插
    • 3.任意插入
  • 总结

一、什么是顺序表

在这里插入图片描述 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。
我们知道数组里的数据是0,1,2,3,不可能出现0,1,2,4,没有3就没有4

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。
    像通讯录第一次实现时定义了1000个。
  2. 动态顺序表:使用动态开辟的数组存储。
    动态的通讯录

二、顺序表的创建

地址、容量、长度
定义一个结构体变量

1.静态顺序表

静态顺序表是使用定长数组存储元素。空间小了,不够用,空间大了又太浪费,所以说静态顺序表不实用。

struct SeqListInit
{
int *data;//地址
int length;//容量
};
#define N 100
typedef int SeqListDataType;//定义为SeqListDataType方便使用
typedef struct SeqList
{
	SeqListDataType a[N];//存储数据的数组
	int size;//顺序表中当前有效数据的个数
}SeqList;

2.动态数据表

typedef int SeqListDataType;
typedef struct SeqList
{
	SeqListDataType  *a;//存储数据的数组(动态开辟)
	int size;//顺序表中当前有效数据的个数
	int capacity;//顺序表中最大存储的个数
}SeqList;

三、顺序表的初始化、销毁

点(.)是用于结构体变量访问成员,箭头(->)是用于结构体指针访问成员。

//初始化
void SeqListInit(SeqList *p)
{
	assert(p);//用assert来防止传入空指针使程序崩掉
	p->a = NULL;//将指向动态开辟的数组置为NULL。
	p->size = 0;
	p->capacity = 0;
}
//销毁
void SeqListDestroy(SeqList *p)
{
	assert(p != NULL);
	free(p->a);//释放动态开辟的空间
	p->a = NULL;
	p->size = 0;
	p->capacity = 0;
}

四、顺序表的插入

在插入之前要先进行判断

//判断线性表是否已满
void CheckCapacity(SeqList* p)
{
	if (p->size == p->capacity)
	{
		int newcapacity = (p->capacity == 0) ? 4 : (p->capacity * 2);
		//如果容量为0(第一次插入数据),默认开辟4个SeqListDataType的空间
		//如果是在插入数据过程中顺序表已满,则将空间变为2倍(将空间变为2倍也可能会出现空间浪费的情况)
		//这里扩容的倍数需要具体情况具体分析,此处以2倍为例
		SeqListDataType* newA = (SeqListDataType*)realloc(p->a, sizeof(SeqListDataType)*newcapacity);
		if (newA == NULL)//开辟失败
		{
			printf("newcapacity fail\n");
			return;
		}
		p->a = newA;
		p->capacity = newcapacity;
	}
}

1.尾插

//尾插
void SeqListPushBack(SeqList* p, SeqListDataType x)
{
	assert(p);
	CheckCapacity(p);//当尾部空间不够时,就会自动扩容。
	p->a[p->size] = x;
	//p->size表示当前顺序表中有效的数据个数
	//a[p->size]访问当前最后一个数据的下一个位置
	p->size++;//注意此处要让有效数据的个数+1
}

2.头插

在头部插入数据前,需要将所有数据向后挪一位,腾出第一个数据的位置来插入新数据。
注意:必须从后向前依次挪动数据,否则前面一位的数据会覆盖后面一位的数据,导致数据的丢失。

void SeqListPushFront(SeqList* p, SeqListDataType x)
{
	assert(p);
	CheckCapacity(p);
	int end = p->size;
	for (; end > 0; end--)
	{
		p->a[end] = p->a[end - 1];//从后向前挪动数据
	}
	p->a[0] = x;
	p->size++;//注意此处要让有效数据的个数+1
}

3.任意插入

//中间插入数据
void SeqListInsert(SeqList* p, int pos, SeqListDataType x)
{
	assert(p);
	assert(pos >= 0 && pos <= p->size);
	CheckCapacity(p);

	int i = p->size;
	for (; i > pos; i--)
		p->a[i] = p->a[i - 1];//向后挪动数据
	p->a[i] = x;
	p->size++;
}

总结

我用DEV进行了简单的编写,规范的操作是编写源文件和.h文件

在这里插入图片描述
代码如下

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define N 10
typedef int SeqListDataType;
typedef struct SeqList
{
	SeqListDataType  *a;//存储数据的数组(动态开辟)
	int size;//顺序表中当前有效数据的个数
	int capacity;//顺序表中最大存储的个数
}SeqList;

int SeqListInit(SeqList *p)
{
	assert(p);//用assert来防止传入空指针使程序崩掉
	p->a = (int *)malloc(sizeof(int) * N);//将指向动态开辟的数组置为NULL。
	p->size = 0;
	p->capacity = 0;
	return 1;
}
void SeqListDestroy(SeqList *p)
{
	assert(p != NULL);
	free(p->a);//释放动态开辟的空间
	p->a = NULL;
	p->size = 0;
	p->capacity = 0;
}
void CheckCapacity(SeqList* p)
{
	if (p->size == p->capacity)
	{
		int newcapacity = (p->capacity == 0) ? 4 : (p->capacity * 2);
		//如果容量为0(第一次插入数据),默认开辟4个SeqListDataType的空间
		//如果是在插入数据过程中顺序表已满,则将空间变为2倍(将空间变为2倍也可能会出现空间浪费的情况)
		//这里扩容的倍数需要具体情况具体分析,此处以2倍为例
		SeqListDataType* newA = (SeqListDataType*)realloc(p->a, sizeof(SeqListDataType)*newcapacity);
		if (newA == NULL)//开辟失败
		{
			printf("newcapacity fail\n");
			return;
		}
		p->a = newA;
		p->capacity = newcapacity;
	}
}
void SeqListPushBack(SeqList* p, SeqListDataType x)
{
	assert(p);
	CheckCapacity(p);//当尾部空间不够时,就会自动扩容。
	p->a[p->size] = x;
	//p->size表示当前顺序表中有效的数据个数
	//a[p->size]访问当前最后一个数据的下一个位置
	p->size++;//注意此处要让有效数据的个数+1
}
void SeqListPushFront(SeqList* p, SeqListDataType x)
{
	assert(p);
	CheckCapacity(p);
	int end = p->size;
	for (; end > 0; end--)
	{
		p->a[end] = p->a[end - 1];//从后向前挪动数据
	}
	p->a[0] = x;
	p->size++;//注意此处要让有效数据的个数+1
}
void SeqListInsert(SeqList* p, int pos, SeqListDataType x)
{
	assert(p);
	assert(pos >= 0 && pos <= p->size);
	CheckCapacity(p);

	int i = p->size;
	for (; i > pos; i--)
		p->a[i] = p->a[i - 1];//向后挪动数据
	p->a[i] = x;
	p->size++;
}
void SeqListprintf(SeqList* p)
{
	assert(p);
	int i=0;
	for(i=0;i<p->size;i++)
	printf("%d\n",p->a[i]);
}
int main()
{
	SeqList sl;
	int ret;
    ret=SeqListInit(&sl);
	if(1==ret)
	printf("顺序表创建成功\n");
	SeqListPushBack(&sl,1);
	SeqListPushBack(&sl,2);
	SeqListPushBack(&sl,3);
	SeqListPushBack(&sl,4);
	printf("尾插4321成功\n"); 
	SeqListprintf(&sl);
	SeqListPushFront(&sl,5);
	printf("头插5成功\n");
	SeqListprintf(&sl);
	SeqListInsert(&sl,2,99); 
	printf("第三个位置插入99成功\n");
	SeqListprintf(&sl);
	SeqListDestroy(&sl);
	printf("销毁\n");
	SeqListprintf(&sl);
	printf("销毁成功");
}

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

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

相关文章

Python实例方法、静态方法和类方法详解

和类属性一样&#xff0c;类方法也可以进行更细致的划分&#xff0c;具体可分为类方法、实例方法和静态方法。和类属性的分类不同&#xff0c;对于初学者来说&#xff0c;区分这 3 种类方法是非常简单的&#xff0c;即采用 classmethod 修饰的方法为类方法&#xff1b;采用 sta…

FreeRTOS消息队列

消息队列是一种常用于任务间通信的数据结构。通过消息队列服务&#xff0c;任务或 中断服务例程可以将一条或多条消息放入消息队列中&#xff0c;同样&#xff0c;一个或多个任务可 以从消息队列中获得消息。本章将向大家介绍 FreeRTOS 的消息队列&#xff0c;通过本章 的学习&…

238. 除自身以外数组的乘积

【答案解析】&#xff1a;暴力不考虑其他的因素的话&#xff0c;将所有数据乘积起来&#xff0c;然后遍历数组除以当前位置数据即可。更优解法&#xff1a;将乘积分为两次进行&#xff0c;第一次先将每个位置左边的数据乘积计算出来放到返回数组中&#xff0c;后边第二次循环 将…

【Java面试(二)】冒泡排序的实现及优化

文章目录前言冒泡排序初步实现冒泡排序_优化_减少比较次数冒泡排序_优化_减少冒泡次数冒泡排序_优化_进一步优化比较次数总结前言 今天我们来学习与排序相关的面试题&#xff0c;首先我们先来学习冒泡排序&#xff0c;那什么是冒泡排序呢&#xff0c;它的关键在于数组中相邻元素…

变聪明的方法就是学习,每个人最终都会与生活和解,连村西透仿佛也捡回了昔日的勇气。

文章目录❤️‍&#x1f525; 序❤️‍&#x1f525; 往事如风迹难寻 - 成为创作者的契机❤️‍&#x1f525; 新星计划遇善者 - 出道即是巅峰MVP❤️‍&#x1f525; 知行合一心依旧 - 初心不改坚持创作❤️‍&#x1f525; 知易行难搞规划 - 这是不能说的秘密❤️‍&#x1f…

中国为何就不能有自己的豪华MPV?

文|智能相对论作者| 陈明涛是时候重新认识海外汽车品牌和国产汽车品牌的MPV了。去年&#xff0c;曾有雷克萨斯LM在碰撞后出现全车车门无法打开&#xff0c;之后车辆起火酿成悲剧&#xff0c;引发了全网对MPV碰撞安全的高度关注。前段时间丰田埃尔法再登热搜&#xff0c;这次不是…

2023最新Python国内镜像源,亲测可用

1、镜像源 pip包管理工具可以下载第三方库到本地使用&#xff0c;第三方库的来源地址称之为镜像源&#xff0c;镜像源中存放了大量的开源库供我们下载使用。pip的默认镜像源地址在国外&#xff0c;下载很慢&#xff0c;本文收集了当前国内常用的镜像源&#xff0c;速率由快到慢…

Java多线程 - 定时器-并发与并行-线程生命周期

文章目录多线程补充定时器并发和并行线程的生命周期多线程补充 定时器 定时器介绍: 定时器是一种控制任务延时调用&#xff0c;或者周期调用的技术。 作用&#xff1a;闹钟、定时邮件发送。 定时器实现方式: 方式一&#xff1a;Timer 方式二&#xff1a; ScheduledExecutorSe…

java程序报错后的排错思路

目前总结出来三个字&#xff1a;看日志&#xff01; 而且是从左到右一个单词一个单词的看。   举个例子&#xff1a;   Spring框架下的一个Demo&#xff0c;启动时报出了以下错误。 一、看异常类型   首先,能看到异常是从引入的SpringFramework依赖中报出来的&#xf…

[数据结构基础]排序算法第三弹 -- 快速排序

目录 一. 快速排序的基本思想 二. 快速排序的递归实现 2.1 单趟快速排序的实现 2.1.1 Hoare法实现单趟快排 2.1.2 挖坑法实现单趟快排 2.1.3 前后指针法实现单趟快排 2.2 递归快排的整体实现 三. 快速排序的时间复杂度分析 四. 快速排序的非递归实现 4.1 快速排序非递…

Promise详解与手写实现

Promise详解与手写实现Promise1、Promise介绍与基本使用1.1 Promise概述1.2 Promise的作用1.3 Promise的使用2、Promise API3、Promise关键问题4、Promise自定义封装5、async与await5.1. mdn文档5.2.async函数5.3.await表达式5.4.注意Promise 1、Promise介绍与基本使用 1.1 P…

电商维权,维权方法汇总【超全】

电商维权&#xff0c;就是维护线上渠道中自己的合法权益&#xff0c;其中包括消费者维权、品牌方维权、卖家维权。今天&#xff0c;我们来聊一聊消费者维权。 1、 维权类型 消费者在网购过程中难免遇到各种问题&#xff0c;主要就是产品质量问题、产品价格问题、产品售后问题、…

JavaWeb-VUEElement

JavaWeb-VUE&Element 1&#xff0c;VUE 1.1 概述 Vue 是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写。 Mybatis 是用来简化 jdbc 代码编写的&#xff1b;而 VUE 是前端的框架&#xff0c;是用来简化 JavaScript 代码编写的。前一天我们…

PID控制的方波响应

被控对象为一延迟对象&#xff1a;采样时间为20s&#xff0c;延迟时间为4个采样时间&#xff0c;即 80s&#xff0c;被控对象离散化为&#xff1a;y(k) -den(2)y(k- 1)num(2)u(k - 5)由于方波信号的速度、加速度不连续&#xff0c;当位置跟踪指令为方波信号时&#xff0c;如采用…

C++ 树进阶系列之树状数组的树形之路

1. 前言 树状数组也称二叉索引树&#xff0c;由Peter M. Fenwick于1994发明&#xff0c;也可称为Fenwick树。 树状数组的设计非常精巧&#xff0c;多用于求解数列的前缀和、区间和等问题&#xff0c;为区间类型问题提供了模板式解决方案。 数状数组简单易用&#xff0c;但对…

【100个 Unity实用技能】 | 修改Unity UI控件中默认字体配置

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

【C++提高编程1】一文带你吃透函数模板和类模板(附测试用例源码、测试结果图及注释)

&#x1f4dd;我的个人主页 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​&#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f58a;✉️今天你做别人不想做的事&…

域内权限维持:注入SSP

01、简介 SSP(Security Support Provider)是Windows操作系统安全机制的提供者。简单地说&#xff0c;SSP是个DLL文件&#xff0c;主要用来实现Windows操作系统的身份认证功能。在系统启动时&#xff0c;SSP 将被加载到lsass.exe进程中&#xff0c;攻击者通过自定义恶意的DLL文件…

解决ModuleNotFoundError: No module named ‘torch.fx‘

运行yolo v5 train python train.py 报错 ModuleNotFoundError: No module named ‘torch.fx’ torch版本不匹配 目前版本torchu1.7 #卸载pytorch pip uninstall torch 再安装 python -m pip install torch -i https://mirrors.aliyun.com/pypi/simple/ python -m pip是…

本周大新闻|Quest Pro降价至1099美元,传苹果AIGC或用于XR内容生成

本周大新闻正值春节假期&#xff0c;因此包含近两周&#xff08;1月16-1月29日&#xff09;的AR/VR新闻汇总。关于2022&#xff0c;近期我们发布了2022年AR/VR行业融资报告、2022年AR硬件总结、2022年VR硬件总结。AR方面&#xff0c;最新消息称苹果AIGC曝光&#xff0c;或用Sir…