顺序表的实现(C语言)

本文章主要对顺序表的介绍以及数据结构的定义,以及几道相关例题,帮助大家更好理解顺序表.

文章目录

前言

一、顺序表的静态实现

二、顺序表的动态实现

三.定义打印顺序表函数

四.定义动态增加顺序表长度函数

五.创建顺序表并初始化

六.顺序表的按位查找

七.顺序表的按值查找

八.顺序表删除第i个元素

九.在第i个元素前插入e

十.从顺序表中删除最小元素,其空出的位置用最后一个元素填补

十一.在无序顺序表中删除值在s和t之间的元素

十二.所有代码及运行结果

总结


前言

顺序表,如果对顺序表的知识点没有了解,建议先学完一定的基础知识再来学习.

由于本人没有太多时间编写介绍顺序表的知识,请谅解.


一、顺序表的静态实现

typedef int Elemtype;
typedef struct Sqlist {
Elemtype qlist[Maxsize];//静态分配数组
int length;//元素个数
}Sqlist;

顺序表的静态实现就是我们常说的数组,我们定义了一个结构题来封装,结构体中记录数据,以及元素长度.

二、顺序表的动态实现

typedef int ElemType;
typedef struct Sqlist {
	Elemtype* qlist;//data
	int length;//元素个数
	int maxsize;//可存储最大元素个数
};

顺序表的动态实现,就是定义一个指针,指向一个数组,这里动态分配是指,你可以使用malloc函数自己申请空间,结构体中记录了数据去qlist,元素长度lengeh,最大元素个数maxsize

三.定义打印顺序表函数

//定义打印顺序表函数
void print(Sqlist L) {
	for (int i = 0; i < L.length; i++) {//顺序遍历顺序表
		printf("%d ", L.qlist[i]);
	}

	printf("\n顺序表长度为:%d\n", L.length);
	printf("总大小为:%d\n", L.maxsize);
}

就是一个简单的for loop,注意数组下表从零开始.

四.定义动态增加顺序表长度函数

//定义动态增加数组长度函数
void Increasesize(Sqlist &L,int len) {
	Elemtype* p = L.qlist;
	L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize + len));//动态增加数组长度
	assert(L.qlist);
	for (int i = 0; i < L.length; i++) {//复制原表信息
		L.qlist[i] = p[i];//提示可能会越界,可忽略
	}
	free(p);
	p = NULL;
	L.maxsize = L.maxsize + len;//总大小发生改变
}

重新申请一片更大的内存,别忘了改变顺序表的总大小.

五.创建顺序表并初始化

//例1:定义创建顺序表并初始化函数
void InitSqlist(Sqlist &L) {//初始化空间为20,长度为10,{ 0,1,2,3,4,5,6,7,8,9 }
	L.maxsize = Max;
	L.length = 10;
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize));
	for (int i = 0; i < L.length; i++) {
		L.qlist[i] = arr[i];
	}
}

六.顺序表的按位查找

//定义顺序表的按位查找函数
Elemtype GetElem(Sqlist L, int i) {
	if (i<0 || i>L.length - 1) {//判断是否越界
		printf("查找失败!\n");
		return false;
	}
	return L.qlist[i-1];
}

七.顺序表的按值查找

//定义顺序表的按值查找函数
int findElem(Sqlist L,Elemtype e) {
	for (int i = 0; i < L.length; i++)
	{
		if (L.qlist[i] == e) return i + 1;//返回第几个元素
	}
	printf("查找失败!\n");
    return -1;
}

八.顺序表删除第i个元素

//例2:从顺序表删除第i个元素
void deleteElem(Sqlist& L, int i,Elemtype &e) {
	if (i<0 || i>L.length) {//判断是否越界
		printf("删除失败!\n");
		return;
	}
	e = L.qlist[i - 1];
	for (int j = i; j < L.length; j++) {
		L.qlist[j - 1] = L.qlist[j];
	}
	L.length--;
}

注意:顺序表删除元素或者插入元素为保证元素的有序性,必须移动元素.

九.在第i个元素前插入e

//例3:在第i个元素前插入e
void insert(Sqlist& L, int i, Elemtype e) {
	if (i<=L.length && i>0 && L.length<L.maxsize){
		for (int j = L.length - 1; j >= i - 1; j--) {
			L.qlist[j + 1] = L.qlist[j];
		}
		L.qlist[i - 1] = e;
		L.length++;
		printf("true\n");
	}
	else printf("false\n");
}

