首页 > 其他分享 >顺序表

顺序表

时间:2024-07-18 14:41:56浏览次数:10  
标签:顺序 下标 DataType SeqList Pos int Size

顺序表

结构描述

#include <iostream>
#include <cstdlib>
#define MAX 100
using namespace std;

typedef int DataType;

class SeqList {
private:
    DataType * A;
    int Size;
public:

    //在当前位置插入
    void InsertThisPos(int Pos, DataType X);

    //删除当前位置的元素
    void DeleteThisPos(int Pos);

    //排序
    void SelectionSort();

    //查找
    int SearchByValue(DataType Value);
    DataType SearchByPos(int Pos);
    DataType GetMax();
    DataType GetMin();

    //修改
    void ModifyByValue(DataType NowValue, DataType NewValue);
    void ModifyByPos(int Pos, DataType NewValue);

    //初始化
    void Init();
    //判空
    bool IsFull();
    //判满
    bool IsEmpty();
    //打印
    void Print();
    //交换
    void Swap(DataType & X, DataType & Y);
    //下标合法性
    bool PosOK(int Pos);
};

初始化

创建一个一个一个空表,把空间分配好,把 Size 的初值设置为 0

void SeqList::Init() {
    A = (DataType *)malloc(sizeof (DataType) * MAX);
    Size = 0;
    //The sizeof (*A) * MAX is the size of Array that named A.
    memset(A, 0, sizeof (*A) * MAX);
}

判空、判满、打印、下标合法

判空: Size == 0
判满: Size == MAX
打印: 遍历、逐个打印
下标合法:下标取值在 \([0, Size - 1]\) 之间,若合法,返回 true 反之返回 false

bool SeqList::IsFull() {
    return MAX == Size;
}
bool SeqList::IsEmpty() {
    return 0 == Size;
}
void SeqList::Print() {
    int i;
    for (i = 0; i < Size; i++) {
        printf("A[%d] == %d%c", i, A[i], i % 10 == 0? '\n': ' ');
    }
}
bool SeqList::PosOk(int Pos) {
    return Pos >= 0 && Pos < Size;    
}

插入

  • 表满:报错
  • 非满:
    • 下标不合法:报错
    • 合法执行操作:
    • Pos 及其之后的元素向后挪动一位;
    • Pos 位上插入 X;
    • Size 增加 1;
void SeqList::InsertThisPos(int Pos, DataType X) {
    if (Pos > Size || Pos < 0) {
        cout << "Position Error!" << endl;
        exit(-1);
    }

    //下标正常
    for (int i = Size; i > Pos; i--) {
        A[i+1] = A[i];
    }
    A[Pos] = X;
    Size++;
}

尾插

直接调用插入函数,把位置设置为 Size

void SeqList::PushBack(DataType X) {
    InsertThisPos(Size, X);
}

删除

  • 表空或下标不合法:报错
  • 非空且下标合法:
    • Pos 开始,把所有的位都向前挪动一位:
      A[Pos] = A[Pos + 1]
      A[Size - 2] = A[Size - 1]
      Size--
void SeqList::DeleteThisPos(int Pos) {
    //表空,或者下标不合法
    if (IsEmpty() || !PosOK(Pos)) {
        cout << "List Is Empty!" << endl;
        exit(-1);
    }

    int i;
    for (i = Pos; i < Size - 1; i++) {
        A[i] = A[i + 1];
    }

    Size--;
}

排序

  • 表空:报错
  • 非空:任选一种排序算法

查找

按下标查找:

  • 表空或下标不合法:报错
  • 非空且下标合法:直接返回该下标所在的值
DataType SeqList::SearchByPos(int Pos) {
    if (IsEmpty() || !PosOK(Pos)) {
        cout << "List Is Empty or Position Error!" << endl;
        exit(-1);
    }

    return A[Pos];
}

按值查找:

  • 表空:报错
  • 非空且下标合法:遍历对比,找到返回下标,找不到返回 -1
int SeqList::SearchByValue(DataType Value) {
    if (IsEmpty()) {
        cout << "List Is Empty!" << endl;
        exit(-1);
    }

    int i;
    for (i = 0; i < Size; i++) {
        if (A[i] == Value) {
            return i;
        }
    }

    return -1;
}

获取最大、最小值

  • 表空:报错
  • 非空:遍历打擂,寻找最大/小值,或者先排序,然后找最大/小值
DataType SeqList::GetMax() {
    if (IsEmpty()) {
        cout << "List Is Empty!" << endl;
        exit(-1);
    }

    int i;
    int Max = 0;
    for (i = 1; i < Size; i++) {
        if (A[Max] < A[i]) {
            Max = i;
        }
    }

    return A[Max];
}

DataType SeqList::GetMin() {
    if (IsEmpty()) {
        cout << "List Is Empty!" << endl;
        exit(-1);
    }

    int i;
    int Min = 0;
    for (i = 1; i < Size; i++) {
        if (A[Min] > A[i]) {
            Min = i;
        }
    }

    return A[Min];   
}

修改

按照下标修改:

  • 检测下标合法性
  • 修改:修改成功后给出提示
void SeqList::ModifyByPos(int Pos, DataType X) {
    //检测下标
    if (IsEmpty() || !PosOK(Pos)) {
        cout << "List Is Empty or Position Error!" << endl;
        exit(-1);
    }

    A[Pos] = X;
    cout << "修改成功" << endl;
}

