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

时间:2019-08-22
本文章向大家介绍[C++] 数据结构(C):线性表之顺序表,主要包括[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语言版 第二版)》.严蔚敏.李冬梅.吴伟民

原文地址:https://www.cnblogs.com/johnnyzen/p/11392147.html