C语言线性表的插入和删除操作

C语言数据结构的学习之线性表的插入与删除操作

  • C语言线性表的插入和删除操作
    • 一、插入操作
      • 插入操作的时间复杂度分析:
    • 二、删除操作
      • 删除操作的时间复杂度分析:
    • 查找操作

一、插入操作

#include<stdio.h>
#define MaxSize 10
typedef struct{int data[MaxSize];     //用静态(整数int/抽象,泛型ElemType)数组存放数据元素int length;                  //顺序表当前长度
}SqList;                    //顺序表的类型定义//基本操作——初始化一个顺序表
void InitList(SqList &L){for(int i=0;i<MaxSize;i++){      //如果不将所有数据元素设置为默认初始值就会出现脏数据L.data[i]=0;            //将所有数据元素设置为默认初始值}L.length=5;              //顺序表初始长度为5(不能超过MaxSize)
}//顺序表元素的插入操作(L-线性表,i-要插入的位置,e-要插入的元素)
bool ListInsert(SqList &L,int i,int e){//为了保证一个合法的i,这里需要加判断//线性表是连续存储空间,所以需要判断i的合法性if(i<1||i>L.length+1){return false;}//顺序表已经存满,不能再存了if(L.length>=MaxSize){return false;}//将插入位置之后的所有元素向后移一位  //按数组下标是从0开始的,所以length-1就是他的最后一个元素for(int j = L.length;j>=i;j--){L.data[j] = L.data[j-1];}L.data[i-1] = e;     //在i位置处放入eL.length++;         //更新线性表的长度return true;
}int main(){SqList L;           //声明一个顺序表InitList(L);       //初始化顺序表if(ListInsert(L,4,10)==true){printf("插入元素之后的线性表长度为%d\n:",L.length);printf("插入元素之后线性表的元素为:\n");for(int i =0;i<L.length;i++){printf("data[%d] = %d\n",i,L.data[i]);}}else{printf("线性表已经插满或检查要插入的位置是否合法\n");}return 0;
}

插入操作的时间复杂度分析:


综上,插入操作的平均时间复杂度是O(n)。

二、删除操作

#include<stdio.h>
#define MaxSize 10
typedef struct{int data[MaxSize];     //用静态(整数int/抽象,泛型ElemType)数组存放数据元素int length;                  //顺序表当前长度
}SqList;                    //顺序表的类型定义//基本操作——初始化一个顺序表
void InitList(SqList &L){for(int i=0;i<MaxSize;i++){      //如果不将所有数据元素设置为默认初始值就会出现脏数据L.data[i]=0;            //将所有数据元素设置为默认初始值}L.length=5;              //顺序表初始长度为0
}//顺序表元素的插入操作(L-线性表,i-要插入的位置,e-要插入的元素)
bool ListInsert(SqList &L,int i,int e){//为了保证一个合法的i,这里需要加判断//线性表是连续存储空间,所以需要判断i的合法性if(i<1||i>L.length+1){return false;}//顺序表已经存满,不能再存了if(L.length>=MaxSize){return false;}//将插入位置之后的所有元素向后移一位  //按数组下标是从0开始的,所以length-1就是他的最后一个元素for(int j = L.length;j>=i;j--){L.data[j] = L.data[j-1];}L.data[i-1] = e;     //在i位置处放入eL.length++;         //更新线性表的长度return true;
}
//加上引用符号&说明传入的e和本函数中的元素e是同一个引用地址,若是不加,那么他们两个就只是值相同,但是引用地址不同的元素
bool ListDelete(SqList &L,int i,int &e){//先判断删除位置是否合法if(i<1||i>L.length+1){return false;}e = L.data[i-1];   //将要删除的元素赋给e//将i之后的元素依次向前移一位for(int j = i;j<L.length;j++){L.data[j-1] = L.data[j];}L.length--;       //更新线性表的长度return true;
}int main(){SqList L;           //声明一个顺序表InitList(L);       //初始化顺序表//插入一些元素...int e = -1;     //用变量e把删除的元素带回来if(ListDelete(L,3,e)){printf("删除成功,删除的元素为%d",e);}else{printf("删除失败,检查你要删除的位置是否合法\n");}return 0;
}

删除操作的时间复杂度分析:


综上,删除操作的平均时间复杂度也是O(n)。

查找操作

//查找元素
int GetElem(SqList L,int i){//为了保存代码的健壮性,再加上对位置i的合法判断if(i<1||i>L.length){printf("您的i不合法\n");return -1;}return L.data[i-1];
}

测试代码,这里用的是整型的、静态创建的数组实现顺序表,静态创建顺序表长度的缺点是一旦顺序表存满就要重新更改顺序表的做大长度,且如果你一旦顺序表的初始长度定的太大就会造成空间浪费,这在工作和学习中是不可取的,下面将使用动态数组创建顺序表

#include<stdio.h>
#define MaxSize 10
typedef struct{int data[MaxSize];     //用静态(整数int/抽象,泛型ElemType)数组存放数据元素int length;                  //顺序表当前长度
}SqList;                    //顺序表的类型定义//基本操作——初始化一个顺序表
void InitList(SqList &L){for(int i=0;i<MaxSize;i++){      //如果不将所有数据元素设置为默认初始值就会出现脏数据L.data[i]=0;            //将所有数据元素设置为默认初始值}L.length=5;              //顺序表初始长度为0
}//顺序表元素的插入操作(L-线性表,i-要插入的位置,e-要插入的元素)
bool ListInsert(SqList &L,int i,int e){//为了保证一个合法的i,这里需要加判断//线性表是连续存储空间,所以需要判断i的合法性if(i<1||i>L.length+1){return false;}//顺序表已经存满,不能再存了if(L.length>=MaxSize){return false;}//将插入位置之后的所有元素向后移一位  //按数组下标是从0开始的,所以length-1就是他的最后一个元素for(int j = L.length;j>=i;j--){L.data[j] = L.data[j-1];}L.data[i-1] = e;     //在i位置处放入eL.length++;         //更新线性表的长度return true;
}
bool ListDelete(SqList &L,int i,int &e){//先判断删除位置是否合法if(i<1||i>L.length+1){return false;}e = L.data[i-1];//将i之后的元素依次向前移一位for(int j = i;j<L.length;j++){L.data[j-1] = L.data[j];}L.length--;      //更新线性表的长度return true;
}//查找元素
int GetElem(SqList L,int i){//为了保存代码的健壮性,再加上对位置i的合法判断if(i<1||i>L.length){printf("您的i不合法\n");return -1;}return L.data[i-1];
}int main(){SqList L;           //声明一个顺序表InitList(L);       //初始化顺序表//插入一些元素...for(int i=0;i<L.length;i++){L.data[i] = i;}int ele = GetElem(L,6);if(ele==-1){printf("您输入的位置不合法,请重新输入!\n");}else{printf("您要查找的元素是%d\n",ele);    }return 0;
}

malloc函数是可以开辟一大片连续的存储空间,下面动态数组的实现就是使用了malloc函数。(这里同样是为了操作方便依旧还是用了整型,读者可以在后面自己修改为泛型,)

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10
typedef struct{int *data;           //指示动态分配数组的指针,用malloc函数实现int MaxSize;             //顺序表的最大容量int length;              //顺序表当前长度
}SqList;                    //顺序表的类型定义//基本操作——用malloc函数动态初始化一个顺序表
void InitList(SqList &L){//用malloc函数申请一片连续的存储空间L.data = (int *)malloc(InitSize*sizeof(int));L.length=10;          //顺序表的初始长度L.MaxSize=InitSize;
}//顺序表元素的插入操作(L-线性表,i-要插入的位置,e-要插入的元素)
bool ListInsert(SqList &L,int i,int e){//为了保证一个合法的i,这里需要加判断//线性表是连续存储空间,所以需要判断i的合法性if(i<1||i>L.length+1){return false;}//顺序表已经存满,不能再存了if(L.length>=L.MaxSize){return false;}//将插入位置之后的所有元素向后移一位  //按数组下标是从0开始的,所以length-1就是他的最后一个元素for(int j = L.length;j>=i;j--){L.data[j] = L.data[j-1];}L.data[i-1] = e;       //在i位置处放入eL.length++;         //更新线性表的长度return true;
}
bool ListDelete(SqList &L,int i,int &e){//先判断删除位置是否合法if(i<1||i>L.length+1){return false;}e = L.data[i-1];//将i之后的元素依次向前移一位for(int j = i;j<L.length;j++){L.data[j-1] = L.data[j];}L.length--;      //更新线性表的长度return true;
}//查找元素
int GetElem(SqList L,int i){//为了保存代码的健壮性,再加上对位置i的合法判断if(i<1||i>L.length){printf("您的i不合法\n");return -1;}return L.data[i-1];
}
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序i+1
int LocateElem(SqList L,int e){for(int i=0;i<L.length;i++){if(L.data[i]==e){return i+1;}}return 0;
}int main(){SqList L;           //声明一个顺序表InitList(L);       //初始化顺序表//插入一些元素...for(int i=0;i<L.length;i++){L.data[i] = i;}/*//查找位置10上的元素int ele = GetElem(L,10);if(ele==-1){printf("您输入的位置不合法,请重新输入!\n");}else{printf("您要查找的元素是%d\n",ele); }
*///查找元素e在顺序表中的位置int l = LocateElem(L,70);if(l==0){printf("您要查找的元素顺序表中没有\n");}else{printf("您要查找的元素在位置%d上\n",l);}return 0;
}

顺序表的插入和删除操作相关推荐

  1. 2 顺序表的插入,删除,查找操作(详细)

    一 顺序表的结构体定义和函数声明 #include<iostream> using namespace std; #define ElemType int  // 自定义 #define ...

  2. 顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)

    实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include using namespace std; #define MAXSI ...

  3. 本科课程【数据结构与算法】实验1——线性表的顺序表示及插入、删除操作(C++实现)

    大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...

  4. 多表(三个表)插入与删除操作

    业务需求: 新增和删除分类信息,以category为主表,category_detail和image为副表,在不额外编写Sql.mapper.xml文件的前提下,利用mybatis-plus中的内置函 ...

  5. 数据结构—线性表顺序存储插入和删除操作

    线性表的操作:1.InitList(*L):初始化操作,建立一个空的线性表L 2.ListEmpty(L):判断线性表是否为空,如果为空,返回true,否则返回false 3.ClearList(*L ...

  6. 【数据结构】—顺序表的插入、删除、查找操作

    #include <stdio.h> #include <malloc.h> #include <stdlib.h> #define InitSize 10 //默 ...

  7. c语言编程文件中删除数据结构,C语言数据结构实战(一)顺序表的插入与删除

    今天学习了思成老师的数据结构实战教程 写了一个顺序表 插入和删除的操作 把源码共享给大家 一共包括list.c stu.h main.c list.h   .h文件是头文件 需要引入 具体的功能我都已 ...

  8. 实现一个顺序表的建立、查找、插入和删除操作【数据结构实验报告】

    文章目录 一.实验目的 二.算法说明 三.算法实现 四.测试效果 一.实验目的 1.熟悉将算法转换为程序代码的过程. 2.了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的c语言描述方法. 3.熟练掌 ...

  9. 顺序表的插入删除查找遍历

    顺序表的插入删除查找遍历 文章目录 顺序表的插入删除查找遍历 代码 运行结果截图 代码 #define Maxsize 100typedef int ElemType; typedef struct{ ...

最新文章

  1. 号称3个月发布最强量子计算机,卖口罩的霍尼韦尔凭什么?
  2. 【redis】2.redis可视化工具安装使用
  3. Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)
  4. Linux系统目录结构及主要内容
  5. 寻找榜样的力量!CSDN【百万人学 AI】评选活动重磅启动
  6. 信息化基础建设 工作流开发
  7. 在Windows 7上安装ACE 6.1.0
  8. 第三方支付处理厂商软件有漏洞,日本美容零售商Acro 10万支付卡信息遭攻击
  9. 第十章第二节 阿基米德原理
  10. 转 json数组对象和对象数组
  11. fluidsim元件库下载_fluidsim手册.pdf
  12. GB50174《电子信息系统机房设计规范》标准目录
  13. arcgis调整图框线宽
  14. defy+me525+android2.3.6官方镜像包,V大DEFY/DEFY+ ME525 ME525+ 2.3.6巅峰优化版0.86(红头)...
  15. PCB多层板的一些资料
  16. SSL 3.0 Poodle漏洞修复方法
  17. 仿照elementUI编写自己的表单组件
  18. 直观理解Dilated Convolution
  19. PYNQ搭建系统-Petalinux上网方式
  20. 报表工具轻松搞定卡片式报表

热门文章

  1. Python学习第九篇:zipfile 库操作压缩包
  2. 安装catia时 计算机ID不同步,CATIAV5R20安装手册A
  3. 三菱FX3U-485ADP-MB通讯三种变频器程序,已实现测试的变频器:施耐德ATV312, 三菱E700,台达VFD-M三款变频器,支持rtu的协议的变频器都可实现
  4. Unity 与Android /IOS 交互
  5. uni-app图片裁剪按照16:9或者9:16尺寸裁剪
  6. Typescript是什么? Typescript都有哪些?
  7. 自己融合RGB和Depth图像
  8. idea-提示内存不足
  9. Windows2003和SP2补丁集成+GHOST安装系统
  10. 成功人士应该具备的十二个条件