数据结构实现 5.2:映射_基于链表实现(C++版)

本文介绍了如何使用链表实现映射数据结构,详细讲解了链表结点的设计、映射类的框架以及增、删、改、查等基本操作的实现。还探讨了算法复杂度,指出链表实现相比于二分搜索树实现的效率差距。
摘要由CSDN通过智能技术生成

1. 概念及基本框架

.
5.1 中我们通过 二分搜索树 来实现了映射,这一节我们通过 链表 来实现映射。

映射
映射 的基本特性依然要满足:
1.映射内元素包含 键(key)值(value) ,而且一一对应。
2.映射内的元素的键 不能重复
注:有些映射(多重映射)中元素的键也可以重复。
2.1 中实现的链表结点只有一个数据,所以我们需要从底层进行一些改进去适应映射这一数据结构。首先来定义链表的结点类:

template <class K, class V>
class MapNode{
   
public:
	MapNode(K key = NULL, V value = NULL, MapNode<K, V> *next = NULL){
   
		m_key = key;
		m_value = value;
		this->next = next;
	}
public:
	K m_key;
	V m_value;
	MapNode<K, V> *next;
};

这个结点类的内部也显式的给出了构造函数,下面通过结点类来创建一个映射类。
注:这里我们也可以先实现一个链表类,然后通过链表来实现映射类。
有了改进版的链表结点,我们就可以利用一个由 纯虚函数 构成的 抽象类 作为一个接口来定义这些操作。具体代码如下:

template <class K, class V>
class Map{
   
public:
	virtual int size() = 0;
	virtual bool isEmpty() = 0;
	//增加操作
	virtual void add(K key, V value) = 0;
	//删除操作
	virtual V remove(K key) = 0;
	//修改操作
	virtual void set(K key, V value) = 0;
	//查找操作
	virtual bool contains(K key) = 0;
	virtual V get(K key) = 0;
};

下面只需要通过继承 抽象类,并且重写 纯虚函数 ,就可以完成 映射 的实现。映射类的框架如下:

template <class K, class V>
class LinkedListMap : public Map<K, V>{
   
public:
	LinkedListMap(){
   
		head.m_key = NULL;
		head.m_value = NULL;
		head.next = NULL;
		m_size = 0;
	}
	...
private:
	MapNode<K, V> head;
	int m_size;
};

这里为了避免重复设计就可以兼容更多数据类型,引入了 泛型 ,即 模板 的概念。(模板的关键字是 classtypename
这里链表加了虚拟头结点,同样,为了保护数据,变量设置为 private
实现了前面的程序之后,接下来就是一个映射的增、删、改、查以及一些其他基本操作,接下来利用代码去实现。

2. 基本操作程序实现

2.1 增加操作

template <class K, class V>
class LinkedListMap : public Map<K, V>{
   
public:
	...
	
内含资源如下: 1.基本数据结构 1.1.Array ........... 动态数组 1.2.LinkedList ... 链表 1.3.BST .............. 二分搜索树 1.4.MapBST ..... 二分搜索树(用于实现映射) 1.5.AVLTree ...... AVL树 2.接口 2.1.Queue ........... 队列接口 2.2.Stack .............. 栈接口 2.3.Set .................. 集合接口 2.4.Map ............... 映射接口 2.5.Merger .......... 自定义函数接口 2.6.UnionFind ..... 并查集接口 3.高级数据结构 3.1.ArrayQueue .......................... 队列_基于动态数组实现 3.2.LinkedListQueue .................. 队列__基于链表实现 3.3.LoopQueue ........................... 循环队列_基于动态数组实现 3.4.PriorityQueue ....................... 优先队列_基于最大二叉堆实现 3.5.ArrayPriorityQueue ............. 优先队列_基于动态数组实现 3.6.LinkedListPriorityQueue ..... 优先队列_基于链表实现 3.7.ArrayStack ............................. 栈_基于动态数组实现 3.8.LinkedListStack ..................... 栈_基于链表实现 3.9.BSTSet ..................................... 集合_基于二分搜索树实现 3.10.LinkedListSet ....................... 集合_基于链表实现 3.11.BSTMap ................................ 映射_基于二分搜索树实现 3.12.AVLTreeMap ....................... 映射_ 基于AVL树实现 3.13.LinkedListMap .................... 映射_基于链表实现 3.14.MaxHeap ............................. 最大二叉堆 3.15.SegmentTree ...................... 线段树 3.16.Trie ......................................... 字典树 3.17.QuickFind ............................ 并查集_基于数组实现 3.18.QuickUnion ......................... 并查集_基于树思想实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值