[数据结构1] 线性表之顺序表的增删改查(含综合测试)
创始人
2024-06-03 06:30:40
0

前言

        从本篇文章开始,正式开启考研专业课之一的数据结构的复习之旅,数学与专业课并驾齐驱,早开始,后期才能游刃有余。另外博客重点分享数据结构需要动手实践的代码部分,对于概念的解释将被一笔带过或者忽略,望周知。

文章目录

顺序表的定义

顺序表的基本操作

静态分配

定义存储结构

 初始化顺序表

 插入元素

 删除元素

 修改元素

查找元素

测试

动态分配

定义存储结构

 初始化顺序表

 数组动态扩容

内存分配函数malloc()

测试

总结


顺序表的定义

        线性表的顺序存储又称为顺序表。它是一种使用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的元素在物理位置上也是相邻的。第1个元素存储在线性表中的起始位置,第i个元素的存储位置后面紧跟着存储的是第i+1个元素,称i为元素ai在线性表中的位序。

 


顺序表的基本操作

静态分配

静态分配,顾名思义,数组在运行之前的大小是固定好的,无法更改。

定义存储结构

//定义顺序表的存储结构 
typedef struct {int data[MaxSize];//顺序表的元素 int length;//顺序表的当前长度 
}SqlList;//顺序表的类型定义

 初始化顺序表

