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

前言

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

文章目录

顺序表的定义

顺序表的基本操作

静态分配

定义存储结构

 初始化顺序表

 插入元素

 删除元素

 修改元素

查找元素

测试

动态分配

定义存储结构

 初始化顺序表

 数组动态扩容

内存分配函数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.

相关内容

热门资讯

福建平和:“世界柚乡”挂满“致... (来源:千龙网)新华社福州12月17日电 题:福建平和:“世界柚乡”挂满“致富金果”新华社记者吴剑锋...
于细微处见担当 在窗口处绽光彩 清晨的阳光透过玻璃窗,洒在办公桌码放整齐的文件上。马彦超翻开待处理工作的文件夹,指尖划过一行行文字,...
水墨乡村景如画 (来源:市场星报) 安徽省黄山市黟县宏村镇冬景如画,晨雾如轻纱般缭绕于白墙黛瓦的徽派民居之间,阳光穿...
从慈禧照片看晚清社会 慈禧与众人在颐和园乐寿堂前慈禧与外国公使夫人合影慈禧中海泛舟假扮观音十九世纪四十年代,西方出现了摄影...