数据结构——线性表:字典(C++)

本文介绍了字典在数据库中的作用,作为线性表的一种,依赖关键码进行操作。关键码需要具备可比性。由于关键码的多样性,无法直接实现通用字典。字典由记录及其相关关键码组成,即键值对。文章还提供了一个简单的字典抽象类和键值对模板类的示例,特别是针对(int-char)的字典实现。

内容概要:

  • 字典的相关概念
  • 注意事项
  • 简单的字典实现

一、字典的相关概念

  • 字典(dictionary)是在数据库中具有存储、查询和删除记录的功能的线性表。
  • 数据库中的记录一般是靠关键码(key)描述的,类似人们的ID号码。
  • 关键码应当具有可比性(comparable)。

二、注意事项

  • 由于关键码类型非常多,不能编写出通用的字典。
  • 关键码不是记录的类的基本属性,也不是类中任意的域,它只是在使用记录时与环境相关的属性。
  • 字典中的任一基本元素包含一条记录及与该记录相关的关键码,记录和关键码的组合称为键值对

三、一个简单的字典

  • 字典抽象类
  • 键值对模板类
  • (int-char)字典类
#pragma once
//dictionary_ADT.h

template<typename Key, typename E>
class Dictionary
{
private:
	void operator =(const Dictionary&){}
	Dictionary(Dictionary&){}
public:
	Dictionary(){}
	virtual ~Dictionary() {}

	virtual void clear()=0;
	virtual void insert(const Key&, const E&) = 0;
	virtual E remove(const Key&) = 0;
	virtual E removeAny() = 0;
	virtual E find(const Key&)const = 0;
	virtual int size() = 0;
};
#pragma once
//key-value pair.h

template<typename Key,typename E>
class KVpair
{
private:
	Key k;
	E e;
public:
	KVpair() {}
	KVpair(const KVpair&kv) { k = kv.k; e = kv.e; }
	KVpair(const Key&k0,const E&e0) { k = k0; e = e0; }
	~KVpair() {};

	Key key() { return k; }
	E element() { return e; }
	void setKey(const Key&k0) { k = k0; }
};
#pragma once
//array based dictionary.h
#include"dictionary_ADT.h"
#include"key-value pair.h"
#include<assert.h>

class ADict:public Dictionary<int,char> 
{
private:
	KVpair<int, char>*list;
	int Maxsize;
	int Size;
public:
	ADict(int defaultSize = 100) { list = new KVpair<int, char>[defaultSize]; Maxsize=100; Size = 0; }
	~ADict() { delete list; }

	void clear() { delete list; }
	void insert(const int&k0,const char&e0)
	{
		assert(Size <= Maxsize);//list is full
		KVpair<int, char> it(k0, e0);
		list[Size++] = it;
	}
	char remove(const int&k0)
	{
		for (int i = 0; i < Size; i++)
			if (list[i].key() == k0)
			{
				char temp = list[i].element();
				for (int k = 0; k < Size-i-1; k++)
					list[i + k] = list[i + k + 1];
				Size--;
				return temp;
			}
		return 0;
	}
	char removeAny()
	{
		assert(Size != 0);//list is empty
		return list[--Size].element();//remove the last one
	}
	char find(const int&k)const
	{
		for(int i=0;i<Size;i++)
			if (list[i].key() == k)
				return list[i].element();
		return 0;
	}
	int size() { return Size; }
};


//问题:键值对模板类对象动态数组list为什么会无成员,,,初步判断应该是由于模板的问题,
//数组元素大小不确定,所以这里把Key和E都分别具体化为int和char类型的,当然也可
//以通过使用链表来解决。
//dictionary_main.cpp

#include"array based dictionary.h"
#include<iostream>
using namespace std;

int main()
{
	ADict cc(10);
	for (int i = 0; i < 20; i++)
		cc.insert(101 + i, (char)(97 + i));

	cout << endl;
	cout << cc.find(101) << endl;
	cout << "size:" << cc.size() << endl;
	cout << "107:" << cc.remove(107) << endl;
	cout << "104" << cc.remove(104) << endl;
	cout << "after remove size:" << cc.size() << endl;

	for (int i = 0; i < cc.size(); i++)
		cout<<cc.removeAny()<<"	";

	system("pause");
}

//注:这个程序有些隐性的问题,还没有解决,运行过程中有可能会出现“ *.exe已经触发一个断点”
//的问题,导致程序无法调试,也有可能导致堆和栈的损坏,这是内存超限的问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值