十.从顺序表中删除最小元素,其空出的位置用最后一个元素填补

//例4:从顺序表中删除最小元素,其空出的位置用最后一个元素填补
void deleteMin(Sqlist &L,Elemtype &e) {
	int min = 0;
	for (int i = 1; i < L.length ; i++) {
		if (L.qlist[i] < L.qlist[min]) {
			min = i;
		}
	}
	e = L.qlist[min];
	L.qlist[min] = L.qlist[L.length - 1];
	L.length--;
}

十一.在无序顺序表中删除值在s和t之间的元素

//例5:在无序顺序表中删除值在s和t之间的元素
void deletest(Sqlist &L, int s, int t) {
	int curlength = 0;
	for (int i = 0; i < L.length;i++) {
		if (L.qlist[i] <= s || L.qlist[i] >= t) {
			L.qlist[curlength++] = L.qlist[i];
		}
	}
	L.length = curlength;
}

这个只需用本身的数组就可以原地完成,

十二.所有代码及运行结果

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#define Max 20
//顺序表的静态分配
typedef int Elemtype;
//typedef struct Sqlist {
//	Elemtype qlist[Maxsize];//静态分配数组
//	int length;//元素个数
//}Sqlist;

//顺序表的动态分配
typedef struct Sqlist {
	Elemtype* qlist;
	int length;
	int maxsize;
};
//定义打印顺序表函数
void print(Sqlist L) {
	for (int i = 0; i < L.length; i++) {//顺序遍历顺序表
		printf("%d ", L.qlist[i]);
	}

	printf("\n顺序表长度为:%d\n", L.length);
	printf("总大小为:%d\n", L.maxsize);
}
//定义动态增加数组长度函数
void Increasesize(Sqlist &L,int len) {
	Elemtype* p = L.qlist;
	L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize + len));//动态增加数组长度
	assert(L.qlist);
	for (int i = 0; i < L.length; i++) {//复制原表信息
		L.qlist[i] = p[i];//提示可能会越界,可忽略
	}
	free(p);
	p = NULL;
	L.maxsize = L.maxsize + len;//总大小发生改变
}
//例1:定义创建顺序表并初始化函数
void InitSqlist(Sqlist &L) {//初始化空间为20,长度为10,{ 0,1,2,3,4,5,6,7,8,9 }
	L.maxsize = Max;
	L.length = 10;
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize));
	for (int i = 0; i < L.length; i++) {
		L.qlist[i] = arr[i];
	}
}
//定义顺序表的按位查找函数
Elemtype GetElem(Sqlist L, int i) {
	if (i<0 || i>L.length - 1) {//判断是否越界
		printf("查找失败!\n");
		return false;
	}
	return L.qlist[i-1];
}
//定义顺序表的按值查找函数
int findElem(Sqlist L,Elemtype e) {
	for (int i = 0; i < L.length; i++)
	{
		if (L.qlist[i] == e) return i + 1;//返回第几个元素
	}
	printf("查找失败!\n");
}
//例2:从顺序表删除第i个元素
void deleteElem(Sqlist& L, int i,Elemtype &e) {
	if (i<0 || i>L.length) {//判断是否越界
		printf("删除失败!\n");
		return;
	}
	e = L.qlist[i - 1];
	for (int j = i; j < L.length; j++) {
		L.qlist[j - 1] = L.qlist[j];
	}
	L.length--;
}
//例3:在第i个元素前插入e
void insert(Sqlist& L, int i, Elemtype e) {
	if (i<=L.length && i>0 && L.length<L.maxsize){
		for (int j = L.length - 1; j >= i - 1; j--) {
			L.qlist[j + 1] = L.qlist[j];
		}
		L.qlist[i - 1] = e;
		L.length++;
		printf("true\n");
	}
	else printf("false\n");
}
//例4:从顺序表中删除最小元素,其空出的位置用最后一个元素填补
void deleteMin(Sqlist &L,Elemtype &e) {
	int min = 0;
	for (int i = 1; i < L.length ; i++) {
		if (L.qlist[i] < L.qlist[min]) {
			min = i;
		}
	}
	e = L.qlist[min];
	L.qlist[min] = L.qlist[L.length - 1];
	L.length--;
}
//例5:在无序顺序表中删除值在s和t之间的元素
void deletest(Sqlist &L, int s, int t) {
	int curlength = 0;
	for (int i = 0; i < L.length;i++) {
		if (L.qlist[i] <= s || L.qlist[i] >= t) {
			L.qlist[curlength++] = L.qlist[i];
		}
	}
	L.length = curlength;
}
int main() {
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对Increasesize进行测试!\n");
	Sqlist L;
	InitSqlist(L);
	print(L);//打印顺序表以及信息
	Increasesize(L, 10);//增加数组总大小
	print(L);
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对按位查找函数GetElem进行测试!\n");
	int  a = GetElem(L, 5);//寻找第5个元素
	printf("a的值为:%d\n",a);
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对按值查找函数findElem进行测试!\n");
	int b = findElem(L, 9);//寻找元素9
	printf("b的值为:%d\n", b);
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对deleteElem进行测试!\n");
	int e = 0;
	deleteElem(L, 5, e);
	printf("e的值为:%d\n", e);
	print(L);
	InitSqlist(L);//初始化
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对insert进行测试!\n");
	insert(L, 5, 66);
	print(L);
	InitSqlist(L);//初始化
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对deleteMin进行测试!\n");
	int c = 0;
	deleteMin(L, c);
	printf("最小值c的值为:%d\n",c);
	print(L);
	InitSqlist(L);//初始化
	printf("+++++++++++++++++++++++++++++++++++++++\n");
	printf("对deletest进行测试!\n");
	deletest(L, 3, 8);
	print(L);
	return 0;

}

