线性表的顺序存储实现(数组)

2023-11-01

数据对象集:线性表是n(\geqslant 0)个元素构成的有序序列(a_{1},a_{2},\cdots ,a_{n})

操作集:线性表L\in List,整数i表示位置,元素X\in ElementType

线性表主要操作如下:

List MakeEmpty(); //初始化一个空线性表
ElementType FinKth(int K,List PtrL);//根据位序K,返回相应元素(按序号查找)
int Find(ElementType X,List PtrL,int Pst[]);//在线性表中查找X的位置(按值查找)
void insert(ElementType X,int i,List PtrL);//在位序i前插入一个新元素X
void Delete(int i,List PtrL);//删除指定位序的元素
int Length(List PtrL); //返回线性表L的长度

1.初始化

/*初始化
 *实现功能:建立空的线性表
 *传入形参:无
 *返回值:线性表指针  
*/
List MakeEmpty() 
{
	List PtrL;
	PtrL = (List)malloc(sizeof(LNode));
	PtrL->Last = -1;//表示线性表中没有元素 
	return PtrL;
}

2.根据位序,查找对应元素

/*按位序查找 
 *实现功能:根据位序K,返回相应元素
 *传入形参:位序 K,线性表指针 L 
 *返回值:与K相对应的元素 
*/ 
ElementType FinKth(int K,List PtrL)
{
	if(K > List->Last+1 || K < 0){
		printf("该位置无元素!");
	}
	
	return PtrL->Data[K-1];
 }

3.给出一个数,查找在数组中的位置

/*按值查找 
 *实现功能:在线性表中查找X出现的位置 
 *传入形参:要查找的数 X,指向线性表的指针 L,位置数组指针 Pst 
 *返回值:无 
*/
void Find(ElementType X,List PtrL,int* Pst)
{
	int p;
	int i = 0;
	
	for(p = 0; p <= PtrL->Last; p++){
		if(PtrL->Data[p] == X){
			Pst[i+1] = p;
			i++;
		}
	} 
	Pst[0] = i; //Pst的第一个位置用来存储该数出现的次数 
	
	return;
 }

       将一个位置表(Pst)的表头传入,将该数出现的次数存在第一个空间Pst[0]中,将具体出现的位置分别存入随后的空间Pst[i]中。这样做,可以直接对主函数中的Pst数组进行赋值,避免了c语言只能返回一个值的情况。

4.在指定的位置前插入一个数

 /*插入
  *实现功能:在位序i(1<= i <= N+1)前插入一个值为X的新元素
  *传入形参:准备插入的数 X,插入位置 i,线性表指针 L 
  *返回值:无 
 */
void insert(ElementType X,int i,List PtrL)
{
	int j;
	 
	if(PtrL->Last == MAXSIZE -1){		//表空间已满不能插入 
		printf("表满");
		return; 
	} 
	
	//检查插入位置的合法性 
	if(i <= 1 || i > PtrL->Last+2){		//当 i=0时,就人直观观察来说,是没有第0个元素的
		printf("插入位置不合法");	//当 i=Last + 1时,将插入的数放于最后一个数前.
		return;				//当 i= Last + 2,即将插入的数放于表末尾,这是可行的 
	}
	
	for(j = PtrL->Last; j >= i-1; j--)
		PtrL->Data[j+1] = PtrL->Data[j];    //将表中i后的数,逐个从后往前向后挪,以空出插入位置。 
	PtrL->Data[i-1] = X;
	PtrL->Last++;
	return;
 }
	PtrL->Last++;
	return;
 }

5.删除指定位序上的数

 /*删除
  *实现功能:删除指定位序的元素
  *传入形参:删除位置 i,线性表指针 L
  *返回值:无 
 */
void Delete(int i,List PtrL)
{
	int j;
	
	//检查删除位置的合法性
	if( i < 1 || i > PtrL->Last + 1){
		printf("不存在第%d个元素",i);
		return;
	}
	
	for(j = i; j <= PtrL->Last; j++)		//将表中i后的数,逐个从前往后向前挪,以覆盖删除位置。
		PtrL->Data[j-1] = PtrL->Data[j];
	PtrL->Last--;
	return;
 }

6.求表长

/*求长度 
 *实现功能:求得线性表的长度 
 *传入形参:线性表指针 L
 *返回值:线性表长度 
*/
int Length(List PtrL)
{
	return PtrL->Last + 1;
 } 

以下为测试主程序:

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

