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

📄 addressbooklist.h

📁 简单通讯录程序
💻 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 + -