结果:


总结

大家一定要动手试一试,这有助于更好的理解数据结构,而且顺序表本身不是很难,文章中代码有些语句属于辅助作用,帮助大家理解,在答卷是可以去掉,代码记住思路,不要死机硬背,我相信如果实践了,考试时会得心应手,后续整个数据结构都会给大家介绍,包括树和图的大题,都帮助大家实现.如果有问题的话,在评论区我会帮助大家解答.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3 指令详解

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、v-model &#xff08;双向绑定功能&#xff09;二、v-bind(用于将一个或多个属性绑定到元素的属性或组件的 prop)三、v-if、v-else、v-else-if(用于根据条件选择性地渲染元素)四、v-show&#xff08;根…

塑料制品行业生产管理MES系统解决方案

塑料制品产业虽然有一定的规模和基础&#xff0c;但存在自主创新能力低、“散小乱”、品牌效应不明显、行业创新能力与庞大的产业不匹配或支撑不足等问题&#xff0c;塑料加工行业还处在质量型产业的初期&#xff0c;抗风险能力低。 注塑行业6大痛点&#xff1a; 1.生产效率低…

使用 MONAI 加载和保存各种格式的医学图像

本教程属于实战&#xff0c;手把手教你加载各种医学图像数据&#xff08;nii.gz, .dcm, .png等&#xff09;。并学会查看医学图像数据的元数据&#xff08;shape, affine, orientation&#xff09;。学会使用monai全方位了解你的数据&#xff0c;并把它用于之后的深度学习训练。…

IO进程线程day

1.实现互斥机制 #include <head.h>char buf[128]; //全局数组&#xff0c;临界资源//1、创建一个互斥锁 pthread_mutex_t mutex;//定义分支线程 void *task(void *arg) {while(1){//3、获取锁资源pthread_mutex_lock(&mutex);printf("分支线程中&…

字节跳动机器人研究团队:用大规模视频数据训练GR-1,机器人轻松应对复杂任务

最近 GPT 模型在 NLP 领域取得了巨大成功。GPT 模型首先在大规模的数据上预训练&#xff0c;然后在特定的下游任务的数据上微调。大规模的预训练能够帮助模型学习可泛化的特征&#xff0c;进而让其轻松迁移到下游的任务上。 但相比自然语言数据&#xff0c;机器人数据是十分稀…

【学习笔记】1、数字逻辑概论

1.1 数字信号 数字信号&#xff0c;在时间和数值上均是离散的。数字信号的表达方式&#xff1a;二值数字逻辑和逻辑电平描述的数字波形。 &#xff08;1&#xff09; 数字波形的两种类型 数值信号又称为“二值信号”。数字波形又称为“二值位形图”。 什么是一拍 一定的时…

