C++顺序表实现

曹嵩
• 阅读 1692

手写了一波C++顺序表,加深理解。

最大感触:创建一个数组对象,指定数组长度(自定义创建参数length)为100,数组中每个元素都会随机分配内存(随机数据),且数组长度无法修改,只通过修改length的值来限制数组元素访问。像js、python等等之类的语言无非是将底层数据结构做了包装吧。

实现目标(对应js中array对象的部分内建函数实现):

1.创建数组
2.删除数组
3.显示数组每个元素
4.获取数组指定位子的元素
5.查找元素
6.指定位子插入元素
7.删除数组中指定元素
    void CreateList(SqList *&L, ElemType a[], int n); // 建立顺序表
    void DestroyList(SqList *&L);
    void ListEmpty(SqList *L);
    int ListLength(SqList *L);
    void DispList(SqList *L); // 显示数组每哥元素
    bool GetElem(SqList *L, int i, ElemType &e); // 求某个位置数据元素的值(1开始)
    int LocateElem(SqList *L, ElemType e); // 查找元素
    bool ListInsert(SqList *&L, int i, ElemType e); // 插入元素(让第i个位置开始的所有元素一起后移)
    bool ListDelete(SqList *&L, int i, ElemType &e); // 删除元素

部分代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef int ElemType;

typedef struct
{
    ElemType data[MAX_SIZE];
    int length;
}SqList;


int main() {
    printf("start\n");
    SqList *L = NULL;
    int n = 5;
    ElemType arr[5] = {1, 2, 3, 4, 5};
    ElemType newArr[5] = {7, 8, 9, 10, 6};

    CreateList(L, newArr, n);
    DispList(L);
    ListLength(L);

    ElemType result = 0;
    GetElem(L, 1, result);
    printf("GetElem: %d\n", result);

    int locate = -1;
    locate = LocateElem(L, 4);
    printf("locate: %d\n", locate);

    ListInsert(L, 1, 1);
    DispList(L);

    ElemType delResult = -1;
    ListDelete(L, 4, delResult);
    DispList(L);
    printf("del: %d\n", delResult);

    return 0;
}

void CreateList(SqList *&L, ElemType a[], int n) {
    L = (SqList *)malloc(sizeof(SqList));
    for (int i = 0; i < n; i++) {
        L->data[i] = a[i];
    };
    L->length = n;
}

void DispList(SqList *L) {
    for (int i = 0; i < L->length; i++) {
        printf("index: %d, value: %d;\n", i, L->data[i]);
    };
    printf("\n");
}

int ListLength(SqList *L) {
    printf("length: %d\n", L->length);
    return L->length;
}

bool GetElem(SqList *L, int i, ElemType &e) {
    if (i <= 0 || i > L->length) {
        return false;
    }
    e = L->data[i - 1];
    return true;
}

int LocateElem(SqList *L, ElemType e) {
    ElemType result = -1;
    for (int i = 0; i < L->length; i++) {
        if (L->data[i] == e) {
            result = i;
            break;
        }
    }
    return result;
}

bool ListInsert(SqList *&L, int i, ElemType e) {
    int realIndex = i - 1;

    if (realIndex < 0 || realIndex > L->length) {
        return false;
    }

    L->length++;

    for (int index = L->length; index > realIndex && index > 0; --index) {
        L->data[index] = L->data[index - 1];
    }

    L->data[realIndex] = e;

    return true;
}

bool ListDelete(SqList *&L, int i, ElemType &e) {
    if (i < 0 || i >= L->length) {
        return false;
    }
    e = L->data[i - 1];
    L->length--;
    for (int index = i - 1; index < L->length; index++) {
        L->data[index] = L->data[index + 1];
    }
    return true;
}
点赞
收藏
评论区
推荐文章
似梦清欢 似梦清欢
3年前
查找算法
顺序查找顺序查找又称为线性查找,对线性表和链表都适用。线性表可以通过数组下标递增来顺序扫描每个元素,链表可以通过next指针依次扫描每一个元素。:::tip指针实现顺序表时,顺序表中是指针时,在定义顺序表的结构体后,需要对顺序表初始化,初始化时为指针申请堆
Wesley13 Wesley13
4年前
java ArrayList集合
ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类)。在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。集合的创建格式导包:importjava.util.ArrayList;
似梦清欢 似梦清欢
3年前
线性表
线性表的顺序存储实现(数组形式)称为顺序表。线性表顺序表示原理解析这里描述的线性表是逻辑结构的,独立于存储结构。线性表的顺序表示简称顺序表。顺序表实现线性表的方式是使用数组。线性表第一个元素的数组下标是0。另外一种实现顺序表的方法:使用数组方式比动态分配更
Wesley13 Wesley13
4年前
Go 定长的数组
1.Go语言数组的简介  几乎所有的计算机语言都有数组,应用非常的广泛。同样,在Go语言中也有数组并且在数组的基础上还衍生出了切片(slice)。数组是一系列同一类型数据的集合,数组中包含的每个数据被称为数组元素,一个数组包含的元素个数被称为数组的长度,这是数组的基本定义。  在Go语言中数组是一个值类型(ValueType)
Stella981 Stella981
4年前
ASMSupport教程4.11 生成数组操作
<p在任何语言里,数组都是基本的数据类型,我们这一节将讲述如何生成数组操作。</p<p数组操作包括以下几个:</p<ol<li创建数组</li<li获取数组长度</li<li获取数组每个元素的内容</li<li为数组元素赋值</li</ol<p我们接下来对每种操作进行详解。</p<h3<fonts
Stella981 Stella981
4年前
ArrayList源码分析(JDK1.8)
概述ArrayList底层是基于 数组实现的,并且支持 动态扩容 的动态数组(变长的集合类)。ArrayList允许空值和重复的元素,当向ArrayList中添加元素数量大于其底层数组容量时,会通过 扩容机制 重新生成一个容量更大的数组。另外,由于ArrayList底层数据结构是数组,所以保证了在O(1)复杂度下完成随机查
Wesley13 Wesley13
4年前
Java几道面试题的笔记
1.Java中求数组charch\\的长度(元素的个数):ch.length;求字符串s的长度:s.length();2.arraycopy函数用于拷贝数组,定义如下:  staticvoid arraycopy(Object src,intsrcPos, Object dest,intdestPos,intlength) 
Wesley13 Wesley13
4年前
Java数组的声明与创建
今天在刷Java题的时候,写惯了C发现忘记了Java数组的操作,遂把以前写的文章发出来温习一下。首先,数组有几种创建方式?Java程序中的数组\\必须先进行初始化才可以使用,\\所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值,而在Java中,数组是静态的,数组一旦初始化,长度便已经确定,不能再随意更改。
Wesley13 Wesley13
4年前
Java基础语法:数组
一、简介描述:数组是相同类型数据的有序集合。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。基本特点:1.数组的长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.数组元素必须是相同类型,不允许
Wesley13 Wesley13
4年前
C语言利用动态数组实现顺序表(不限数据类型)
实现任意数据类型的顺序表的初始化,插入,删除(按值删除;按位置删除),销毁功能。、顺序表结构体  实现顺序表结构体的三个要素:(1)数组首地址;(2)数组的大小;(3)当前数组元素的个数。1//顺序表结构体2structDynamicArray{3voidaddr;//指向数组的首地址(
3A网络 3A网络
3年前
重写数组的方法(改变原数组)
重写数组的方法(改变原数组)下图是我自我学习模拟数组时总结的一些重新数组的方法:本文我们暂不讨论不改变原数组的方法,只谈改变原数组用到的6种方法。改变原数组的方法push()按参数顺序向数组尾部添加元素,返回新数组的长度javascriptvarcolorreverse()将数组倒叙,改变原数组javascriptArray.prototype.