线性表顺序存储结构-顺序表(考研数据结构)

线性表顺序存储结构-顺序表

查找第i个元素:时间O(1)
查找某个值的元素:时间O(n)
删除一个元素:时间O(n)
插入一个元素:时间O(n)

优点:

  1. 能够随机访问,查找第i个元素时间O(1)
  2. 在有序时可以使用二分查找法,在时间O(log2n)级上完成查找某个值的元素

缺点:

  1. 使用静态分配时,无法扩展容量
  2. 使用动态分配时,扩展容量需要时间O(n),空间O(n)
  3. 插入删除需要移动大量元素
/*
动态分配的顺序存储结构的线性表实现
*/
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define ElemType int
using namespace std;

typedef struct List{
    ElemType* data;// 指针,可以指向一片连续的空间
    int mSize;// 最大容量
    int len;// 当前使用容量
}List;
// 初始化一个 动态分配的顺序表, 长度为mSize+1, 0下标不使用
void Init(List& list, int mSize){
    list.data = new ElemType[mSize + 1];
    list.len = 0;
}
// 在index个位置上插入一个元素
bool Insert(List& list, int index, ElemType data){
    if(index < 1 || index > list.len + 1) return false; // 防止溢出
    if(list.len == list.mSize){// 如果已经存满了,则将容器扩大
        int newSize = list.mSize * 2 + 17;
        ElemType* data = new ElemType[newSize];// 创建一个更大的容器
        for(int i = 1; i <= list.len; i++){// 将数据拷贝过去
            data[i] = list.data[i];
        }
        delete list.data;// 释放久容器空间
        list.data = data;// 获得新容器
        list.mSize = newSize;
    }
    for(int i = list.len + 1; i >= index; i--){// 从后向前,将元素后移
        list.data[i + 1] = list.data[i];
    }
    list.data[index] = data;// 赋值
    list.len++;// 长度加1
    return true;
}
// 删除第index个位置上的一个元素
bool Delete(List& list, int index){
    if(index < 1 || index > list.len) return false;// 防止溢出
    for(int i = index; i <= list.len - 1; i++){// 从前向后,将元素前移
        list.data[i] = list.data[i + 1];
    }
    list.len--;// 长度减1
    return true;
}
// 显示链表
void Show(List list){
    for(int i = 1; i <= list.len; i++){
        cout << list.data[i] << ",";
    }
    cout << endl;
}



int main(){

    List list;
    // 初始化一个 顺序表
    Init(list, 60);
    // 插入一些数据
    for(int i = 1; i <= 100; i++){
        Insert(list, i, i);
    }
    Show(list);
    // 删除最前端的一些元素
    for(int i = 1; i <= 20; i++){
        Delete(list, 1);
    }
    Show(list);
    // 删除最后的一些元素
    for(int i = 21; i <= 30; i++){
        Delete(list, list.len);
    }
    Show(list);

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦鸢MoYuan

谢谢投喂!!!QWQ!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值