按值修改:

  • 查找:查找不成功报错(查找方法中有下标合法性检测,这里不用考虑)
  • 修改:修改成功后给出提示
void SeqList::ModifyByValue(DataType NowValue, DataType NewValue) {
    int Tmp = SearchByValue(NowValue);
    if (Tmp == -1) {
        cout << "Value is Not Exist" << NowValue << endl;
        exit(-1);
    }

    A[Tmp] = NewValue;
}

踩坑记录

第一步初始化的时候,使用 memset() 函数的时候就踩了个大坑,想使用 memset() 函数把数组 A 初始化一下,结果把数组的大小给错写成了指针 A 的大小。

错误

// 一个DataType的大小
memset(A, 0, sizeof (*A));
//一个DataType * 的大小。
memset(A, 0, sizeof (A));

在插入的条件中,把表长 Size 和数组长 MAX 给搞混了

if (Pos > MAX || Pos < 0) {
    cout << "Position Error!" << endl;
    exit(-1);
}

应该用

if (Pos > Size || Pos < 0) {
    cout << "Position Error!" << endl;
    exit(-1);
}

同样的,在判下标合法与否的操作中也犯了同样的错误

bool SeqList::PosOK(int Pos) {
    return Pos >= 0 && Pos < MAX;
}

应当改为:

bool SeqList::PosOK(int Pos) {
    return Pos >= 0 && Pos < Size;
}

标签:顺序,下标,DataType,SeqList,Pos,int,Size
From: https://www.cnblogs.com/codels/p/18309478

相关文章

  • [oeasy]python0025_ 顺序执行过程_流水_流程_执行次序
    顺序执行过程_流水_流程_执行次序......
  • 静态代码块、代码块、构造方法的执行顺序
    一、定义类,定义静态代码块、代码块、构造方法packagecom.lh.beans;/***@authorLH*/publicclassTestAA{static{System.out.println("执行静态代码块。。。");}{System.out.println("执行代码块。。。");}publicTe......
  • 衡庐浅析·C语言程序设计·第三章·三种基本结构之顺序结构
        本文适用于大学的期中期末考试、专升本(专接本、专插本)考试、408等考研预科。如有相关题目疑问或建议欢迎在评论区进行互动。    转载请标明出处。在介绍C的三种基本结构之前,我们首先来逐字逐句的解析一些代码语句,以便更好地上手并学习接下来的内容。此处......
  • C++ STL常用容器之vector(顺序容器)
    文章目录前言一、vector的介绍1.1vector的优点1.2vector的缺点1.3使用场景二、vector常用的操作2.1创建、初始化以及遍历容器2.2查询容器大小2.3访问容器中的元素2.4往容器中添加元素2.5删除容器中的元素2.6清空容器中的元素总结前言本文主要介绍C++STL......
  • 数据结构,(动态)顺序表,C语言实现
    ——如果代码存在问题,请务必评论告诉我,感激不尽(#^.^#)——动态和静态的顺序表差别主要在于开辟内存的方式,动态顺序表中的数据所在内存是通过malloc函数实现的,这也意味着,动态顺序表可以更改存储数据的内存大小,其他的话基本没什么差别1.数据类型定义 structElemType想要建......
  • 震惊!!!居然有这么详细的顺序表 ,走过路过不要错过
     一.顺序表顺序表(SequentialList)是一种线性表,其元素在内存中连续存放,可通过索引直接访问。线性表在逻辑结构上是线性结构,也就是说是连续的一条直线,但是在物理结构上并不一定是连续的。线性表在物理结构上存储时,通常是以数组和链式结构的形式存储的。顺序表是一种基础的数......
  • 顺序表实现
    顺序表介绍顺序表是用来连续存放数据单元的一种结构,逻辑连续的两个元素在实际上也为连续的。顺序表的实现顺序标定义由于我们存储多中数据,所以顺序表的定义使用结构体类型。由于是连续的数据单元,所以我们使用数组来接收顺序表中的数据,size用来表示数据表中存放了多少个数......
  • Spring AOP 切面执行顺序
    1.概述1.1术语SpringAOP的相关术语:Aspect:切面,由一系列切点、增强和引入组成的模块对象,可定义优先级,从而影响增强和引入的执行顺序。事务管理(Transactionmanagement)在java企业应用中就是一个很好的切面样例。Joinpoint:接入点,程序执行期的一个点,例如方法执行、类初始化、......
  • 顺序结构(二)
    上接课我们学习了顺序结构(一),今天我们来学习顺序结构(二),好了废话不多说!我们现在开始我们今天的学习!课程章节介绍 顺序结构(二)字符型C语言风格ASCII码类型转换cmath头文件数据类型类型字节数范围char1-128-127字符类型的变量声明:charm;//定义变量m为字符型。charn='a......
  • 线性表——顺序栈
    #include<bits/stdc++.h>usingnamespacestd;#defineMaxSize2typedefstruct{ intdata[MaxSize]; inttop;}SqStack;//初始化voidInitStack(SqStack&S){ S.top=-1;}//判断栈空和已入栈元素个数voidStackEmpty(SqStackS){ if(S.top==-1) cout<<&......