数据结构:顺序表的基本操作!(C语言)

一、静态存储

#include <stdio.h>
#include <stdlib.h>

/*[1].定义静态顺序表的最大容量*/
#define MaxSize 10

/*[2].自定义数据元素的数据类型*/
typedef int ElemType; 

1. 静态分配的定义结构体 

/*[3].静态分配的结构体定义*/
typedef struct {
	ElemType data[MaxSize];  // 静态数组存放数据元素
	int length;  // 表长 
}SqList;   // 顺序表的类型定义

2.初始化顺序表 

/*[4].静态分配的顺序表的初始化*/ 
void InitSqList(SqList &L) {
	L.length = 0;
} 

3.插入操作 

/*[5].插入操作: 在第i位置插入一个元素e */
bool ListInsert(SqList &L, int i, ElemType e) {
	//判断插入的位置是否合法
	if (i < 1 || i > L.length + 1) {   // 插入可以在1~length+1位置插入 
		return false; 
	}
	//判断存储空间是否已满	
	if (L.length >= MaxSize) {
		return false;
	}
	for (int j=L.length; j>=i; j--) {
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;
	L.length++;
	return true;
}

4.删除操作

/*[6].删除操作: 删除第i个位置的元素,并将删除元素返回出去*/
bool ListDelete(SqList &L, int i, ElemType &e) {
	// 与插入不同的是删除只能删的位置是 1~length 
	if (i < 1 || i > L.length) { 
		return false;
	}
	e = L.data[i-1];  // 将删除元素的值返回出去
	for (int j=i; j<L.length; j++) {
		L.data[j-1] = L.data[j];
	} 
	L.length--;
	return true;
} 

5.查找操作

/*[7].查找操作(按值查找): 查找第一个值等于e的元素,并返回位序*/
int LocateElem(SqList L, ElemType e) {
	int i;
	for (i=0; i<L.length; i++) {
		if (L.data[i] == e) {
			return i+1;  // 返回的是位序,不是索引号!! 
		}
	}
	return 0; 
} 

/*[8].查找操作(按位查找): 查找第一个值等于e的元素,并返回位序*/
ElemType SeqListFindW(SeqList L, int i) {
	return L.data[i-1];
} 

6.打印顺序表元素 

bool SqListPrint(SqList L) {
	if (L.length == 0) {
		printf("the list is null!\n"); 
		return false;
	}
	
	printf("静态分配顺序表输出:");
	for (int i=0; i<L.length; i++) {
		printf("%d-->", L.data[i]);
	}
	printf("end\n");
	return true;
} 

7.主函数测试 

int main() {
	SqList L;
	
	/*1. 测试初始化*/ 
	InitSqList(L);
	
	/*2.测试插入操作*/ 
	ListInsert(L, 1, 1);
	ListInsert(L, 2, 2);
	ListInsert(L, 3, 3);
	ListInsert(L, 4, 4321);
	ListInsert(L, 5, 5);
	ListInsert(L, 6, 6);
	ListInsert(L, 7, 7);
	ListInsert(L, 8, 8);
	SqListPrint(L);
	
	/*3.测试查找操作*/ 
	int num = LocateElem(L, 7);
	printf("静态分配按值查找后返回的位序是:%d\n", num);
	int num1 = SqListFindW(L, 7);
	printf("静态分配按位查找后返回的值是:%d\n", num1);
	
	/*4.测试删除操作*/ 
	ElemType e;
	ListDelete(L, 2, e); 
	SqListPrint(L);
	printf("SqList删除的元素是:%d\n", e); 
}

运行结果:

二、动态分配

#include <stdio.h>
#include <stdlib.h>

/*[1].动态顺序表的初始默认最大容量*/
#define InitSize 10  

/*[2].自定义数据元素的数据类型*/
typedef int ElemType; 

1.动态分配的结构体定义

/*[3].动态分配的结构体定义*/ 
typedef struct {
	ElemType *data; // 指示动态分配数组的指针
	int maxSize;   // 数组的最大容量 
	int length; 
}SeqList; 

2.动态分配的初始化

/*[4].动态分配的顺序表的初始化*/
void InitList(SeqList &L) {
	L.data = (ElemType *)malloc(sizeof(ElemType) * InitSize);
	L.length = 0;
	L.maxSize = InitSize;
} 

3.插入操作

/*[5].插入操作(按位插入): 在第i位置插入一个元素e */
bool InsertSqList(SeqList &L, int i, ElemType e) {
	//判断插入的位置是否合法
	if (i < 1 || i > L.length + 1) {
		return false;
	} 
	//如果存储空间已满,则也不能插入 
	if (L.length > MaxSize) {
		return false;
	}
	for (int j = L.length; j >= i; j--) {
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;
	L.length++;
	return true;	
}

 4.删除操作

/*[6].删除操作: 删除第i个位置的元素,并将删除元素返回出去*/
bool SqListDelete(SeqList &L, int i, ElemType &e) {
	if (i<1 || i>L.length) {
		return false;
	}
	e = L.data[i-1];
	for (int j=i; j<L.length; j++) {
		L.data[j-1] = L.data[j];
	}
	L.length--;
	return true;
} 

5.查找操作

/*[7].查找操作(按值查找): 查找第一个值等于e的元素,并返回位序*/
int LocateElem(SeqList L, ElemType e) {
	int i; 
	for (int i=0; i<L.length; i++) {
		if (L.data[i] == e) {
			return i+1;
		}
	} 
	return 0;
} 
/*[8].查找操作(按位查找): 查找第一个值等于e的元素,并返回位序*/
int SqListFindW(SeqList L, int i) {
	return L.data[i-1];
} 

 

6.扩容操作

bool IncreaseSqList(SeqList &L, int len) {
	// 1. 生成指向原来顺序表存储空间的指针,便于后续的释放原来的内存空间 
	ElemType *p = L.data;
	// 2. 为原来的顺序表开辟一块更大的空间
	L.data = (ElemType *)malloc(sizeof(ElemType)*(L.maxsize+len));
	// 3. 转移数据
	for (int i=0; i<L.length; i++) {
		L.data[i] = p[i];
	}		
	// 4.修改顺序表的最大长度,其值 + len
	L.maxsize += len;
	// 5.释放原来的内存空间
	free(p);
	// 6.成功后返回true
	return true; 
} 

7.打印顺序表

bool SeqListPrint(SeqList L) {
	if (L.length == 0) {
		printf("该顺序表为空!\n"); 
		return false;
	}
	
	printf("动态分配顺序表输出:\n");
	for (int i=0; i<L.length; i++) {
		printf("%d-->", L.data[i]);
	}
	printf("end\n");
	return true; 

} 

8.主函数测试 

int main() {
	SeqList L;
	
	/*1. 测试初始化*/
	InitSqList(L);
	
	/*2.测试插入操作*/ 
	InsertSqList(L, 1, 1);
	InsertSqList(L, 2, 2);
	InsertSqList(L, 3, 3);
	InsertSqList(L, 4, 4111);
	
	/*3.测试查找操作*/
	int num = LocateElem(L, 3);
	printf("动态分配按值查找后返回的位序是:%d\n", num);
	
	int num1 = SqListFindW(L, 3);
	printf("动态分配按位查找后返回的值是:%d\n", num1);
	
	/*4.测试删除操作*/
	ElemType q;
	SqListDelete(L, 3, q);
	printf("SeqList删除的元素是:%d\n", q);
	SqListPrint(L); 
	
	/*5.测试动态分配顺序表的扩容操作*/ 
	IncreaseSqList(L, 20);
	printf("扩容后的L的maxsize为:%d\n",L.maxSize); // 30  ->  扩容成功
}

运行结果:

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

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

相关文章

最新AI创作系统ChatGPT网站系统源码+Ai绘画网站源码+Suno-v3-AI音乐生成大模型(sparkAi系统V6版本)

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

rt-thread的nfs如何实现软硬件对接

rt-thread&#xff08;下面简称rtt&#xff09;有一个封装好的的虚拟文件系统&#xff0c;提供了一套通用的io文件接口例如 open,write,read这些&#xff0c;从没看过rtt的代码也没用过&#xff0c;文件系统在刚毕业的时候只是用过fatfs但没去纠结过。今年1月份听同事说只需要打…

C++(语法以及易错点2)

1.内联函数 1.1 概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 ​int ADD(int a,int b) {return ab; }​ 1.2 特性 1. inline是一种以空间换时间…

Java数据结构栈

栈&#xff08;Stack&#xff09; 概念 栈是一种先进后出的数据结构。 栈的使用 import java.util.Stack; public class Test {public static void main(String[] args) {Stack<Integer> s new Stack();s.push(1);s.push(2);s.push(3);s.push(4);System.out.println(s…

精密电阻阻值表和电容容值表

前面2张是电阻阻值表&#xff08;E-96/0603/1%&#xff09; 常见贴片电容的容值表

【智能优化算法】非洲秃鹫优化算法:一种新的全局优化问题的自然启发的元启发式算法

非洲秃鹫优化算法&#xff08;AVOA&#xff09;发表在中科院一区Computers & Industrial Engineering期刊上的论文“African vultures optimization algorithm: A new nature-inspired metaheuristic algorithm for global optimization problems" 01.引言 元启发式算…

DAY16|104.二叉树的最大深度,111.二叉树的最小深度,222完全二叉树的个数

文章目录 104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的个数 104.二叉树的最大深度 文字讲解&#xff1a;二叉树的层序遍历 视频讲解&#xff1a;二叉树的层序遍历 状态&#xff1a;求深度用前序遍历&#xff0c;求高度用后序遍历&#xff1b; 思路&#xff1a; …

【PSINS工具箱】EKF与UKF滤波

描述 对工具箱SINS/GPS,153例程的修改,将EKF和UKF放在一个文件里面,一次运行可以得到两个滤波的结果(带绘图与误差量化输出)。 片段 运行截图 程序完整源代码 在有工具箱的情况下,直接运行此代码,即可得到结果 % 基于PSINS工具箱的IMU数据生成与滤波 % date:2024-2-…

【系统架构师】-系统可靠性分析与设计

1、可靠性与可用性区别 1、系统可靠性&#xff1a;系统在规定时间内及规定的环境下&#xff0c;完成规定功能的能力&#xff0c;即系统无故障运行的概率 2、系统可用性&#xff1a;在某个给定时间点上系统能够按照需求执行的概率。 可靠性分为软件、硬件可靠性 2、可靠性指标…

LeetCode 第二题:冒泡排序详解 【2/1000】含imagemagick动态效果图

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

使用微带线快速进行电感、电容的等效(Matlab代码实现)

使用微带线快速进行电感、电容的等效&#xff08;Matlab代码实现&#xff09; 目录 使用微带线快速进行电感、电容的等效&#xff08;Matlab代码实现&#xff09;1、高低阻抗微带线的近似等效2、等效电容的ADS测试3、等效电感的ADS测试 1、高低阻抗微带线的近似等效 更加精确的…

利用JS、CSS实现列表自动滑动滚动

零.业务需求 这几天在做大屏项目&#xff0c;对于大屏有很多信息需要实时滚动&#xff0c;废了点力气学的明明白白的&#xff0c;特来记录供大家学习。 0.1实现效果 一.逻辑分析 1.1滑动窗口和滚动条 当我们使用<table>或者<ul>标签时&#xff0c;我们可以制作…

蓝桥杯第十四届C++A组(未完)

【规律题】平方差 题目描述 给定 L, R&#xff0c;问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 。 输入格式 输入一行包含两个整数 L, R&#xff0c;用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 样例输入 1 5 样例输出 …

Redis中的Sentinel(二)

Sentinel 初始化Sentinel状态。 在应用了Sentinel的专用代码之后&#xff0c;接下来&#xff0c;服务器会初始化一个sentinel.c/sentinelState结构(简称Sentinel状态),这个结构 保存了服务器中所有和Sentinel功能有关的状态(服务器的一般状态仍然由redis.h/redisServer保存);…

【java数据结构-二叉树(上)】

java数据结构-二叉树&#xff08;上&#xff09; 二叉树的概念二叉树的节点介绍 二叉树构造如何使用兄弟表示法构造二叉树两种特别的二叉树二叉树的基本性质&#xff1a; 二叉树的存储二叉树的遍历&#xff1a;前序遍历&#xff1a;中序遍历&#xff1a;后序遍历&#xff1a;层…

最新ChatGPT4.0工具使用教程:GPTs,Midjourney绘画,AI换脸,GPT语音对话,文档分析一站式系统

一、前言 ChatGPT3.5、GPT4.0、相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GPT-4对普通用户来说都是需要额外付费才可以…

基于RDMA的云服务能力实践与探索

01 背景 随着基于大数据大模型构建的数据系统越来越有商业价值&#xff0c;机器学习的玩家也越来越多&#xff0c;数据量越来越大。为解决海量数据在服务器之间的同步效率问题&#xff0c;RDMA(Remote Direct Memory Access) 技术逐渐走进了网络技术人员的视野。RDMA为什么…

yolov8多分支任务头训练

目前已知的yolov8可以针对多个任务进行单独训练,但是暂时还没有开放针对多个任务头同时进行训练的教程,本文章针对yolov8的多任务训练进行详细介绍。 先放上效果图: 三个任务,分别是目标检测、可行驶区域、车道线,具体步骤请往下看。 一、环境配置 从如下github下载代码…

Flutter Don‘t use ‘BuildContext‘s across async gaps.

Flutter提示Don‘t use ‘BuildContext‘s across async gaps.的解决办法—flutter里state的mounted属性

10-热点文章-定时计算

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路&#xff1a;从数据库直接按照发布时间倒序查询 问题1&#xff1a; 如何访问量较大&#xff0c;直接查询数据库&#xff0c;压力较大 问题2&#xff1a; 新发布的文章会展示在前面&#xff0c;并不是热点文章 …