//初始化
void InitList(SqlList &L){for(int i=0;i

 插入元素

//插入元素 
bool ListInsert(SqlList &L,int i,int e){//判断插入位置i是否合法if(i<1||i>L.length+1) return false;//判断当前存储空间是否已满,已满则不能插入if(L.length>=MaxSize) return false;//从第i个位置往后依次移动元素,空出第i个位置给待插入的元素 for(int j=L.length;j>=i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;//在位置i处插入该元素,下标为i-1 L.length++;//插入后长度加一return true; 
}

 删除元素

//删除元素
bool ListDelete(SqlList &L,int i,int &e){//判断删除位置i是否合法if(i<1||i>L.length) return false;e=L.data[i-1];//将要删除的元素 存入e带回、//从第i个位置开始后面元素依次向前移动,从而覆盖掉要删除的元素 for(int j=i;j

 修改元素

//修改元素(按值修改) 按下标修改很简单,只需L.data[i-1]=e 即可 
bool ListChange(SqlList &L,int oldNumber,int newNumber){int flag=0;for(int j=0;j

查找元素

//查找元素(按值查找)  按照下标查找直接返回L.data[i-1] 查找时间复杂度为O(1) 即随机存取 
int ListSearch(SqlList &L,int target){for(int i=0;i

测试

#include"stdio.h"
#define MaxSize 20
//定义顺序表的存储结构 
typedef struct {int data[MaxSize];//顺序表的元素 int length;//顺序表的当前长度 
}SqlList;//顺序表的类型定义//初始化
void InitList(SqlList &L){for(int i=0;iL.length+1) return false;//判断当前存储空间是否已满,已满则不能插入if(L.length>=MaxSize) return false;//从第i个位置往后依次移动元素,空出第i个位置给待插入的元素 for(int j=L.length;j>=i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;//在位置i处插入该元素,下标为i-1 L.length++;//插入后长度加一return true; 
}//删除元素
bool ListDelete(SqlList &L,int i,int &e){//判断删除位置i是否合法if(i<1||i>L.length) return false;e=L.data[i-1];//将要删除的元素 存入e带回、//从第i个位置开始后面元素依次向前移动,从而覆盖掉要删除的元素 for(int j=i;j

正常测试

 

异常测试

 


 

动态分配

        动态分配,顾名思义,可以在程序运行时动态地改变数组的大小,使用malloc函数动态地向内存申请额外的内存空间达到扩容的目的,较为灵活,但在复制原来的数组内容时,时间复杂度较高。

定义存储结构

//定义存储结构 
typedef struct {int *data;//指向动态数组的指针int MaxSize;//顺序表的最大容量 int length; //顺序表的当前长度 
}SqlList;

 初始化顺序表

//初始化
void InitList(SqlList &L){//使用malloc函数向内存申请一整片连续的存储空间L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize; 
} 

 数组动态扩容

//动态扩容增大数组长度
void IncreaseArraySize(SqlList &L,int len){int *old=L.data;//存储原来动态数组的指针 //重新向内存申请更大的空间 L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));for(int i=0;i

内存分配函数malloc()

C语言malloc函数详解(通俗易懂)icon-default.png?t=N176https://blog.csdn.net/RY_01/article/details/122815201?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167871171516782427480638%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167871171516782427480638&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-122815201-null-null.142^v73^pc_new_rank,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=malloc%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187

测试

#include"stdio.h"
#include"stdlib.h"
#define InitSize 10
//定义存储结构 
typedef struct {int *data;//指向动态数组的指针int MaxSize;//顺序表的最大容量 int length; //顺序表的当前长度 
}SqlList;//初始化
void InitList(SqlList &L){//使用malloc函数向内存申请一整片连续的存储空间L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize; 
} //插入元素 
bool ListInsert(SqlList &L,int i,int e){//从第i个位置往后依次移动元素,空出第i个位置给待插入的元素 for(int j=L.length;j>=i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;//在位置i处插入该元素,下标为i-1 L.length++;//插入后长度加一return true; 
}//动态扩容增大数组长度
void IncreaseArraySize(SqlList &L,int len){int *old=L.data;//存储原来动态数组的指针 //重新向内存申请更大的空间 L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));for(int i=0;i

运行结果

动态分配内存下的顺序表只是数组长度可变,其基本的增删改查操作同静态分配中一致!

故此处不再赘述。


总结

  •  顺序表在使用前务必先进行初始化,否则会输出内存中的异常数据造成紊乱,如下图

  •  C语言的动态分配语句为
L.data=(ElemType *)malloc((InitSize*sizeof(ElemType));
  • C++语言的动态分配语句为
L.data=new ElemType[InitSize];
  • 注意位序与下标的区别,位序从1开始,下标从0开始
  • 在执行插入、删除、修改元素时,要先进行异常处理,即对于位序i进行合法性的判断
  • 封装思想,在测试中经常使用到循环打印顺序表中的元素,可以将该操作封装起来复用
//打印顺序表
void PrintList(SqlList &L){for(int i=0;i

END.

相关内容

热门资讯

400平的超市利润怎么样 开4... 随着新零售业的兴起,开设便利店已经成为越来越多的人创业的首选。便利店具有投资少、风险低、回报快的优势...
15平方做什么加盟店 15平方... 10多平米的空间可以满足上百人的购物需求,投资小回报高,自助购物,刷脸付款,科技十足!7月底,JD....
新希望六和股份有限公司2025... 证券代码:000876 证券简称:新希望 公告编号:2025-58债券代码:127015,12704...
创新党建“三联”机制 践学赋能... 转自:沈阳日报  从泛黄的经卷到指尖上的智慧政务,一场跨越时空的文化与科技探索之旅在大东区党员干部的...
37家银行103名选手燃热沈阳... 转自:沈阳日报  “《中国人民银行关于加强支付结算管理防范电信网络新型违法犯罪有关事项的通知》规定:...
连日多雨 天气闷热 转自:沈阳日报  本报讯(沈阳日报、沈报全媒体记者徐佳婷)连日来,沈城开启多雨模式。7月1日,记者从...
警惕儿童糖尿病酮症酸中毒的“隐...   你家孩子是否频繁出现口渴难耐、排尿增多、浑身乏力,明明食量增加,体重却持续下降的情况?别再将这些...
历史文化名城保护大事记发布   本报讯(记者 陈雪柠)记者昨天获悉,《2024年度北京历史文化名城保护大事记》近日发布,收录了名...
美股收盘:三大指数走势分化 道... 财联社7月2日讯(编辑 夏军雄)美东时间周二,三大指数指数走势分化,投资者纷纷撤出科技股,导致纳指跌...
帆布包里装满“百家事” 转自:沈阳日报  在皇姑区舍利塔街道太平社区,总能看到一个肩挎帆布包的身影穿梭于楼宇之间。这个不起眼...