最新ChatGPT网站系统源码+详细搭建部署教程+Midjourney绘画AI绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

Java学习苦旅(二十三)——二叉搜索树

本篇博客将详细讲解二叉搜索树。 文章目录 二叉搜索树概念操作查找插入删除 性能分析 结尾 二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -全局异常统一处理实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

Packet Tracer - Configure AAA Authentication on Cisco Routers

Packet Tracer - 在思科路由器上配置 AAA 认证 地址表 目标 在R1上配置本地用户账户&#xff0c;并使用本地AAA进行控制台和vty线路的身份验证。从R1控制台和PC-A客户端验证本地AAA身份验证功能。配置基于服务器的AAA身份验证&#xff0c;采用TACACS协议。从PC-B客户端验证基…

LeetCode 2807. 在链表中插入最大公约数【链表,迭代,递归】1279

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Java多线程技术11——ThreadPoolExecutor类的使用1

1 概述 ThreadPoolExecutor类可以非常方便的创建线程池对象&#xff0c;而不需要程序员设计大量的new实例化Thread相关的代码。 2 队列LinkedBlockingQueue的使用 public class Test1 {public static void main(String[] args) {LinkedBlockingQueue queue new LinkedBlocki…

LeetCode-移动零(283)

题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 思路&#xff1a; 这里的思路跟以前做过的去重复数字的思路有点像&…

字符输入输出 C语言xdoj16

问题描述&#xff1a; 通过键盘输入5个大写字母&#xff0c;输出其对应的小写字母&#xff0c;并在末尾加上“&#xff01;”。 输入说明&#xff1a; 5个大写字母通过键盘输入&#xff0c;字母之间以竖线“|”分隔。 输出说明&#xff1a; 输出5个大写字母对应的小写字母&…

多线程模板应用实现(实践学习笔记)

出处&#xff1a;B站码出名企路 个人笔记&#xff1a;因为是跟着b站的教学视频以及文档初步学习&#xff0c;可能存在诸多的理解有误&#xff0c;对大家仅供借鉴&#xff0c;参考&#xff0c;然后是B站up阳哥的视频&#xff0c;我是跟着他学。大家有兴趣的可以到b站搜索。加油…

webpack的性能优化(一)——分包优化

1.什么是分包&#xff1f;为什么要分包&#xff1f; 默认情况下&#xff0c;Webpack 会将所有代码构建成一个单独的包&#xff0c;这在小型项目通常不会有明显的性能问题&#xff0c;但伴随着项目的推进&#xff0c;包体积逐步增长可能会导致应用的响应耗时越来越长。归根结底这…

【Linux】进程信号——进程信号的概念和介绍、产生信号、四种产生信号方式、阻塞信号、捕捉信号、阻塞和捕捉信号的函数

文章目录 进程信号1.进程信号的概念和介绍2.产生信号2.1通过终端按键产生信号2.2 调用系统函数向进程发信号2.3 由软件条件产生信号2.4硬件异常产生信号 3.阻塞信号3.1信号在内核中的表示3.2信号集操作函数3.3sigprocmask 4.捕捉信号4.1内核如何实现信号的捕捉4.2 sigaction 进…

【AI视野·今日Robot 机器人论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 5 Jan 2024 Totally 11 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Machine Learning in Robotic Ultrasound Imaging: Challenges and Perspectives Authors Yuan Bi, Zhongliang Jiang, Felix D…

线性代数 --- 矩阵行列式的性质

Determinant det A|A| 矩阵的行列式是一个数&#xff0c;这个数能够反应一些关于矩阵的信息。行列式只对方阵有效。 若矩阵A为&#xff1a; 则A的行列式为&#xff1a; 性质1&#xff1a; 单位矩阵的行列式等于1 性质2&#xff1a;行与行之间的交换会改变det的正负号 以2x2单位…

Mybatis入门源码二:sql执行

后面开始分析sql执行的源码流程也就是这一部分 一、factory.openSession() 重点关注configuration.newExecutor这个方法&#xff0c;获取事务处理器比较简单&#xff0c;就是获取一个jdbc的事务管理器。 这个方法通过传入的执行器类型来创建不同的执行器&#xff0c;有simp…