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

2023-05-16

数据结构

文章目录

  • 数据结构
  • 一、什么是顺序表
  • 二、顺序表的创建
    • 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("销毁成功");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——顺序表(三) 的相关文章

随机推荐

  • 攻防世界 web练习区

    目录 view source robots backup cookie disabled button weak auth simple php get post xff referer webshell command execution
  • 网络安全编程基础--使用结构体数组完成信息录入

    实验1 xff1a C语言基础实验 目录 实验1 xff1a C语言基础实验 实验步骤分析 xff1a 1 定义结构体 xff1a 2 信息录入 3 信息修改 4 信息展示 5 主函数编写 结果展示 xff1a 源代码 xff1a 实验设备
  • 服务端和客户端通信-TCP(含完整源代码)

    简单TCP通信实验 目录 简单TCP通信实验 分析 1 套接字类型 2 socket编程步骤 3 socket编程实现具体思路 实验结果截图 程序代码 实验设备 xff1a 目标系统 xff1a windows 软件工具 xff1a vs2
  • 汇编语言--实验四

    实验名称 xff1a BX 和loop的使用 一 xff1a 实验目的 学会使用 bx 和loop 使用debug练习一些简单的编程 练习使用debug调试汇编程序的方法 二 xff1a 实验内容及步骤 内容 xff1a xff08 1 x
  • 汇编语言--实验七

    实验名称 xff1a 寻址方式在结构化数据访问中的应用 一 xff1a 实验目的 学会寻址方式在结构化数据访问中的应用 xff1b 利用前面所学知识熟悉编程技巧 二 xff1a 实验内容及步骤 内容 xff1a xff08 1 xff09
  • 汇编语言--实验九

    实验名称 xff1a 根据材料编程 目录 实验名称 xff1a 根据材料编程 一 xff1a 实验目的 二 xff1a 实验内容及步骤 内容 xff08 1 xff09 步骤 xff08 1 xff09 结果 xff08 1 xff09 三
  • Visual Studio 2022 C++开发 (Win)配置教程

    前言 本文将讲解如何在Window系统下配置Visual Studio 2022版本的C 43 43 开发环境 步骤 下载并且安装Visual Studio Tools xff08 1 xff09 下载 Visual Studio Tool
  • template < class T> ,map和vector用法——恶补c++

    部分目录 template lt class T gt 是什么找到各素数因子map数组下用法map遍历map元素的默认值 vector 用法 template lt class T gt 是什么 template lt class T gt
  • 停车场寻车系统(识别车牌,手机app查询相关信息)

    停车场寻车系统 文章目录 停车场寻车系统前言一 手机app二 车牌识别三 数据查询总结 停车场寻车系统 前言 上个星期用了一周左右做了一个停车场寻车系统的项目 xff0c 可以识别车牌 xff0c 通过手机app查询车辆信息 一 手机app
  • K210+MLX90614红外测温

    红外测温 文章目录 红外测温前言一 MLX90614二 使用步骤总结 前言 K210随便找一个都行 一 MLX90614 这个模块之前的博客有介绍 xff0c 他是用IIC通信的 模块就不过多介绍了 xff0c 之间看代码吧 import
  • PHP mysql_connect()连接-已淘汰

    1 首先在mysql命令控制台新建数据库 mysql gt create database test Query OK 1 row affected 0 04 sec mysql gt use test Database changed m
  • STM32使用红外测温

    红外测温 文章目录 红外测温前言一 原理二 STM32代码1 MLX90614 c2 MLX90614 h 总结 前言 一 原理 红外测温的原理可以直接去看卖家的手册 xff0c 手册多余的话太多了 xff0c 知道他是IIC通信的就行了
  • Arduino——PAJ7620手势识别模块

    手势识别模块 文章目录 手势识别模块前言一 安装PAJ7620库二 代码 前言 在用arduino驱动这些模块得时候 xff0c 方法很简单 xff0c 先去管理库中找这个库 xff0c 如果有这个库 xff0c 然后下载这个库 xff0c
  • Arduino——正点原子sim800c模块

    sim800c 文章目录 sim800c前言一 arduino代码 前言 最近要做一个项目需要用到sim800c xff0c 就用arduino驱动一下吧 xff0c 用的是正点原子的sim800c 使用的时候最好使用12v1A供电 xff
  • Arduino——野火GPS模块

    GPS模块 文章目录 GPS模块前言一 Arduino代码 前言 手上还有一个GPS xff0c 用arduino做模块很方便 xff0c 打算和短信模块结合 xff0c 短信模块上次已经使用完成了 xff0c 这次学习一下GPS模块 看模
  • Arduino——GY39大气压、温湿度、光照模块

    GY39模块 文章目录 GY39模块前言一 模块介绍二 arduino代码 前言 前几天买东西的时候买了一个GY39 xff0c 这个模块集成了温湿度 xff0c 大气压 xff0c 海拔 xff0c 光照一体 xff0c 使用起来很方面
  • Arduino通过NRF24L01实现双机无线通信

    双机无线通信 文章目录 双机无线通信前言一 接线二 Arduino代码1 主机2 从机 总结 前言 无线通信对于做各种项目来说都很加分 xff0c 今天使用这个nrf模块进行无线通信 我原本是想用两个蓝牙的 xff0c 但是蓝牙有个缺点 x
  • STM32+ESP8266+机智云+DHT11数据上传

    机智云 文章目录 机智云前言一 工程的修改二 数据的上传1 标识符2 数据处理3 数据上传 三 app控制 前言 今天搞了一下机智云 xff0c 就想把温湿度发到app上去 xff0c 然后能够控制灯的开关 之前从来没有用过这个玩意 xff
  • 数据结构——线性结构(二)

    数据结构 文章目录 数据结构前言一 线性结构1 线性表2 线性表的特点 二 线性结构的存储形式1 顺序结构2 链式结构 前言 很早之前提到了数据结构 xff0c 上一篇博客简单介绍了什么是线性结构 xff0c 这篇博客简单做一个补充 常见的
  • 数据结构——顺序表(三)

    数据结构 文章目录 数据结构一 什么是顺序表二 顺序表的创建1 静态顺序表2 动态数据表 三 顺序表的初始化 销毁四 顺序表的插入1 尾插2 头插3 任意插入 总结 一 什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线