📄 linklist.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 + -