顺序表的实现(上)(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/320118.html

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

相关文章

网络爬虫丨基于scrapy+mysql爬取博客信息并保存到数据库中

文章目录 写在前面实验描述实验框架实验需求 实验内容1.安装依赖库2.创建Scrapy项目3.配置系统设置4.配置管道文件5.连接数据库6.分析要爬取的内容7.编写爬虫文件 运行结果写在后面 写在前面 本期内容&#xff1a;基于scrapymysql爬取博客信息并保存到数据库中 实验需求 ana…

java并发编程

一、java线程 1.三种创建线程的方式 Integer sum futureTask.get(); 会等待其对应的线程执行完 &#xff0c;即阻塞 再获得结果。 所以我在测试时&#xff0c;出现一个小插曲 Slf4j public class ThreeWays {//1.自定义MyThread进行继承Threadstatic void test001(){Thread t…

HCIA-Datacom题库(自己整理分类的)_09_Telnet协议【14道题】

一、单选 1.某公司网络管理员希望能够远程管理分支机构的网络设备&#xff0c;则下面哪个协议会被用到&#xff1f; RSTP CIDR Telnet VLSM 2.以下哪种远程登录方式最安全&#xff1f; Telnet Stelnet v100 Stelnet v2 Stelnet v1 解析&#xff1a; Telnet 明文传输…

DAY7--learning english

一、积累 1.instinct Bro showed me his primal instinct 老兄给我展示他原始的本能&#xff08;返祖现象&#xff09;. 2. assembly Todays assembly is about part of journey. 今天的集会是讲述关于旅程的一部分。 3.aluminum Aluminum Casting Motocycle Engine Cover. …

【优选算法】专题四:前缀和(一)

文章目录 DP34 【模板】前缀和DP35 【模板】二维前缀和724.寻找数组的中心下标238.除自身以外数组的乘积 DP34 【模板】前缀和 DP34 【模板】前缀和 此方法的时间复杂度是O(Q)O(N); import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public cl…

LeetCode讲解篇之2280. 表示一个折线图的最少线段数

文章目录 题目描述题解思路题解代码 题目描述 题解思路 折线图中如果连续的线段共线&#xff0c;那么我们可以可以将其合并成一条线段 首先将坐标点按照横坐标升序排序 然后遍历数组 我们可以通过计算前一个线段的斜率和当前线段的斜率来判断是否共线 如果二者相等&#x…

[c语言]猜数字游戏

一男子学了分支与循环后&#xff0c;觉得的不够得劲&#xff0c;于是半夜打开浏览器查询了相关的学习资料&#xff0c;发现了猜数字这款游戏&#xff0c;然后他被这游戏深深的吸引毅然决然完成了这道题&#xff0c;玩了几把后并表示这比金铲铲、原神等游戏都要好玩。 猜数字&a…

从Demo理解Thrift Thrift和Dubbo的区别

文章目录 安装demo尝试Thrift协议栈Thrift 与 Dubbo 的区别 字节里的RPC框架都是用的Thrift&#xff0c;我猜这主要原因有2: Thrift是Facebook开源的项目&#xff0c;平台中立Thrift支持跨语言调用&#xff0c;这非常适合字节Java、Go语言都存在的环境&#xff0c;语言中立 但…

苹果电脑清理内存 怎么清理删不掉的软件

苹果电脑是很多人的首选&#xff0c;因为它有着优秀的性能和设计。但是&#xff0c;随着时间的推移&#xff0c;你可能会发现你的苹果电脑变得越来越慢&#xff0c;或者出现一些奇怪的问题。这可能是因为你的电脑内存不足&#xff0c;或者有一些删不掉的软件占用了你的空间和资…

非常非常实用!不能错过,独家原创,9种很少人听过,但却实用的混沌映射!!!以鲸鱼混沌映射为例,使用简便

很多人在改进的时候&#xff0c;想着增加混沌映射&#xff0c;增加初始种群的多样性&#xff0c;可是&#xff0c;大多数论文中常见的映射&#xff0c;都被别人使用了&#xff0c;或者不知道被别人有没有使用&#xff0c; 本文介绍9种很少人知道&#xff0c;但非常实用混沌映射…

完成源示例

本主题演示如何创作和使用自己的完成源类&#xff0c;类似于 .NET 的 TaskCompletionSource。 completion_source 示例的源代码 下面的列表中的代码作为示例提供。 其目的是说明如何编写自己的版本。 例如&#xff0c;支持取消和错误传播不在此示例的范围内。 #include <w…

isis实验

根据要求制作大概&#xff1a; 使用isis配置路由器&#xff1a; 配置好物理接口地址后配置isis 为实现r1访问r5的环回走r6,需要在r6上制作路由泄露&#xff1a; 在r5上产生r1的路由明细&#xff1a; 全网可达&#xff1a;

竞赛练一练 第28期:GESP和电子学会相关题目练习

CIE一级2023.03_足球射门练习 1. 准备工作 &#xff08;1&#xff09;选择背景Soccer&#xff0c;Soccer 2&#xff1b; &#xff08;2&#xff09;保留默认小猫角色&#xff0c;添加角色&#xff1a;Soccer Ball&#xff1b; &#xff08;3&#xff09;给Soccer Ball添加声…

【C++】“Hello World!“

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 ​ 2024.1.14 纪念一下自己编写的第一个C程序 #include<iostream>int main() {/*我的第一个C程序*/std::cout << "Hello world!:>" <<std::endl;ret…

vscode打开c_cpp_properties.json文件的一种方式

步骤一 点击win32 步骤二 点击json 自动生成了

小程序开发公司哪家好?哪家最好?

小程序具有轻量、聚焦、快捷等特点&#xff0c;这有别于 web 端类和移动端 app 类产品。 小程序的第一印象非常关键&#xff0c;因此对于首页设计&#xff0c;关键要加强注意力表达&#xff0c;给予用户尽可能直观的信息感知&#xff0c;加快建立其对于业务价值的兴趣&#xf…

C++ Webserver从零开始:基础知识(三)——Linux服务器程序框架

目录 前言 一.服务器编程基础框架 C/S模型 主要框架 二.I/O模型 阻塞I/O 非阻塞I/O 异步I/O 三.两种高效的事件处理模式 Reactor Proactor 四.模拟Proactor模式 五.半同步/半异步的并发模式 六.有限状态机 七.其他提高服务器性能的方法 池 数据复制 上下文切换…

前端性能优化之数据存取,存储以及缓存技术

无论是哪种计算机语言&#xff0c;说到底它们都是对数据的存取与处理。若能在处理数据前&#xff0c;更快地读取数据&#xff0c;那么必然会对程序执行性能产生积极的作用。 一般而言&#xff0c;js的数据存取有4种方式。 直接字面量:字面量不存储在特定位置也不需要索引&…

WEB前端人机导论实验-实训3超链接与多媒体文件应用

1.项目1 设计简易灯箱画廊 A.题目要求&#xff1a; 编程实现简易灯箱画廊&#xff0c;鼠标单击任一个图像超链接&#xff0c;在底部浮动框架中显示大图像&#xff0c;效果如下的页面。 B.思路: &#xff08;1&#xff09;CSS样式&#xff1a; a.在样式中对body元素进行居中…

力扣-盛最多水的容器

11.盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜…