⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linklist.h

📁 一个完善的C++链表
💻 H
字号:
/*-----------------------------------------------------------------------------------------------------------------
====																																								=====
====    File name           :  linklist.h																								=====	
====    Project name        :  Tray	   																								=====	
====    Project number      :  -																											=====
====    Creation date       :  2008 Oct.26th																						=====	
====    Author(s)           :  Raywods Zhao																							=====	
====																																								=====
====                  Copyright Raywods 2008																						=====	
--------------------------------------------------------------------------------------------------------------------*/
#ifndef LINKLIST9805443_H_
#define LINKLIST9805443_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include<fstream>
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<memory.h>
#include<assert.h>
#include<stdlib.h>

using namespace std;

//定义所需的字串变量个数
#define NUM_OF_VAR	7

#define ID					0
#define BYTE				1
#define ADDRFROM		2
#define ADDRTO			3
#define SUBJECT			4
#define DATE				5
#define CONTENT			6


//DicTerm的成员变量
struct DATA_BLOCK
{
	unsigned int DataBlockSize;
	char *DataBlock[NUM_OF_VAR];
};

//Base Class(ADT) for Lexicon linklist, provide for only index number of 
//terms and pure virtual interfaces for derived classes.
class dic
{
public:
	dic():
	mID(NULL) 
	{}

	dic(unsigned long id)
	{
		/*-----------------------------------------------------------------------------------------------
		new   int(10)是系统分配一个int类型的空间,内容初始化为10。结果是这个内存空间的指针地址。  
		new   int[10]是系统分配一块连续空间,大小为10个int类型的大小,结果是这块空间的起始地址;
							 实际上是分配了一个整型数组的空间,数组大小为10个int型,没有初始化数组的内容。
		------------------------------------------------------------------------------------------------*/
		mID = new unsigned long(id);
	}

	virtual ~dic()
	{
		delete mID;
		mID = NULL;
	}

	//存取函数
	unsigned long getId()
	{
		return *mID;
	}

	void setId(unsigned long NewId)
	{
		*mID = NewId;
	}

	//ADT接口列表,用于在dicTerms中覆盖
	virtual char				 *GetMailInfo(int PtrArrayIndex)=0;
	virtual unsigned int  *GetDataBlockSize()=0;
	virtual void					InitMemberVar(char *,char *,char *,char *,char *,char *,char *)=0;

protected:
	unsigned long *mID;
};

//Derived from ADT dic, designated to store Mail No_.,size,
//date, sender addr, recv addr....
class dicTerms : public dic
{
public:
	dicTerms():
	dic(0)
	{
		memset(&mMailInfo,0,sizeof(DATA_BLOCK));
		mMailInfo.DataBlockSize=0;
	}
	
	dicTerms(unsigned long id, DATA_BLOCK *MailInfo):
	dic(id)
	{
		InitMemberVar(MailInfo->DataBlock[ID],MailInfo->DataBlock[BYTE],
								 MailInfo->DataBlock[ADDRFROM],MailInfo->DataBlock[ADDRTO],
								 MailInfo->DataBlock[SUBJECT],MailInfo->DataBlock[DATE],
								 MailInfo->DataBlock[CONTENT]);
	}

	dicTerms(unsigned long id,

					char *Mail_ID,		char *Byte,			char *AddrFrom,	
					char *AddrTo,		char *Subject,		char *Date,
					char *Content):
	dic(id)
	{
		InitMemberVar(Mail_ID,Byte,AddrFrom,AddrTo,Subject,Date,Content);
	}

	~dicTerms();

public:
	//存取函数,覆盖ADT接口,实例化!
	char *GetMailInfo(int PtrArrayIndex) {return mMailInfo.DataBlock[PtrArrayIndex];}

	unsigned int *GetDataBlockSize(){return &mMailInfo.DataBlockSize;}

	void	InitMemberVar(char *mail_id,char *byte,char *addr_from,char *addr_to,
									char *subject,char *date,char *content);

private:
	DATA_BLOCK mMailInfo;
};


//Class dicNode serves as a Node in the LinkList, in which a dic pointer and
//Next Node pointer are involved in, as well as the minimal cell to operate.
class dicNode
{
public:
	//[[警告]]务必在默认和重载构造函数中初始化成员变量!!!
	dicNode():
	mDic(NULL),
	mNextNode(NULL)
	{
	}

	dicNode(dic *dic):
	mDic(dic),
	mNextNode(NULL)
	{
	}

	~dicNode()
	{
		delete mDic;
		mDic = NULL;
	}

	//存取函数
	dic *getDic()
	{
		if(mDic)
			return mDic;

		return NULL;
	}

	dicNode *getNextNode()
	{
		//当指针为空时,将返回空数值
		if(mNextNode)
			return mNextNode;

		return NULL;
	}

	void setNextNode(dicNode *nextNode)
	{
		mNextNode = nextNode;
	}

private:
	dic *mDic;
	dicNode *mNextNode;
};

//dicLink's encapsulated various "Methods" to add, delete, find Node in 
//a linklist.
class dicLink
{
public:
	dicLink(const char* DBfileName):
	mHead(NULL),
	mDBfileName(DBfileName),
	mMailSum(0)
	{
	}

	~dicLink()
	{
		//此变量属于静态,生命周期为整个程序,因此,
		//在退出switch循环或链表销毁时,将数值清零,
		//否则数值将继续累加!
		mMailSum = 0;
	}

	//存取函数
	dicNode *getHead()
	{
		if(mHead)
			return mHead;

		return NULL;
	}

	//创建访问私有静态成员变量的公有方法,需要在类外调用
	//因此将其定义为静态成员函数
	unsigned long GetMailSum() { return mMailSum; }
	//检查链表数据文件是否存在
	bool IsDBfileExist();
	bool IsDataSetNull();
	const char *GetDBfileName() { return mDBfileName; }

	//链表操作方法
	void AddLink(dic *node);
	dicNode *FindLink(unsigned long MailSize);

	dicNode *operator[](unsigned long index);

	//手工释放整个链表的"堆"内存
	void Dump();

	//链表存储为二进制文件方法,由于读取文件时类还未创建,
	//因此使用静态公有函数,在类外访问
	void Save(dicLink &saveLink);
	void Load(dicLink &loadLink);

private:
	dicNode *mHead;
	//链表数据文件名
	const char *mDBfileName;
	//链表中节点总数
	unsigned long mMailSum;
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -