C语言线性表实现:顺序表

news2024/9/28 15:21:11

文章目录:

  • 概念理解:
  • 1. 动态顺序表结构体:
  • 2. 顺序表动态初始化:
  • 3. 顺序表扩容:
  • 4. 插入:
  • 5. 删除:
  • 6. 按位序查找:
  • 7. 按值查找:
  • 8. 输出顺序表:
  • 9. 判断顺序表是否相等:
  • 10.测试:

概念理解:

线性表:一种逻辑结构。
顺序表:采用顺序存储方式实现的线性表。

位序:从1开始。
数组下标:从0开始。

&引用符的使用:
函数参数带&和不带&的区别。

malloc:申请一整片连续的存储空间,返回一个指向该空间首地址的指针。
free:释放一整片连续的存储空间。

1. 动态顺序表结构体:

//顺序表的动态分配
#define InitSize 10 //初始大小
typedef struct{
	int* data;//指针,指向动态分配的内存空间的首地址
	int length;//该顺序表的长度
	int MaxSize;//该顺序表的最大长度
}SeqList;

2. 顺序表动态初始化:

void InitList(SeqList &L){//初始化顺序表,包括给顺序表L动态分配内存空间,设置顺序表当前长度为0,设置顺序表最大长度100
	L.data = (int*)malloc(sizeof(int) * InitSize);
	L.length = 0;
	L.MaxSize = 100;	
}

3. 顺序表扩容:

void IncreaseSize(SeqList &L,int len){//顺序表扩容
	int* p = L.data;//创建一个指针指向顺序表当前内存空间的首地址,方便回收
	L.data = (int*)malloc(sizeof(int) * (L.MaxSize+len));//重新请求一块更大的内存空间分配给该顺序表
	L.MaxSize += len;//修改顺序表最大长度
	for(int i=0;i<=L.length;i++){
		L.data[i] = p[i];//将原内存空间中的数据复制到新申请的空间中
	}
	free(p);//释放原来的内存空间
}

4. 插入:

