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. IIS 自动化发布工具实现-Manager【二】

    思路: 1.首先是要获取项目的差异文件列表,实现方式是通过cmd 执行git 命令. git pull   拉取最新代码 git log   查看git签入记录  ,使用参数 --pretty=for ...

  2. java学习笔记13-重写与重载

    重写 重写是子类对父类允许访问的方法实现过程进行重新编写,返回值和参数都不能变. 重写方法不能抛出新的检查异常和比被重写方法更加宽泛的异常 访问权限不能比被重写方法低 声明为final的方法不能被重写 ...

  3. python_字符串方法

    1.字符串大小写转 value = "wangdianchao" # 转换为大写 big_value = value.upper() print(big_value) # 转换为小 ...

  4. jq监听页面的滚动事件,

    jQuery监听页面的滚动状态,实现代码: $(document).scroll(function() {       var scroH = $(document).scrollTop(); //滚 ...

  5. Angular4的dom事件

    Angular4的dom事件 差值表达式和属性绑定其实是一样的(例) <!-- 这两个是一样的效果,使用哪个都可以 --> <img src="{{imgUrl}}&quo ...

  6. 父元素设置固定宽度并设置overflow:scroll,如何让子元素撑开父元素

    <div class="a"> <div class="b"> <div class="c">内容内容, ...

  7. 关于class

    1.使用#include分离函数的定义与实现 c语言可以在xxx.h中定义函数,然后在xxx.cpp中实现函数: 在需要用到这些函数时,只要用#include引入xxx.h即可,这样就不用将所有代码全 ...

  8. P2680 运输计划 二分+树上差分

    又咕咕了几天\(QwQ\) 思路:二分+树上差分 提交:\(\geq5\)次 错因:\(lca\)写错+卡了很久常数(哪位大佬帮我康康,有更好的写法请指出\(QwQ\)) 题解: 我们先将原问题转化为 ...

  9. UVA 11754 Code Feat 中国剩余定理+枚举

    Code FeatUVA - 11754 题意:给出c个彼此互质的xi,对于每个xi,给出ki个yj,问前s个ans满足ans%xi的结果在yj中有出现过. 一看便是个中国剩余定理,但是同余方程组就有 ...

  10. Screen 用法简述

    Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换.GNU Screen可以看作是窗口管理器的命令行界面版本.它提 ...