顺序表的基本操作(1)——插入操作

2023-10-30

顺序表的插入运算

线性表的插入运算是指在表的第i (1≤i≤n+1)个位置,插入一个新元素x,使长度为n的线性表 ( a1​,…,ai−1​ai​,…,an​) 变成长度为n+1的线性表( a1​,…,ai−1​xai+1​,…,an​) 。

算法思想:用顺序表作为线性表的存储结构时,由于结点的物理顺序必须和结点的逻辑顺序保持一致,因此我们必须将原表中位置n-1n-2,…,i-1上的结点,依次后移到位置nn-1,…,i上,空出第i-1个位置,然后在该位置上插入新结点x。当i=n+1时,是指在线性表的末尾插入结点,所以无需移动结点,直接将x插入表的末尾即可。

算法分析

  1. 最好的情况:当i=n+1时(插入尾元素),移动次数为0
  2. 最坏的情况:当i=1时(插入第一个元素),移动次数为n
  3. 平均情况:在位置i插入新元素x,需要将ai~an的元素均后移一次,移动次数为n-i+1。假设在等概率下pi(pi=1/(n+1)),移动元素的平均次数为:

插入算法的主要时间花费在元素移动上,所以算法平均时间复杂度为O(n)

 

编程要求

根据提示,在编辑器 Begin-End 区间补充代码,完成顺序表的初始化操作,遍历操作及插入操作三个子函数的定义,具体要求如下:

  • void InitList(SqList &L); //构造一个空的顺序表L
  • void DispList(SqList *L);// 输出顺序表L的每个数据元素
  • int ListInsert(SqList *&L,int i,ElemType e);//在顺序表L中第i个位置之前插入新的数据元素

测试说明

第一组测试输入:
5

12 47 5 8 69
1

99

第二组测试输入:
3

1 2 3
6

5

代码文件

#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
	ElemType elem[MaxSize];
   	int length;
} SqList;

void DispList(SqList *L);
void InitList(SqList *&L);
int ListInsert(SqList *&L,int i,ElemType e);
int ListEmpty(SqList *L);



int main()               //main() function 
{	// 调用对应的函数,完成顺序表的插入功能 	
    /********** Begin **********/ 
	SqList *L;
	ElemType e;int M,i;
	printf("(1)初始化顺序表L\n");
	InitList(L);
	printf("(2)输入顺序表的长度M:\n");
	scanf("%d",&M);
	printf("(3)依次插入M个元素\n");
	for(i=1;i<=M;i++)
	{
		scanf("%d",&e);
		ListInsert(L,i,e);
	}
	printf("(4)输入要插入元素的位置\n");
	scanf("%d",&i);
	printf("(5)输入要插入的数据元素的值:\n");
	scanf("%d",&e);
	if(ListInsert(L,i,e)==1){
		printf("(6)输出插入后的顺序表:");
		DispList(L);
	}
	else
	printf("(6)位置不合理,无法插入");
	/********** End **********/
     
}


/*****顺序表的基本操作*****/


void InitList(SqList *&L)
{	// 操作结果:构造一个空的顺序线性表L 	
    /********** Begin **********/ 
	L=(SqList*)malloc(sizeof(SqList));
	L->length=0;
	

	/********** End **********/
}


int ListInsert(SqList *&L,int i,ElemType e)
{	// 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1
	// 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
	/********** Begin **********/ 
	if(i<1||i>L->length+1){
		return 0;
	}
	i--;
	int j;
	for (j=L->length;j>i;j--)
	    L->elem[j]=L->elem[j-1];
	L->elem[i]=e;
	L->length++;
	return 1;
	


	
	/********** End **********/
}

void DispList(SqList *L)
{ 	// 初始条件:顺序线性表L已存在
	// 操作结果:依次对L的每个数据元素调用函数vi()输出	
    /********** Begin **********/ 
	 int i;  
     if (ListEmpty(L)) return;  
     for (i=0;i<L->length;i++)  
        printf("%d ",L->elem[i]);  
     printf("\n"); 
    
	
	/********** End **********/
}
int ListEmpty(SqList *L)
{
	return(L->length==0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

顺序表的基本操作(1)——插入操作 的相关文章

随机推荐

  • Python tkinter自定义多选下拉列表框

    Python tkinter 自定义多选下拉列表框 困扰了我好久 终于在stackoverflow上找到了答案 废话不多说 直接上代码 加滚动条和全选传送门 Python tkinter自定义多选下拉列表框 带滚动条 全选 demo py文
  • 【C++笔试强训】第三十二天

    C 笔试强训 博客主页 一起去看日落吗 分享博主的C 刷题日常 大家一起学习 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 夜色难免微凉 前方必有曙光 选择题 第一题 在计算机网络中 TCP和UDP协议的相似之处是
  • android如何设置自适应大小的背景图片,Android 背景图片自适应方案

    在做移动中间件的过程中 遇到了背景图片自适应的问题 比如一个Button的背景图片 如何让一张图片能够在不同高宽的场景下做到不失真 在做移动中间件的过程中 遇到了背景图片自适应的问题 比如一个Button的背景图片 如何让一张图片能够在不同
  • element ui 表格字段boolean 不显示

    如题后端返回的list 中有值 表格缺没显示 加一个template将true 和false 转为想要的字段即可 这里是三目
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Unity3D里使用自己的dll

    首先 我们需要新建一个类库项目 可以使用Visual Studio或者Monodevelop来做 我这里是使用vs2012来创建 选择好项目类型 写好项目名称 新生成的项目里面默认有一个Class1类 可以通过在解决方案资源管理器里面进行重
  • python类中的main函数_在Python中定义Main函数

    码农那点事儿 关注我们 一起学习进步 源 python程序员 目录 Python中的基本main 函数 Python中的执行模式 基于命令行执行 导入模块或解释器 Main函数的最佳实践 将大部分代码放入函数或类中 使用 name 控制代码
  • 如何搭建mmaction环境,手动安装MMCV

    1 创建虚拟环境并激活 conda create n open mmlab python 3 7 y conda activate open mmlab 2 安装cudatoolkit和cudnn 2 1 查看cudnn版本 conda s
  • Android onCreateOptionsMenu方法是什么时候调用的 ?

    onCreateOptionsMenu是在第一次menu显示的时候调用的 也就是你第一次点击menu按钮 这个时候 你xml配置的menu就会被加载进来 之后你还想更新menu信息 可以使用onPrepareOptionsMenu 也就是从
  • STM32F103C8T6单片机IAP升级

    关于IAP升级的方法和原理 网上已经有很多资料了 这块就不再说了 现在就将bootloader和app配置方法整理如下 APP程序就是一个简单的LED闪烁 APP设置为从FLASH中启动 STM32F103C8T6单片机flash有64K
  • QT风格(QStyle):绘制控件风格设置--QStyleOption

    QStyleOption是风格的设置类 定义了最基本的绘制控件所需的信息 绘制不同控件时 控件所使用的设置类继承QStyleOption 且OptionType值不同 如绘制按钮的风格设置类QStyleOptionButton继承QStyl
  • 记录es几个问题,增删改查,索引创建

    一 es版本 依赖
  • Echarts开发人物关系网络图

    引言 人物关系可视化是将人与人之之间通过某属性进行连接而形成的关系网络 通过可视化技术展现出来 而baidu的Echarts是一款非常敏捷 迅速 酷炫的js可视化工具 1 Echarts介绍 ECharts 一个纯 Javascript 的
  • 2021年连云港高考成绩查询,2021年连云港高考状元是谁分数多少分,历年连云港高考状元名单...

    2020年连云港一年一度的高考考试已经结束 今年连云港高考状元是谁呢 连云港高考状元出自哪个高中学校 文理科分数是多少分 一起来了解 一 2020年连云港高考状元名单资料 2020年连云港高考状元名单和学校相关信息 截至目前发文时间 官方暂
  • [学opencv]opencv Mat类型初始化,遍历,赋值

    1 opencv Mat类型定义 cv Mat a cv Size w h CV 8UC1 单通道 cv Mat b cv Mat cv Size w h CV 8UC3 3通道每个矩阵元素包含3个uchar值 对于维数较小的Mat类型 直
  • ARM Linux下安装CH341串口驱动

    在arm Linux环境下安装CH341串口驱动需要单独编译串口的驱动 本人编译环境Ubuntu 14 04 gcc编译工具arm linux gnueabihf gcc 1 代码检查 查看内核目录下 kernel drivers usb
  • Python中的logging模块解析

    前言 在自动化测试中 为了定位问题 调试框架代码 需要使用日志模块 今天我们重点讲解Python中的logging模块 在学习使用logging模块前 我们先要了解logging模块的四大天王 logger handler filter f
  • 《认识k8s》学习笔记Day01

    一 传统的部署方式 将三个应用部署到一台机器上 如果其中一台机器崩溃 会导致其他的机器受到影响 严重的会导致其他应用下线并不安全 二 虚拟化的部署方式 在物理机上开通几个虚拟机 将应用部署到虚拟机上 就算某个应用崩溃了 也只在这个虚拟机内崩
  • 怎样用计算机绘制幂函数图像,几何画板如何画幂函数的图像

    在学习了一些基本初等函数后 会接触 幂函数 概念 其实幂函数并不是陌生的 之前学过的依次函数 二次函数和反比例函数都是幂函数 幂函数其实同指数函数 对数函数一样 都是函数中的一类特殊函数 利用几何画板探究幂函数的性质 可以克服黑板作图的不精
  • 顺序表的基本操作(1)——插入操作

    顺序表的插入运算 线性表的插入运算是指在表的第i 1 i n 1 个位置 插入一个新元素x 使长度为n的线性表 a1 ai 1 ai an 变成长度为n 1的线性表 a1 ai 1 x ai 1 an 算法思想 用顺序表作为线性表的存储结构