[C++] 数据结构(C):线性表之顺序表

Posted johnnyzen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++] 数据结构(C):线性表之顺序表相关的知识,希望对你有一定的参考价值。

1 顺序表 ADT

+ Status InitList(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) (按位)删除 

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

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 (按位)取值 

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.4 (按值)查找 

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.5 (按位)插入 

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.6 (按位)删除 

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;

2.7 遍历顺序表 

void printSeqList(SeqList L)

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

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);
	printSeqList(L);
	
	e.data = ‘G‘;
	ListInsert(L, 1, e);
	printSeqList(L);
	
	Status status = GetElement(L, 1, e);	
	printf("status: %d\n", status);
	
	status = ListDelete(L, 1);
	printSeqList(L);
	
	printElementType(e);

	return 0;
 

运行结果

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

 

4 参考资料

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

 

以上是关于[C++] 数据结构(C):线性表之顺序表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构——线性表之顺序表篇

数据结构——线性表之顺序存储结构

线性链表之顺序表

数据结构线性表之顺序表ArrayList

数据结构学习总结线性表之顺序表

线性表之顺序存储结构(顺序表)