C++实现顺序表(不是面向对象技术,而是使用引用参数,面向对象的源代码也有分享)

文件结构 : 

C++实现顺序表(不是面向对象技术,而是使用引用参数,面向对象的源代码也有分享)_第1张图片

文件名字 用途
CmakeList.txt cmake文件
how.md 简述思路以及其他说明
main.cpp 主测试程序
SequenceTable.cpp 核心实现文件
SequenceTable.h 核心头文件

SequenceTable.cpp

//
// Created by A Luck Boy on 2023/1/4.
//
#include "SequenceTable.h"

void initTable(SequenceTable &L) {
    // 为了谨慎,这里可以考虑是否初始化成功,下面销毁操作同理
    L.maxsize = BaseMaxSize;
    L.data = (int *) malloc(sizeof(int) * L.maxsize);
    L.length = 0;
    L.eachStep = 1;
    printf("初始化成功!\n");
};

void destroyTable(SequenceTable &L){
    free(L.data);
    printf("销毁成功!\n");
};

bool isEmpty(SequenceTable L){
    if (L.length == 0){
        return true;
    }
    return false;
};

bool isFull(SequenceTable L){
    if (L.length < L.maxsize){
        return false;
    }return true;
};

int getLength(SequenceTable L) {return L.length;};

int append(SequenceTable &L, int element){
    // 如果此时表已填满,则自动扩容
    if (isFull(L)){
        int * another_SequenceTable = L.data;
        L.maxsize += L.eachStep;
        L.data = (int * ) malloc(sizeof(int ) * L.maxsize);
        for (int i=0;i L.length-1){return false;}
        else{
            // 考虑到已存满状态,需要扩容内存的情况
            if (isFull(L)){
                expand(L, 1);
            }
            static int *another_sql = copy_sql(L);
            for (int i=location;i L.length-1){return false;}
    int * another_SequenceTable = copy_sql(L);
    for (int i=location;i < L.length;i++){
        L.data[i] = another_SequenceTable[i+1];
    }
    L.length--;
    free(another_SequenceTable);
    return true;
};

bool changeItem(SequenceTable &L, int location, int element){
    // 把location索引处的值修改为element
    if (location > L.length-1){
        return false;
    } else{
        L.data[location] = element;
        return true;
    }
};

bool checkItem(SequenceTable L, int element){
    for (int i=0;i

SequenceTable.h

//
// Created by A Luck Boy on 2023/1/4.
//
#include 
#include 

#define Waring printf("代码有问题\n");
#define BaseMaxSize 10

typedef struct SequenceTable{
    int * data;
    int length;
    int maxsize;
    int eachStep;
} SequenceTable;

// methods : 创建、销毁、判空、判满、长度、尾部添加、按位插入、
// 按位删除、按位修改、查找、修改扩容内存时的每次额外扩容点(默认是1)、查看最大准许容量
// 遍历
// 复制一份顺序表数据,但是不希望当支持函数使用
// 扩容函数,但是不希望当支持函数使用
// 额外优化思路 :可以在插入和删除操作里面判断操作位置相较于长度减一的差绝对值,
// 从而重新赋值,比如长度为15,最大所索引就是14,操作索引12,那我可以从后面往前重新赋值,而不是从前往后,这样时间复杂度会节省
void initTable(SequenceTable &L);
void destroyTable(SequenceTable &L);
bool isEmpty(SequenceTable L);
bool isFull(SequenceTable L);
int getLength(SequenceTable L);
int append(SequenceTable &L, int element);
bool insertItem(SequenceTable &L, int location, int element);
bool deleteItem(SequenceTable &L, int location);
bool changeItem(SequenceTable &L, int location, int element);
bool checkItem(SequenceTable L, int element);
bool resize(SequenceTable &L, int new_size=1);
int allowSize(SequenceTable L);
static int * copy_sql(SequenceTable L);
static void expand(SequenceTable &L, int size);
void showAll(SequenceTable L);

main.cpp

//
// Created by A Luck Boy on 2023/1/4.
//
#include "SequenceTable.h"

// 实战
//void initTable(SequenceTable &L);
//void destroyTable(SequenceTable &L);
//bool isEmpty(SequenceTable L);
//bool isFull(SequenceTable L);
//int getLength(SequenceTable L);
//int append(SequenceTable &L, int element);
//bool insertItem(SequenceTable &L, int location, int element);
//bool deleteItem(SequenceTable &L, int location);
//bool changeItem(SequenceTable &L, int location, int element);
//bool checkItem(SequenceTable L, int element);
//bool resize(SequenceTable &L, int new_size=1);
//int allowSize(SequenceTable L);
//static int * copy_sql(SequenceTable L);
//static void expand(SequenceTable &L, int size);
//void showAll(SequenceTable L);

int main(){
    SequenceTable list;
    initTable(list);
    // methods : 创建、尾部添加、按位插入、长度
    if (isEmpty(list)){ printf("空表\n");}
    else {Waring}
    for (int i=0;i<12;i++){
        int new_num = append(list, i * i);
        printf("第%d次, 您已添加整数 : %d\n", i+1, list.data[i]);
    }
    if (insertItem(list, 10, 1000))
    {
        printf("您已成功在第十位索引插入1000,下面是验证\n");
        showAll(list)  ;
        // 按理说这时候长度是13,来验证一下
        if (getLength(list) == 13){ printf("正确, 13\n");}
        else{Waring}
    } else{Waring}
    // 按位删除、按位修改、查找
    if (deleteItem(list, 5)){
        printf("索引5的数字25已被成功删除,现在来验证一下\n");
        printf("先验证长度是否是12,getLength = %d\n", getLength(list));
        showAll(list);
    }
    if (changeItem(list, 6, 0)){
        printf("把索引6的数据改成了0,下面验证\n");
        showAll(list);
    } else{Waring}
    if (checkItem(list, 1000)){
        printf("1000在表里\n");
    } else{Waring}

    // 销毁
    destroyTable(list);
    return 0;
};

终端运行结果

初始化成功!
空表
第1次, 您已添加整数 : 0
第2次, 您已添加整数 : 1
第3次, 您已添加整数 : 4
第4次, 您已添加整数 : 9
第5次, 您已添加整数 : 16
第6次, 您已添加整数 : 25
第7次, 您已添加整数 : 36
第8次, 您已添加整数 : 49
第9次, 您已添加整数 : 64
第10次, 您已添加整数 : 81
第11次, 您已添加整数 : 100
第12次, 您已添加整数 : 121
您已成功在第十位索引插入1000,下面是验证
Index 0 number is 0
Index 1 number is 1
Index 2 number is 4
Index 3 number is 9
Index 4 number is 16
Index 5 number is 25
Index 6 number is 36
Index 7 number is 49
Index 8 number is 64
Index 9 number is 81
Index 10 number is 1000
Index 11 number is 100
Index 12 number is 121
正确, 13
索引5的数字25已被成功删除,现在来验证一下
先验证长度是否是12,getLength = 12
Index 0 number is 0
Index 1 number is 1
Index 2 number is 4
Index 3 number is 9
Index 4 number is 16
Index 5 number is 36
Index 6 number is 49
Index 7 number is 64
Index 8 number is 81
Index 9 number is 1000
Index 10 number is 100
Index 11 number is 121
把索引6的数据改成了0,下面验证
Index 0 number is 0
Index 1 number is 1
Index 2 number is 4
Index 3 number is 9
Index 4 number is 16
Index 5 number is 36
Index 6 number is 0
Index 7 number is 64
Index 8 number is 81
Index 9 number is 1000
Index 10 number is 100
Index 11 number is 121
1000在表里
销毁成功!

额外说明 : 

编译器——g++

平台——Windows64位

相关链接 : 

c++面向对象实现顺序表

LinearTable · PythonnotJava/自己实现的数据结构与算法合集 - 码云 - 开源中国 (gitee.com)

c++引用实现顺序表(即本文源代码) 

顺序表的c++引用实现: 顺序表的c++引用实现 (gitee.com)

你可能感兴趣的:(学习,c++,开发语言,数据结构)