#define MAXSIZE 100

typedef int ElementType;

typedef struct LNode{
	ElementType Data[MAXSIZE];
	int Last;//表示最后一个元素所在的位置 
}LNode;
typedef LNode* List;//定义一个指向Node的指针 

List MakeEmpty(); //初始化一个空线性表
ElementType FinKth(int K,List PtrL);//根据位序K,返回相应元素(按序号查找)
void Find(ElementType X,List PtrL,int *Pst);//在线性表中查找X的位置(按值查找)
void insert(ElementType X,int i,List PtrL);//在位序i前插入一个新元素X
void Delete(int i,List PtrL);//删除指定位序的元素
int Length(List PtrL); //返回线性表L的长度

int main()
{
	int i;
	List L;
	
	L = MakeEmpty();
	
	printf("输入元素:");
	do{
		scanf("%d",&L->Data[L->Last+1]);
		L->Last++;
		
		if(getchar() == '\n')
			break;
	}while(1);
	
	printf("查找元素\n请输入位序:");
	int K;
	scanf("%d",&K);
	printf("在该位置上的元素是:%d",FinKth(K,L));
	printf("\n\n");
	
	printf("查找位序\n请输入要查找的数:");
	int X;
	int Pst[MAXSIZE];
	scanf("%d",&X);
	Find(X,L,Pst);
	if(Pst[0] == 0){ //该数出现的次数为0
		printf("表中未找到该数!");
	}else{
		printf("该数出现的位置下标分别为:");	
		for(i = 1; i <= Pst[0]; i++)
			printf("%d ",Pst[i]);	
	}
	 
	printf("插入\n请输入要插入的数:");
	scanf("%d",&X);
	printf("请输入插入位置:");
	scanf("%d",&i);
	insert(X,i,L);
	printf("\n");
	
	printf("线性表如下:\n");
	for(i = 0; i <= L->Last; i++)
		printf("%d ",L->Data[i]);
	printf("\n\n");
	
	printf("删除\n请输入要删除的位置:");
	scanf("%d",&i);
	Delete(i,L);
	printf("\n");
	 
	printf("线性表如下:\n");
	for(i = 0; i <= L->Last; i++)
		printf("%d ",L->Data[i]);
	
	free(L);
 }

下面是测试结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性表的顺序存储实现(数组) 的相关文章

  • Qt程序启动画面播放(gif与swf两种动画格式) - 路上的脚印

    学习Qt有一段时间了 发现一个小问题 网上关于Qt的资料或者总结性的学习及应用文章有点少 比如 Qt完整的API 程序运行之前的启动画面如何按理想效果播放等 每次想在项目中添加一些应用的时候 总是找不到好的书籍或文章可以马上学习 上手 今天
  • 淘宝、1688、京东、拼多多,抖音五个平台的区别分析

    淘宝 淘宝是中国最大的C2C电子商务平台 也是消费者购物的首选平台 淘宝上的商品种类繁多 价格实惠 同时还有很多优惠活动和促销活动 让消费者可以以较低的价格购买到高质量的商品 1688 1688是中国最大的批发市场之一 有数百万的商家在上面

随机推荐

  • Qt为release中可执行程序添加库进行打包并结合inno setup打包生成exe安装文件

    Qt为release中可执行程序添加库进行打包并结合inno setup打包生成exe安装文件 文章目录 Qt为release中可执行程序添加库进行打包并结合inno setup打包生成exe安装文件 一 Qt为release中可执行程序添
  • fedora11下gmlive0.22beta源代码安装

    1 解决依赖问题 否则会出现问题 No package gtkmm 2 4 found No package libglademm 2 4 found 安装依赖包 yum install gtkmm24 dev yum insttall l
  • C# 海康人脸识别设备初开发(二)话不多说以下完整例子

    demo截图 demo下载地址 https download csdn net download qq 16632449 11002228 以下完善了计划权限 可以参考下 其他的没了 如果提示错误23 基本是设备不支持 那你就要去问下海康的
  • Spring boot定时任务@Scheduled

    文章目录 1 前言 2 pom包配置 3 启动类启用定时 4 创建定时任务实现类 5 补充 cron表达式 6 遇到的坑 1 前言 Scheduled 参数可以接受两种定时的设置 一种是我们常用的cron 6 一种是 fixedRate 6
  • C++11:委派构造函数

    委派构造函数
  • TM1650数码管(类IIC驱动)

    目录 一 TM1650简介 1 特性描述 2 功能特点 二 IIC Inter Integrated Circuit BUS 结构解析 1 IIC协议介绍 2 多主机IIC总线结构 3 信号概念 三 TM1650数码管的工作 四 编写代码
  • [Spring3.x源码]Ageci(二)授权器

    上一篇中配置的FilterSecurityInterceptor即是授权器 FilterSecurityInterceptor doFilter ServletRequest request ServletResponse response
  • Qt实现打开网页

    Qt实现打开网页 新建一个mainwindow 在UI界面添加一个Text Browser 首先在myHTTP pro中添加QT network 在mainwindow h中新建两个类 QNetworkReply和QNetworkAcces
  • 35. 实战:Python实现视频去水印(文末源码)

    目录 前言 目的 思路 代码实现 1 请求URL 查看源代码 2 源代码中没有就去抓包工具 3 拿到视频源链接 继续检索来源 4 拿到数据和链接 二进制写入到本地 完整源码 运行效果 总结 前言 我们在刷某短视频平台时 有些视频我们想保存到
  • 系统安装部署系列教程(六):封装系统

    终于到了本系列的最核心一篇教程了 在这篇教程里我们来看看如何按需来封装系统 封装系统有很多作用 硬件厂商需要将自己的特性软件和驱动程序预装到系统中 企业用户需要集成KMS激活服务器 装机人员需要预装用户的常用软件 所有这些功能 都可以通过封
  • yearning

    Yearning 开发模式 手动部署 如有侵权 请联系我删除 环境准备 MySQL https www cnblogs com xinjing jingxin p 8025805 html Yearning git clone https
  • 【Matlab基础】一些常用函数收集

    stem函数 1 用法 stem Y 将数据序列Y从x轴到数据值按照茎状形式画出 以圆圈终止 如果Y是一个矩阵 则将其每一列按照分隔方式画出 stem X Y 在X的指定点处画出数据序列Y stem filled 以实心的方式画出茎秆 st
  • yolov6 win10环境配置详细过程

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 yolov6 下载 二 环境配置 三 测试环境 四 报错集合 前言 提示 这里可以添加本文要记录的大概内容 最近美团开源了yolov6 源码 准备体验下y
  • 韩国KT/LG/SK机房服务器比较

    众所周知 韩国就KT LG SK机房比较出名 那么三者之间有和区别呢 小编带大家分析一下 如有不对的地方还请多多指教 一 KT机房 KT机房采用中韩CN2专线与联通移动BGP线路 线路稳定不掉包 三网用户访问速度快而且速度和国内服务器没什么
  • 关于VAE中KL散度项的推导

    关于VAE中KL散度项的推导 最近在看 Variational AutoEncoder 其中论文 Auto Encoding Variational Bayes 中的Eq 10 怎么也推不出来 看了一下Appendix B 只给出了KL散度
  • 开发自己的脚手架(Rollup+Typescript)-(02)-(中间件模式)

    对于A gt b gt c这一类的流程事件 可以采用分解这些事件 当需要用到这些事件操作时 我们将操作插入到核心事件完成所需要的不同步骤中 实现一个流程处理函数 src core ware ts 中间件方法类型 export type Mi
  • ES6 let 与 const 命令 以及箭头函数初步学习

    ES6 let 与 const 命令 以及箭头函数初步学习 ES6 let 与 const 命令 以及箭头函数初步学习 let 与 const let 块级作用于 const 本质 ES6 声明变量的六种方法 ES6箭头函数 箭头函数与普通
  • CRM常用功能代码

    文章目录 前言 学习任务 一 常用框架 BS入口 方法体 二 常用功能 1 动态Pick 2 简单查询 3 通过值列表Code获取值 获取系统参数 模板 内置参数 4 开关管理员模式 遇到问题及其解决方案 心得总结 前言 学习情况总结 学习
  • ARMv8之arm64架构汇编知识

    1 寄存器 1 1 通用寄存器 31 个R0 R30 每一个寄存器能够存取一个64位大小的数 当使用 x0 x30访问时 是一个 64位的数 当使用 w0 w30访问时 是一个 32 位的数 访问的是寄存器的低32位 如下图所示 1 2 向
  • 线性表的顺序存储实现(数组)

    数据对象集 线性表是个元素构成的有序序列 操作集 线性表 整数i表示位置 元素 线性表主要操作如下 List MakeEmpty 初始化一个空线性表 ElementType FinKth int K List PtrL 根据位序K 返回相应