数据结构:顺序表的插入和删除

本文详细介绍了顺序表的概念,包括其静态构建、初始化过程,以及如何进行插入和删除操作。展示了C++代码实例,涵盖了顺序表的元素类型定义、内存分配、表长管理等关键步骤。
摘要由CSDN通过智能技术生成

总代码在最后哦!

目录

一、了解顺序表

二、静态顺序表的构建

三、顺序表初始化

四、顺序表的插入

五、顺序表的删除

六、顺序表的输入和输出

七、总代码


一、了解顺序表

顺序表是线性表的顺序存储,它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

需要注意的是顺序表中第一个元素的下标是从0开始的

二、静态顺序表的构建

假设顺序表的元素类型为ElemType,则线性表的顺序存储类型为

typedef int ElemType;

typedef struct {
    ElemType *elem;
    int length;
}SqList; 

(1)在这里我将元素类型(ElemType)定义为整数类型。

(2)ElemType *elem  是定义了一个指向ElemType类型的指针elem。

这段代码是定义了一个结构题类型SqList,包含一个指向ElemType类型的指针和一个整数类型的变量。

三、顺序表初始化

#define MAXSIZE 100 

Status initList(SqList &L){
    //构造一个空的顺序表L 
    //为顺序表分配一个大小为MAXSIZE的数组空间 
    L.elem = new ElemType[MAXSIZE];
    //存储分配失败返回Error 
    if(!L.elem) return Error;
    //空表长度为0 
    L.length=0;
    return Ok;
}

这段代码是初始化一个顺序表,构造一个空的顺序表,为顺序表分配一个大小为100的数组空间,如果顺序表L的元素数组空间分配失败即顺序表的基地址(L.elem)为0,则返回Error;将顺序表L的长度设置为0,表示当前顺序表中没有元素。

四、顺序表的插入

Status  ListInsert(SqList &L,int i,ElemType e){
    //在顺序表L中第i个位置插入新的元素e,i的合法范围是1<=i<=L.length+1;
    //i的值不合法返回Error 
    if(i<1 || i>L.length+1) return Error;
    //当前存储空间已满 
    if(L.length==MAXSIZE) return Error;
    //插入位置及以后的元素后移 
    for(int j=L.length-1;j>=i-1;j--){
        L.elem[j+1]=L.elem[j];
    }
    //将新元素e放入第i个位置 
    L.elem[i-1]=e;
    //表长加1 
    L.length++;
    return Ok; 
} 

每句代码的解释如上,下面解释一下其中的for循环。

我们假设顺序表L中的数据元素有12、23、34、45、56.元素长度(L.length)为5.若在第3个位置插入一个元素0,则34、45、56.这3个元素需要各往后移一个位置,并且在移动元素时是从最后一个元素开始移动的。定义一个整数变量j,j的初始值为L.length-1=4,j的范围是大于等于i-1=2。上面已经讲了顺序表的下表是从0 开始的,第5个元素在顺序表中的下标是4,依此类推。

五、顺序表的删除

Status  ListDelete(SqList &L,int i){
    //在顺序表L中删除第i个元素,i的合法取值范围是1<=i<=L.length
    //i的值不合法 
    if(i<1 ||i>L.length) return Error;
    for(int j=i-1;j<L.length;j++){
        //被删除元素之后的元素前移 
        L.elem[j]=L.elem[j+1];
    } 
    //表长-1 
    L.length--;
    return Ok;
} 

同上面顺序表的插入差不多,不过顺序表的删除是直接将后面一个元素覆盖前一个元素,被删除元素之后的元素往前移,与顺序表的插入不同的是元素删除前移是从删除元素后的第一个元素开始移动的。

六、顺序表的输入和输出

//顺序表输出
void printList(SqList L){
    for(int i=0;i<L.length;i++){
        cout<<L.elem[i]<<" "; 
    }
    cout<<endl;
} 

