数据结构_顺序表_基本操作的c++实现

本文介绍了顺序表的静态和动态分配实现,包括初始化、插入、删除和查找等基本操作。静态分配使用固定大小数组,动态分配通过malloc分配内存。在动态分配中,当存储空间不足时,通过IncreaseSize函数增加长度。插入和删除操作涉及到元素的移动,查找操作则快速访问指定位置的元素。
摘要由CSDN通过智能技术生成
//顺序表

//1.定义顺序表这一结构体
//结构类型的比较需要分别比较各数据项是否相等
//1.1静态分配
#define MAXSIZE 10
typedef struct{
    int data[MAXSIZE];
    int length; //顺序表的当前长度
}SqList_1;

//1.2动态分配
#define InitSize 100
typedef struct{
    int *data;    //指示动态分配数组的指针
    int MaxSize;  //顺序表的最大容量
    int length;   //顺序表的当前长度
}SqList;


//2.1初始化一个静态分配的顺序表
void InitList_1(SqList_1 &L){
//    for(int i=0;i<MAXSIZE; i++)
//        L.data[i]=0;          //设置元素默认值这一步可以省略
    L.length=0;           //重要!!分配的空间中可能有脏数据
}

//2.2初始化一个动态分配的顺序表
bool InitList(SqList &L){
    L.data=(int *)malloc(sizeof(int)*InitSize);//仍然是连续的存储空间
    if(!L.data){
        cout<<"分配存储空间失败"<<endl;//存储分配失败
        return false;
    }
    L.length=0;                //空表长度为0
    L.MaxSize = InitSize;//初始存储容量
    return true;
}

//3增加动态数组的长度
void IncreaseSize(SqList &L, int len){
    int *p=L.data;
    L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));
    for(int i=0; i<L.length; i++){            //要把原来的数组整体复制到新分配的存储空间中,时间开销大,不好
        L.data[i]=p[i];
    }
    L.MaxSize=L.MaxSize+len;
    free(p);
}

//4.1静态分配的插入操作
bool ListInsert(SqList_1 &L,int i,int e){   //按位插入
    if(i<1||i>L.length+1)           //判断i的范围是否有效
        return false;
    if(L.length>=MAXSIZE)           //当前存储空间已满,不能插入
        return false;
    for(int j=L.length;j>=i;j--)   //将第i个元素及之后的元素后移
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;                //在位置i处放入e
    L.length++;                //长度+1
    return true;
}

//5.删除(静态分配)
bool ListDelete(SqList_1 &L, int i,int &e){    //按位删除
    if(i<1||i>L.length+1)
        return false;
    e=L.data[i-1];
    for(int j=i;j<L.length;j++)
        L.data[j-1]=L.data[j];
    L.length--;
    return true;
}

//5.查找
//5.1.1按位查找(静态分配)
int GetElem(SqList_1 L, int i){
    return L.data[i-1];
}
//5.1.2按位查找(动态分配)
int GetElem(SqList L, int i){   //时间复杂度O(1)
    return L.data[i-1];         //所以动态分配情况下malloc函数返回的指针类型必须强制转换为data的指针类型,若一个data的大小和malloc指针的大小不同,则此种按位查找方式会出错
}

//5.2.2按值查找(动态分配)
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_1 L;//声明一个静态分配顺序表
    InitList_1(L);  //初始化顺序表
    //......
    for(int i=0;i<L.length; i++)
        printf("data[%d]=%d\n",i,L.data[i]);

    //删除操作
    int e;
    if(ListDelete(L,4,e))
        printf("已删除第4个元素,删除元素的值为=%d\n",e);
    else
        printf("位序i不合法,删除失败\n");


    //
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值