1 顺序表 ADT

+ Status InitList(SeqList &L) 初始化顺序表

+ void printList(SeqList L) 遍历顺序表

+ int ListLength(SeqList L) 获得表长

+ Status GetElement(SeqList L, int i, ElementType &e) (按位)取值 

+ int LocateElement(SeqList L, ElementType e) (按值)查找 

+ Status ListInsert(SeqList &L, int i, ElementType e) (按位)插入 

+ Status ListDelete(SeqList &L, int i) (按位)删除 

2 编程实现

2.1 定义基础数据类型

ElementType (数据元素类型/结构体)

struct ElementType {
char data; // char -> ElementType bool operator==(const ElementType b) const{ // 重载结构体 ElementType 的运算符
return this->data == b.data;
} bool operator!=(const ElementType b) const{
return this->data != b.data;
}
};

Status (状态/枚举类型)

enum Status { ERROR, OK, OVERFLOW };

SeqList (顺序表/结构体)

#define MAXSIZE_SEQLIST 100

typedef struct{
ElementType *elements; // 存储空间的基地址
int length; // 当前长度
} SeqList; // 线性表之顺序表

2.2 初始化顺序表

Status InitList(SeqList &L)

Status InitList(SeqList &L){
L.elements = new ElementType[MAXSIZE_SEQLIST]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elements){
exit(OVERFLOW); // 存储分配失败 -> (异常)退出
}
L.length = 0;
return OK;
}

2.3 遍历顺序表 

void printList(SeqList L)

void printList(SeqList L){
printf("[SeqList.h#printList] L.length: %d\n", L.length);
printf("[SeqList.h#printList] L.elements: \t");
for(int i=0; i< L.length; i++){
printf("%c \t", L.elements[i]);
}
printf("\n");
}

2.4 获得表长

int ListLength(SeqList L)

int ListLength(SeqList L){
return L.length;
}

2.5 (按位)取值 

Status GetElement(SeqList L, int i, ElementType &e)

Status GetElement(SeqList L, int i, ElementType &e){
if(i<1 || i>L.length){ // 判断i值是否合理,若不合理:返回 ERROR
return ERROR;
}
e = L.elements[ i-1 ]; // 赋值; elements[i-1] 单元存储的第 i 个数据元素
return OK;
} 

2.6 (按值)查找 

int LocateElement(SeqList L, ElementType e)

int LocateElement(SeqList L, ElementType e){
for(int i=0; i<L.length; i++){
if(L.elements[i] == e){ //(前提:已重载结构体 ElementType 的'=='运算符)
return i+1;
}
}
return -1;
}

2.7 (按位)插入 

Status ListInsert(SeqList &L, int i, ElementType e)

Status ListInsert(SeqList &L, int i, ElementType e){
if(i<1 || i>L.length+1){ // i 值不合法 (易错: 忘记 +1)
return ERROR;
}
if(L.length == MAXSIZE_SEQLIST){ // 当前存储空间已满
return ERROR;
}
for(int j=L.length; j>=i; j--){ // 插入位置 及之后的元素后移
L.elements[j] = L.elements[j-1];
}
L.elements[i-1] = e; //将新元素 e 放入 第 i 个位置
L.length += 1; //表长 + 1
return OK;
}

2.8 (按位)删除 

Status ListDelete(SeqList &L, int i)

Status ListDelete(SeqList &L, int i){
if(i<1 || i>L.length){ // i 值不合法
return ERROR;
}
for(int j=i-1; j<=L.length-1; j++){ // 删除位置 及之后的元素前移
L.elements[j] = L.elements[j+1];
}
L.length -= 1;
return OK;
}

3 测试运行(Main.cpp)

#include <stdio.h>
//#include <iostream.h>
#include <iostream>
using namespace std; #include "base.h"
#include "SeqList.h" int main(){
SeqList L; // 顺序表 InitList(L); ElementType e;
e.data = 'F';
ListInsert(L, 1, e);
printList(L); e.data = 'G';
ListInsert(L, 1, e);
printList(L); Status status = GetElement(L, 1, e);
printf("status: %d\n", status); status = ListDelete(L, 1);
printList(L); printElementType(e); return 0;
}

运行结果

[SeqList.h#printList] L.length: 1
[SeqList.h#printList] L.elements: F
[SeqList.h#printList] L.length: 2
[SeqList.h#printList] L.elements: G F
status: 1
[SeqList.h#printList] L.length: 1
[SeqList.h#printList] L.elements: F
[base.h#printElementType] ElementType.data: G

4 参考资料

1 《数据结构(C语言版 第二版)》.严蔚敏.李冬梅.吴伟民

[C++]数据结构:线性表之顺序表的更多相关文章

  1. [数据结构 - 第3章] 线性表之顺序表(C++实现)

    一.类定义 顺序表类的定义如下: #ifndef SEQLIST_H #define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况 ...

  2. C#线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

  3. 数据结构Java实现02----线性表与顺序表

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. 数据结构Java实现01----线性表与顺序表

    一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...

  5. [C++]线性链表之顺序表<一>

    顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...

  6. c/c++ 线性表之顺序表

    线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...

  7. [C++]线性链表之顺序表<二>

    /*   @content 线性链表之顺序表   @date 2017-3-21 1:06   @author Johnny Zen  */ /* 线性表     顺序表     链式表[带头指针/不 ...

  8. python基础下的数据结构与算法之顺序表

    一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表 ...

  9. 线性表之顺序表C++实现

    线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...

随机推荐

  1. No result defined for action com.java.test.Action.HelloAction and result index

    Struts中配置action访问出错: Struts Problem Report Struts has detected an unhandled exception: Messages: No ...

  2. SpringBoot LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

    SpringBoot 在启动项目的时候一起错误: SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in ...

  3. jquery动态背景切换全屏登录插件supersized.js

    下载地址:https://download.csdn.net/download/t101lian/10434198预览: http://www.daimabiji.com/codedemo/1530 ...

  4. [ 转载 ] Java基础二

    前言 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应该说被面试到的几率很大.这里整理挑选出来供大家面试前拿来看一看,所有题目整理自网络,有一 ...

  5. Log 日志收集

    class Log { private readonly static String DateFormat = "yyyyMMdd"; private readonly stati ...

  6. Django 反向查找(related_name)

    先定义两个模型,一个是A,一个是B,是一对多的类型 class A(models.Model): name= models.CharField('名称', max_length=32) class B ...

  7. PHP mysqli_data_seek() 函数

    mysqli_data_seek() 函数调整结果指针到结果集中的一个任意行. // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect(&q ...

  8. Oracle 后台进程(一)简介

    一.什么是Oracle数据库后台进程 为了时系统性能最好并能够协调多个用户,多进程系统使用了一些附加进程,成为后台进程. 在许多操作系统中,后台进程是在实例启动时自动建立的.一个Oracle实例可以包 ...

  9. ueditor+word粘贴上传!

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...

  10. learning express step(六)

    code: use application middleware var express = require('express'); var app = express(); app.use(func ...