当前位置: 首页 > news >正文

顺序表的插入、删除

顺序表的插入、删除

顺序表——线性表的顺序表示

顺序表的定义

#define MAX_SIZE	50	//定义线性表的长度
typedef int ElemType;	//借用王道的重命名
typedef struct {
	ElemType data[MAX_SIZE];	//顺序表的元素 => 数组表示
	int length;					// 顺序表当前的长度
}SqList;			//顺序表的类型定义

可视化显示一个顺序表
SqList

优缺点

优点
  • 可以随机存取(根据表头元素地址和元素序号)表中的任意一个元素。
  • 存储密度高,每个节点只存储数据元素。
缺点
  • 插入和删除操作需要移动大量元素.
  • 线性表变化较大时,难以确定存储空间的容量.
  • 存储分配需要一段连续的存储空间,不够灵活.占用一大段连续的内存,产生大量的碎片

顺序表的插入

顺序表的插入方式采用遍历插入的方法

比如i = 2向上面的例子中插入:
SqList1

开始移动,第一次将顺序表中的最后一个元素向后移动一位
3

直到i = 2位置的元素空出来
4

然后将需要插入的元素放到指定位置,最后L.length ++
在这里插入图片描述

/**
* 顺序表的插入操作,返回布尔类型
* SqList &L   			顺序表,需要改变L,使用引用
* int i		  			插入的位置,即下标+1,规定用法
* ElemType element		需要插入的元素
**/
bool insertSqList(SqList &L, int i, ElemType element)
{
	//判断i的合法性
	if(i < 1 || i > L.length || L.length == MAX_SIZE) return false;
	for(int j = L.length; j >= i; j --){
		L.data[j] = L.data[j - 1];	//将顺序表的元素从表尾到i依次向后移动一位
	}
	L.data[i - 1] = element;//将空出的位置放入element
	L.length ++;	//当前长度+1;
	return true;
}

顺序表的删除操作

根据顺序表的插入元素,可以知道插入操作是将顺序表的元素从L.length 位置到i位置依次向后移动一位;

那么可以推想出删除的操作就是从需要删除的位置(i)到最后一个元素的位置(L.length)依次向前移动一个位置,通俗的讲就是用后面的元素把前面的元素给覆盖掉!
5

/**
* 顺序表的删除操作
* SqList &L   			顺序表,需要改变L,使用引用
* int i		  			插入的位置,即下标+1,规定用法
* ElemType &delElement		存储被删除的元素
**/
bool listDelete(SqList &L, int i, ElemType &delElement)
{
    //判断删除的位置i是否合法
    if(i < 1 || i > L.length)   return false;
    delElement = L.data[i - 1];	//存储被删除的元素
    for(int j = i; j <= L.length; j ++){
        L.data[j - 1] = L.data[j];//将顺序表中的元素从i到L.length依次向前移动一位
    }
    L.length --;
    return true;
}

演示例子

初始化顺序表(顺序表中元素为整型),里边的元素是1,2,3,然后通过scanf读取一个元素(假如插入的是6),插入到第2个位置,打印输出顺序表,每个元素占3个空格,格式为1 6 2 3,然后scanf读取一个整型数,是删除的位置(假如输入为1),然后输出顺序表 6 2 3,假如输入的位置不合法,输出false字符串。

#include <stdio.h>
#include <stdbool.h>

#define MaxSize		50

typedef int ElemType;	//类型定义

typedef struct{
  ElemType data[MaxSize];
  int length;				//顺序表当前的长度
}SqList;					//顺序表的类型定义


//顺序表的插入操作
bool insertList(SqList &L, int i, ElemType in_elem)
{
  if(i < 0 || i > L.length || L.length == MaxSize)	return false;
  for(int j = L.length; j >= i; j --){
    L.data[j] = L.data[j - 1];
  }
  L.data[i - 1] = in_elem;
  L.length ++;
  return true;
}

//顺序表的删除操作
bool deleteList(SqList &L, int i)
{
  if(i < 0 || i > L.length)	return false;
  for(int j = i; j <= L.length; j ++){
  	L.data[j - 1] = L.data[j];
  }
  L.length --;
  return true;
}

void printSqList(bool ret, SqList L)
{
  if(ret){
  	for(int i = 0; i < L.length; i++){
      printf("  %d", L.data[i]);
    }
    printf("\n");
  }
  else		printf("false\n");
}
int main()
{
  SqList L;
  ElemType in_elem;		//需要插入顺序表的元素
  int i;
// ElemType del_elem;	//删除顺序表中的元素的复制值
  bool ret;				//判断插入或删除操作的返回值
  L.data[0] = 1; L.data[1] = 2; L.data[2] = 3;
  L.length = 3;

  scanf("%d", &in_elem);		//键盘输入需要插入的元素
  scanf("%d", &i);
  ret = insertList(L, 2, in_elem);
  printSqList(ret, L);


  ret = deleteList(L, i);
  printSqList(ret, L);

  return 0;
}

相关文章:

  • 5分钟速览深度学习经典论文 —— attention is all you need
  • [AI相关]--可能不是0基础,但是很快解决c4d导出unity英雄联盟Lol模型问题
  • [记录与分享]如何保持充足的能量
  • Go学习笔记:Gin-路由
  • 3-9 WPS JS宏单元格复制、重定位应用(拆分单表到多表)
  • Next.js项目实战-ai助手帮我写文章发布视频第1节(共89节)
  • JavaScript 正则表达式全面指南
  • HDFS的设计架构
  • 网络安全审计 主要包括哪些内容
  • 树莓派学习(一)——3B+环境配置与多用户管理及编程实践
  • 大型语言模型训练的三个阶段:Pre-Train、Instruction Fine-tuning、RLHF (PPO / DPO / GRPO)
  • /dev/console文件详解
  • 工作遇到相关命令问题记录(持续更新)
  • 深度解码!清华大学第六弹《AIGC发展研究3.0版》
  • 【贪心算法1】
  • 计算机毕业设计Python+DeepSeek-R1大模型空气质量预测分析(源码+文档+PPT+讲解)
  • Linux网络环境配置及常用命令
  • 基于Spring Boot的共享学习经验系统的设计与实现
  • 视频录像机视频通道是指什么
  • 【leetcode100】组合总和Ⅲ
  • wordpress同步发布/长沙网站优化公司
  • 深圳市建设银行网站/百度网络营销推广
  • 网站建设 齐鲁软件园/做一个网站需要多少钱大概
  • 网站建设国外拂去其/aso优化怎么做
  • 盘锦做网站企业/有没有永久免费crm
  • 中介网站怎么做/全国疫情最新情况公布