bool ListInsert(SeqList &L,int i,int e){//插入元素e到顺序表位序为i的位置
	if(i<1 || i>L.length+1){//判断插入位置是否合法
		return false;
	}
	if(L.length == L.MaxSize){//判断顺序表是否已满
		return false;
	}
	for(int j=L.length;j<=i;j++){//i位置及之后的元素后移一位(这里注意区分位序和数组下标的关系)
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;//插入数据
	L.length++;//注意别忘了顺序表长度+1
	return true;
}

5. 删除:

bool ListDelete(SeqList &L,int i,int &e){//删除顺序表为序为i的数据元素,并将该元素的值赋给e
	if(i<1 || i>L.length){
		return false;
	}
	e = L.data[i-1];//将被删除的元素的值赋值给e
	for(int j=i;j<L.length;j++){//位序i之后的元素前移
		L.data[j-1] = L.data[j];
	}
	L.length--;//注意别忘了顺序表长度-1
	return true;
}

6. 按位序查找:

int getElem(SeqList L,int i){//按位序查找,返回该位序上的元素
	if(i<1 || i>L.length){//判断位置是否合法
		return -1;
	}
	return L.data[i-1];
}	

7. 按值查找:

int LocateElem(SeqList L,int e){//按值查找,返回该值的位序
	for(int j=0;j<L.length;j++){
		if(L.data[j] == e){
			return j+1;//返回的是位序
		}
	}
	return -1;
}

8. 输出顺序表:

void printList(SeqList L){//输出顺序表的元素
	printf("[");
	for(int i=0;i<L.length;i++){
		printf("%d ",L.data[i]);
	}
	printf("]\n");
}

9. 判断顺序表是否相等:

bool equalsList(SeqList L1,SeqList L2){//判断顺序表内容是否相同
	if(L1.MaxSize == L2.MaxSize){
		if(L1.length == L2.length){
			for(int i=0;i<L1.length;i++){
				if(L1.data[i] == L2.data[i]){
					continue;
				}
			}
		}
		return true;
	}
	return false;
}

10.测试:

#include <stdio.h>
#include <stdlib.h>//使用malloc和free关键字需要引入这个库

//顺序表的动态分配
#define InitSize 10 //初始大小
typedef struct{
	int* data;//指针,指向动态分配的内存空间的首地址
	int length;//该顺序表的长度
	int MaxSize;//该顺序表的最大长度
}SeqList;

void InitList(SeqList &L){//初始化顺序表,包括给顺序表L动态分配内存空间,设置顺序表当前长度为0,设置顺序表最大长度100
	L.data = (int*)malloc(sizeof(int) * InitSize);
	L.length = 0;
	L.MaxSize = 100;	
}

void IncreaseSize(SeqList &L,int len){//顺序表扩容
	int* p = L.data;//创建一个指针指向顺序表当前内存空间的首地址,方便回收
	L.data = (int*)malloc(sizeof(int) * (L.MaxSize+len));//重新请求一块更大的内存空间分配给该顺序表
	L.MaxSize += len;//修改顺序表最大长度
	for(int i=0;i<=L.length;i++){
		L.data[i] = p[i];//将原内存空间中的数据复制到新申请的空间中
	}
	free(p);//释放原来的内存空间
}

bool ListInsert(SeqList &L,int i,int e){//插入元素e到顺序表位序为i的位置
	if(i<1 || i>L.length+1){//判断插入位置是否合法
		return false;
	}
	if(L.length == L.MaxSize){//判断顺序表是否已满
		return false;
	}
	for(int j=L.length;j<=i;j++){//i位置及之后的元素后移一位(这里注意区分位序和数组下标的关系)
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;//插入数据
	L.length++;//注意别忘了顺序表长度+1
	return true;
}

bool ListDelete(SeqList &L,int i,int &e){//删除顺序表为序为i的数据元素,并将该元素的值赋给e
	if(i<1 || i>L.length){
		return false;
	}
	e = L.data[i-1];//将被删除的元素的值赋值给e
	for(int j=i;j<L.length;j++){//位序i之后的元素前移
		L.data[j-1] = L.data[j];
	}
	L.length--;//注意别忘了顺序表长度-1
	return true;
}

int getElem(SeqList L,int i){//按位序查找,返回该位序上的元素
	if(i<1 || i>L.length){//判断位置是否合法
		return -1;
	}
	return L.data[i-1];
}	
 
int LocateElem(SeqList L,int e){//按值查找,返回该值的位序
	for(int j=0;j<L.length;j++){
		if(L.data[j] == e){
			return j+1;//返回的是位序
		}
	}
	return -1;
}

void printList(SeqList L){//输出顺序表的元素
	printf("[");
	for(int i=0;i<L.length;i++){
		printf("%d ",L.data[i]);
	}
	printf("]\n");
}

bool equalsList(SeqList L1,SeqList L2){//判断顺序表内容是否相同
	if(L1.MaxSize == L2.MaxSize){
		if(L1.length == L2.length){
			for(int i=0;i<L1.length;i++){
				if(L1.data[i] == L2.data[i]){
					continue;
				}
			}
		}
		return true;
	}
	return false;
}

int main(){
	SeqList L1;//声明一个顺序表
	InitList(L1);//初始化顺序表
	
	//初始化、扩容测试
	printf("顺序表当前内存空间的首地址:%d\n",&L1.data[0]);
	printf("顺序表当前最大长度:%d\n",L1.MaxSize);
	IncreaseSize(L1,5);//扩容顺序表,扩容长度为5
	printf("顺序表当前内存空间的首地址:%d\n",L1.data);
	printf("顺序表当前最大长度:%d\n",L1.MaxSize);
	
	//插入、输出测试
	ListInsert(L1,1,5);
	printList(L1);
	
	//按位查找、按值查找测试
	printf("顺序表中位序为1的元素为:%d\n",getElem(L1,1));
	printf("顺序表中元素5的位序为:%d\n",LocateElem(L1,5));
	
	//删除测试
	int a;
	ListDelete(L1,1,a);
	printf("删除的元素为:%d\n",a);
	printList(L1);
	
	//判断顺序表数据相等测试
	SeqList L2;//声明一个顺序表
	InitList(L2);//初始化顺序表	
	ListInsert(L1,1,3);
	ListInsert(L2,1,8);
	printf("顺序表L1和L2是否相等:%d\n",equalsList(L1,L2));
	ListDelete(L1,1,a);
	ListInsert(L1,1,8);
	IncreaseSize(L2,5);
	printf("顺序表L1和L2是否相等:%d\n",equalsList(L1,L2));
	
	return 0;
}

在这里插入图片描述

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

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

相关文章

UniSCA漏洞优先级排序

当谈到开源漏洞时&#xff0c;我们会发现它们似乎永远处于增长状态。事实上&#xff0c;UniSCA的开源风险报告显示&#xff0c;与2021年同期相比&#xff0c;2022年前9个月添加到UniSCA漏洞数据库中的开源软件漏洞数量增长了33% 。然而&#xff0c;虽然有些漏洞会带来严重的业务…

Altium Designer 20 凡亿教育视频学习-04

第四部分学习 unknow pin错误原因 将原理图导入到PCB时会出现问题 管脚未使用报错 导入PCB器件全部绿 删掉下面的紫红色框架即可&#xff08;Sheet2&#xff09; 视频讲的方法是&#xff1a;一开始把所有的规则删掉&#xff0c;只保留电气规则 板子大小评估-把器件聚集在一…

16---实现权限菜单管理(一)

1、实现角色管理 建role表 USE management; DROP TABLE IF EXISTS role;CREATE TABLE role (id int(11) NOT NULL AUTO_INCREMENT COMMENT id,name varchar(50) DEFAULT NULL COMMENT 名称,description varchar(255) DEFAULT NULL COMMENT 描述,PRIMARY KEY (id) ) ENGINEInn…

活动星投票最美空姐网络评选微信的投票方式线上免费投票

如何进行“最美空姐”的投票活动_投票小程序投票_投票助力方式大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。我们现在要以“最美空姐”为主题进行一次投票活动&#xff0…

Docker 三剑客

Docker 三剑客包括Docker Machine、Docker Compose、Docker Swarm。 1. Docker Machine 1.1 简介 Docker Machine 是 Docker 官方三剑客项目之一&#xff0c;使用它可以在多个平台上快速安装部署Docker环境&#xff0c;还可以在短时间内快速构建起一套Docker主机集群。 Do…

最近手头有点紧,于是用Python来冲一波股票...

文章目录前言准备工作获取数据部分爬虫的基本流程代码展示数据可视化分析最后前言 快过年了&#xff0c;手头有点紧&#xff0c;但是作为一个男人&#xff0c;身上怎么能够没有大把钞票呢&#xff1f; 于是我决定用Python来分析一波股票&#xff0c;赢了会所嫩*&#xff0c;输…

在线设计邀请函

不用ps就能制作邀请函的工具&#xff01;在线就能搞定你的邀请函设计和链接分享&#xff01;只要跟着小编下面的设计步骤&#xff0c;掌握在线工具乔拓云轻松设计在线邀请函&#xff0c;在线一键就能生成活动邀请函和邀请函链接&#xff0c;下面就跟着小编的教学开始学习如何在…

【力扣经典题目】复制带随机指针的链表,穿插链表法

题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的…

接口的理解

文章目录一、接口匿名实现类、匿名对象练习1练习2JDK8接口的新特性一、接口 1、接口使用interface定义 2、Java中接口和类是并列结构 3、如何定义接口——定义接口中的成员 JDK7之前&#xff1a;只能定义全局常量和抽象方法 全局常量&#xff1a;public static final的&#x…

力扣 2042. 检查句子中的数字是否递增

题目 句子是由若干 token 组成的一个列表&#xff0c;token 间用 单个 空格分隔&#xff0c;句子没有前导或尾随空格。每个 token 要么是一个由数字 0-9 组成的不含前导零的 正整数 &#xff0c;要么是一个由小写英文字母组成的 单词 。 示例&#xff0c;“a puppy has 2 eye…

【MySQL】-【索引】

目录为什么使用索引InnoDB中索引的推演索引前的查找设计索引简单的索引设计方案InnoDB中的索引方案为什么使用索引 一、hashmap底层使用红黑树 二、索引时在存储引擎中实现的&#xff0c;因此不同存储引擎的索引可能不同 索引的优点&#xff1a; 类似大学图书馆建书目索引&am…

zookeeper看这一篇就够了

第一章 zookeeper简介 第1节 zookeeper的由来 1 2 3 41. zookeeper最早起源于雅虎研究院的一个研究小组 2. 在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,并且这个系统还有单点问题 3. 雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架…

GIS应用技巧之矢量数据编辑

挺多时候&#xff0c;需要对矢量数据进行编辑&#xff0c;那么如何编辑&#xff1f; 在ArcGIS中修改数据&#xff0c;首先要开始编辑&#xff0c;启动编辑工具条&#xff08;Editor&#xff09;。 目前编辑器处于灰色状态说明没有启动&#xff0c;那么还有些小伙伴可能在GIS主…

【项目实战】传智健康

&#x1f31f;个人博客&#xff1a;www.hellocode.top&#x1f31f; &#x1f31f;Java知识导航&#xff1a;Java-Navigate&#x1f31f; ⭐想获得更好的阅读体验请前往Java-Navigate &#x1f525;本文专栏&#xff1a;《流行框架》 &#x1f31e;如没有JavaWEB基础&#xff0…

Wireshark抓Telnet包及报文分析

Wireshark抓Telnet包及报文分析 Telnet作为应用层第二大协议&#xff0c;用途很多滴。 Telnet到底是个啥子 TELNET协议一种简单的基于文本的协议&#xff0c;它可以用来实现远程终端&#xff0c;让用户可以远程对服务器进行操作。尽管现在的远程终端基本上是基于 ssh 的了&am…

GO语言定时任务实战-gocron包

文章目录1. 基本使用1.1 初始化实例 new()1.2 添加定时任务 AddFunc()1.3 开始定时任务 Start()1.4 完整示例1.5 第一次执行定时任务的契机1.6 spec 的设置2. 粒度到秒2.1 语法示例2.2 完整示例3. 按时间间隔3.1 语法3.2 完整示例&#xff08;every&#xff09;3.3 完整示例引用…

AcWing 4721. 排队(单调栈+二分法)

问题描述 n 个小朋友排成一排&#xff0c;从左到右依次编号为 1∼n。 第 i 个小朋友的身高为 hi。 虽然队伍已经排好&#xff0c;但是小朋友们对此并不完全满意。 对于一个小朋友来说&#xff0c;如果存在其他小朋友身高比他更矮&#xff0c;却站在他右侧的情况&#xff0c…

【闲聊杂谈】纤程的概念

首先要明白几个概念&#xff1a;程序、进程、线程、纤程。 如果要非常严格的定义上来说的话&#xff0c;进程是操作系统用来做资源调度的基本单位。后来发现进程的切换是在的太费资源了&#xff0c;于是诞生了线程&#xff1b;线程多了来回切换还是很费资源&#xff0c;于是又…

[Linux]Linux项目自动化构建工具-make/Makefile

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

FX5U-相对定位指令DRVI(DDRVI )两种写法

该指令通过增量方式(采用相对地址的位置指定)&#xff0c;进行1速定位。 以当前停止的位置作为起点&#xff0c;指定移动方向和移动量(相对地址)进行定位动作。如果驱动触点置为ON,则输出脉冲&#xff0c;并开始从偏置速度进行加速动作。到达指令速度后&#xff0c;以指令速度进…