//顺序表输入
Status inListValue(SqList &L,int n){
    if(n<0||n>MAXSIZE) return Error;
    if(L.length==MAXSIZE) return Error;
    for(int i =0;i<n;i++){
        L.elem[i]=rand();
        L.length++;
    }
    return Ok;
} 

七、总代码

#include<iostream> 
#include<stdlib.h>
#define MAXSIZE 100 
#define Error 0
#define Ok 1
using namespace std;
typedef int ElemType;
typedef int Status;
 
//顺序表的存储结构 
typedef struct {
    //存储空间的基址 
    ElemType *elem;
    //当前长度 
    int length;
}SqList; //顺序表的结构类型为SqList

//顺序表初始化
Status initList(SqList &L){
    //构造一个空的顺序表L 
    //为顺序表分配一个大小为MAXSIZE的数组空间 
    L.elem = new ElemType[MAXSIZE];
    //存储分配失败返回Error 
    if(!L.elem) return Error;
    //空表长度为0 
    L.length=0;
    return Ok;
}
//顺序表的插入
Status  ListInsert(SqList &L,int i,ElemType e){
    //在顺序表L中第i个位置插入新的元素e,i的合法范围是1<=i<=L.length+1;
    //i的值不合法返回Error 
    if(i<1 || i>L.length+1) return Error;
    //当前存储空间已满 
    if(L.length==MAXSIZE) return Error;
    //插入位置及以后的元素后移 
    for(int j=L.length-1;j>=i-1;j--){
        L.elem[j+1]=L.elem[j];
    }
    //将新元素e放入第i个位置 
    L.elem[i-1]=e;
    //表长加1 
    L.length++;
    return Ok; 
    
} 
//顺序表的删除
Status  ListDelete(SqList &L,int i){
    //在顺序表L中删除第i个元素,i的合法取值范围是1<=i<=L.length
    //i的值不合法 
    if(i<1 ||i>L.length) return Error;
    for(int j=i-1;j<L.length;j++){
        //被删除元素之后的元素前移 
        L.elem[j]=L.elem[j+1];
    } 
    //表长-1 
    L.length--;
    return Ok;
} 

//顺序表输出
void printList(SqList L){
    for(int i=0;i<L.length;i++){
        cout<<L.elem[i]<<" "; 
    }
    cout<<endl;
} 

//顺序表输入
Status inListValue(SqList &L,int n){
    if(n<0||n>MAXSIZE) return Error;
    if(L.length==MAXSIZE) return Error;
    for(int i =0;i<n;i++){
        L.elem[i]=rand();
        L.length++;
    }
    return Ok;
} 
//顺序表的长度 
int ListLength(SqList *L){
	return L->length;
}
int main()
{
	int List=0,m,e,n;
	SqList La;
	List=initList(La);
	if(List==Ok) cout<<"顺序表La创建成功"<<endl;
	cout<<"输入m个数据:m=";
	cin>>m;
	cout<<"请输入"<<m<<"个数据:"<<endl; 
	 for(int i=1;i<=m;i++)
    {
    	int e1;
    	cin>>e1;
    	ListInsert(La,i,e1);
	}
	cout<<"-------顺序表插入元素--------"<<endl;
    cout<<"要插入的位置:"<<endl;
    cin>>n;
    cout<<"要插入的元素:"<<endl;
    cin>>e; 
    ListInsert(La,n,e);
    cout<<"--------顺序表插入完成-------"<<endl;
    cout<<"插入之后的顺序表:"<<endl;
    printList(La);
     cout<<"-------顺序表删除元素--------"<<endl;
    cout<<"删除元素的位置:"<<endl;
    cin>>n;
    ListDelete(La,n); 
    cout<<"-------顺序表删除完成-------"<<endl;
    cout<<"删除之后的顺序表:"<<endl;
    printList(La);
	return 0;
}

好啦!这就是全部啦!希望能够帮助大家。

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值