📄 addressbooklist.h
字号:
#include<fstream.h>
#include<iomanip.h>
#include<string.h>
#include<stdlib.h>
class AddressBook;
class Node //节点类
{
char Name[20]; //姓名
char Telephone[20]; //电话号码
char Email[40];
Node *Next;
Node *Previous;
friend AddressBook;
public:
Node() //关键的一步,下面的查找和修改都要用到,防止指针指向内核
{
Next=NULL;
Previous=NULL;
}
};
class AddressBook
{
int Current;
int Total;
Node *Head;
Node *Currentp;
public:
AddressBook(); //*****构造函数
void Load(char *filename); //*****从磁盘中读文件构造链表*****
void Save(char *filename); //*****保存链表中的数据到磁盘文件*****
void FirstNode(); //*****当前指针移至首节点
void LastNode(); //*****当前指针移至尾节点
void PreviousNode(); //*****当前指针前移一节点,已是首节点则不移
void NextNode(); //*****当前指针后移一节点,已是尾节点则不移
int SearchNode(char *name); //*****以姓名为关键字查找
void ModifyNode(char *name,char *telephone,char *email); //*****修改当前记录
void DeleteNode(); //*****删除当前节点
void AddNode(char *name,char *telephone,char *email);
//*****按姓名序添加记录,第一记录变成当前记录
void GetCurrentNode(char *name,char *telephone,char *email);
//*****通过参数带回当前记录的数据
void GetCurrentTotal(char *curno,char *totalno);
//*****通过参数以字符串方式带回当前记录数和总记录数
~AddressBook(); //*****析构函数,释放链表
};
AddressBook::AddressBook() //*****构造函数
{
Current=0;Total=0;Head=NULL;Currentp=NULL;
}
void AddressBook::Load(char *filename) //*****从磁盘中读文件构造链表
{
char total[10],name[20],telephone[20],email[40];
ifstream infile;
infile.open(filename); //打开文件
if(infile>>total) //*****记录数不为零
{
if(!Head) //链表为空
while((infile>>name)&&(infile>>telephone)&&(infile>>email))
AddNode(name,telephone,email);
else //链表不为空,先清空,再构造
{
Node *p;
while(Head)
{
p=Head;
Head=Head->Next;
delete p;
}
Head=NULL;Total=0;
while((infile>>name)&&(infile>>telephone)&&(infile>>email)) //重新构造链表
AddNode(name,telephone,email);
}
}
else //*****记录数为零,清空即可
{
if(Head)
{
Node *p;
while(Head)
{
p=Head;
Head=Head->Next;
delete p;
}
Head=NULL;Total=0;
}
}
infile.close(); //关闭文件
}
void AddressBook::Save(char *filename) //*****保存链表中的数据到磁盘文件
{
ofstream outfile;
outfile.open(filename); //打开文件
Node *p=Head;
outfile<<Total<<endl;
while(p->Next!=NULL)
{
outfile<<p->Name<<'\t'<<p->Telephone<<'\t'<<p->Email<<endl;
p=p->Next;
}
outfile<<p->Name<<'\t'<<p->Telephone<<'\t'<<p->Email<<endl;
outfile.close(); //关闭文件
}
void AddressBook::FirstNode() //*****当前指针移至首节点
{
if(Currentp!=Head)
{
Currentp=Head;
}
Current=1;
}
void AddressBook::LastNode() //*****当前指针移至尾节点
{
Node *p=Head;
while(p->Next!=NULL)
{
p=p->Next;
}
Currentp=p;
Current=Total;
}
void AddressBook::PreviousNode() //*****当前指针前移一节点,已是首节点则不移
{
if(Currentp!=Head)
{
Currentp=Currentp->Previous;
Current--;
}
}
void AddressBook::NextNode() //*****当前指针后移一节点,已是尾节点则不移
{
if(Currentp->Next!=NULL)
{
Currentp=Currentp->Next;
Current++;
}
}
int AddressBook::SearchNode(char*name)
//以姓名为关键字,查找记录,找到返回1,找不到返回0 ,若找到,将当前记录号和当前记录指针设为该记录
{
Node *p;
p=Head;
int a=1;
while(p)
{
if(!(strcmp(p->Name,name)))
{
Currentp=p;
Current=a;
return (1);
}
else
{
p=p->Next;
a++;
}
}
return (0);
}
void AddressBook::ModifyNode(char*name,char *telephone,char*email) //*****修改当前记录
{
if(SearchNode(name)==1)
{
strcpy(Currentp->Telephone,telephone);
strcpy(Currentp->Email,email);
}
}
void AddressBook::DeleteNode() //*****删除当前节点*****
{
Node *p;
if(Total==1) //如果只有一个记录
Head=NULL;
else if(Currentp==Head) // 删除头结点
{
if(Head->Next==NULL)
Head=NULL;
else
{
p=Head;
Head=Head->Next;
delete p;
Head->Previous=NULL;
}
}
else if(Currentp->Next==NULL) // 删除尾结点
{
p=Currentp;
Currentp=Currentp->Previous;
delete p;
Currentp->Next=NULL;
}
else
{
Node *p1=Currentp->Previous;
Node *p2=Currentp->Next;
p1->Next=p2;
p2->Previous=p1;
}
Currentp=Head;
Total-=1;
Current=1;
}
void AddressBook::AddNode(char*name,char *telephone,char*email) //*****按姓名序添加记录,第一记录变成当前记录
{
Node *p=new Node,*p1,*p2;
strcpy(p->Name,name);
strcpy(p->Telephone,telephone);
strcpy(p->Email,email);
if(Head==NULL)
Head=p;
else if(strcmp(name,Head->Name)<0) //按姓名排序
{
p->Next=Head;
Head->Previous=p;
Head=p;
}
else
{
p1=p2=Head;
while((p2->Next)&&(strcmp(name,p2->Name)>0))
{
p1=p2;
p2=p2->Next;
}
if((strcmp(name,p2->Name)>0))
{
p2->Next=p;
p->Previous=p2;
p->Next=NULL;
}
else
{
p1->Next=p;
p->Previous=p1;
p->Next=p2;
p2->Previous=p;
}
}
Currentp=Head; //跳回头指针
Total++;
Current=1;
}
void AddressBook::GetCurrentNode(char*name,char *telephone,char*email) //*****通过参数带回当前记录的数据
{
strcpy(name,Currentp->Name);
strcpy(telephone,Currentp->Telephone);
strcpy(email,Currentp->Email); //当前记录号在SearchNode处已生成,配合SearchNode用
}
void AddressBook::GetCurrentTotal(char*curno,char *totalno) //通过参数以字符串方式带回当前记录数和总记录数
{
_itoa(Current,curno,10);
_itoa(Total,totalno,10);
}
AddressBook::~AddressBook() //*****析构函数,释放链表
{ Node *p;
while(Head)
{
p=Head;
Head=Head->Next;
delete p;
}
}
char ABfilename[]="AddressBook.txt"; //通讯录磁盘文件名
AddressBook AB; //通讯录全局变量
char name[20],telephone[20],email[40],curno[20],totalno[20];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -