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

📄 程序15.2:学员通讯录程序.cpp

📁 学习C++的一些范例
💻 CPP
字号:
/******程序12.1:学员通讯录程序.cpp******/
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;

class Student
{
private:
	string sName;		//姓名
	string sAddree;		//姓名
	string sPhone;		//电话
	string sMobile;		//手机
	string sEmail;		//邮箱
public:
	Student(string sName)	//用来从键盘读数据信息
	{
		cout<<"\n****** 输入《"<<sName<<"》信息 ******\n";
		this->sName=sName;
		cout<<"   通信地址  : ";
		cin>>sAddree;
		cout<<"   电话号码  : ";
		cin>>sPhone;
		cout<<"   手机号码  : ";
		cin>>sMobile;
		cout<<"   电子信箱  : ";
		cin>>sEmail;
		cout<<"****** 输入《"<<sName<<"》完毕 ******\n";
	}
	Student(string sName,string sAddree,string sPhone,
			string sMobile,string sEmail)//用来从文件读数据信息
	{	
		this->sName=sName;
		this->sAddree=sAddree;
		this->sPhone=sPhone;
		this->sMobile=sMobile;
		this->sEmail=sEmail;
	}
	void Display()				//显示个人数据信息
	{
		cout<<"\n****** 显示《"<<sName<<"》信息 ******\n";
		cout << "   地址是  :" << sAddree << endl;
		cout << "   电话是  :" << sPhone << endl;
		cout << "   手机是  :" << sMobile << endl;
		cout << "   邮箱是  :" << sEmail << endl;
		cout<<"****** 显示《"<<sName<<"》完毕 ******\n";
	}
	bool CmpKey(string str)		//在链表中查找相关数据
	{
		if(sName == str) 
			return true;
		if(sPhone == str) 
			return true;
		if(sMobile == str) 
			return true;
		if(sEmail == str) 
			return true;
		return false;
	}
	void Modify()				//修改节点数据信息
	{
		do
		{
		cout << "\n******《修改通讯录信息》******\n";
		cout << "1. 姓名是  :" << sName << endl;
		cout << "2. 地址是  :" << sAddree<< endl;
		cout << "3. 电话是  :" << sPhone << endl;
		cout << "4. 手机是  :" << sMobile << endl;
		cout << "5. 邮箱是  :" << sEmail << endl << endl;
		int iChoice;
		cout << "   选择要修改项目的编号(1—5) : " << endl;
		cout << "   按任意其它键退出修改, 输入 : " ;
		cin >> iChoice;
			switch(iChoice)
			{
			case 1:
				cout << "   输入修改后的姓名  : ";
				cin >> sName;
				break;
			case 2:
				cout << "   输入修改后的地址  : ";
				cin >> sAddree;
				break;
			case 3:
				cout << "   输入修改后的电话  : ";
				cin >> sPhone;
				break;
			case 4:
				cout << "   输入修改后的手机  : ";
				cin >> sMobile;
				break;
			case 5:
				cout << "   输入修改后的邮箱  : ";
				cin >> sEmail;
				break;
			default:
				break;
			}
			if(iChoice>=1&&iChoice<=5)
			{
			cout<<"   还要继续修改其它选项吗(y/n): ";
			char cChoice;
			cin >> cChoice;
			if(cChoice=='y'||cChoice=='Y')
				continue;
			else
				{
				cout << "******《修改通讯录完毕》******\n";
				break;		
				}
			}
		}while(1);
	}
	string GetName()		//用于访问私有成员变量sName
	{
		return sName;
	}
	string GetPhone()		//用于访问私有成员变量sPhone
	{
		return sPhone;
	}
	string GetMobile()		//用于访问私有成员变量sMobile
	{
		return sMobile;
	}
	string GetEmail()		//用于访问私有成员变量sEmail
	{
		return sEmail;
	}
};

class Node
{
public:
	Student stud;			//节点数据信息(INFO) 
	string sName;			//节点标示名称
	Node *NEXT;				//指向下一节点的节点指针(NEXT) 
	Node(string sName,Node *NEXT=NULL):stud(sName)
	{
		this->sName=sName;
		this->NEXT=NEXT;
	}
	Node(string sName,string sAddree,string sPhone,string sMobile,
		 string sEmail):stud(sName,sAddree,sPhone,sMobile,sEmail)
	{
						//空语句体,用来从文件读数据信息	
	}
};

class List				//定义一个List类
{
private:
	Node*	Start;		//表头指针,固定在表头
	Node*	Curr;		//当前遍历位置指针
	Node*	Prev;		//当前位置的前节点指针
	Node*	End;		//表尾指针,固定在表尾
	int		iPosition;	//当前节点在表中的位置序号
public:
	List()				//构造符函数
	{
		Start=Curr=Prev=End=NULL;
		iPosition=1;
	}
	~List()				//析造符函数
	{
		while(Start!=NULL)
		{
			Curr=Start;
			Start=Start->NEXT;
			delete Curr;
		}
	}
	void AddNode();		//增加节点
	void AddNodeSta();	//增加节点到表头
	void AddNodeEnd();	//增加节点到表尾
	void AddNode(string sName,string sAddree,string sPhone,
				string sMobile,string sEmail);//从文件中读取节点
	void Traverse();	//遍历链表(浏览所有节点信息)
	void Modify();		//修改节点
	void QueryNode();	//查询节点(按照关键字查找符合条件的节点)
	void DelNode();		//删除当前节点
	void DelNodeSta();	//删除表头节点
	void DelNodeEnd();	//删除表尾节点
	void RowOrder();	//链表按字母顺序排序
	void Save(ofstream &ofile);	//保存节点信息到文件
};

void List::AddNode()	//增加节点,按拼音顺序增加到相应的位置
{					
	string str;			//声明节点标示变量
	cout<<"\n   输入姓名 : ";
	cin >> str;
	if(Start==NULL)		//条件成立,创建新链表的第一个节点
	{
		Start=new Node(str,NULL);
					//新建节点,	sName=str, Start->NEXT=NULL
		End=Start;
		cout << "\n   创建链表的第一个节点完毕!!! " << endl;
		return;						//函数返回,不再向下执行
	}
	if(str<=Start->sName)			//条件成立,将节点增加到表头
	{
		Start=new Node(str,Start);	//新建节点作为表头
					//新建节点,	sName=str, Start->NEXT=Start
		cout << "\n   增加链表节点到表头完毕!!! " << endl;
		return;					//函数返回,不再向下执行
	}
	Prev=Start;				//Prev指针初始化到表头
	Curr=Prev->NEXT;		//Cur指针初始化到表头
	while(Curr!=NULL)			//使用循环查找插入节点位置
	{
		if(str>Prev->sName && str<=Curr->sName)
		{
			Node *N=new Node(str,Curr);
					//新建节点,	sName=str, N->NEXT=Curr
			Prev->NEXT=N;		//新建节点在Prev之后Curr之前
			cout << "\n   增加链表节点到表中完毕!!! " << endl;
			return;				//函数返回,不再向下执行
		}
		Prev=Curr;				//后移Prev指针
		Curr=Prev->NEXT;		//后移Cur指针
	}
	End=new Node(str,NULL);
						//新建节点,	sName=str, End->NEXT=NULL
	Prev->NEXT=End;
	cout << "\n   增加链表节点到表尾!!! " << endl;
}

void List::AddNodeSta()	//增加节点到表头
{
	string str;			//声明节点标示变量
	cout<<"\n   输入姓名 : ";
	cin >> str;
	if(Start==NULL)		//条件成立,创建新链表的第一个节点
	{
		Start=new Node(str,NULL);
					//新建节点,	sName=str, Start->NEXT=NULL
		End=Start;
		cout << "\n   创建链表的第一个节点完毕!!! " << endl;
		return;					//函数返回,不再向下执行
	}
	Start=new Node(str,Start);	//新建节点作为表头
				//新建节点,	sName=str, Start->NEXT=Start
	cout << "\n   增加链表节点到表头完毕!!! " << endl;
}

void List::AddNodeEnd()	//增加节点到表尾
{
	string str;			//声明节点标示变量
	cout<<"\n   输入姓名 : ";
	cin >> str;
	if(Start==NULL)		//条件成立,创建新链表的第一个节点
	{
		Start=new Node(str,NULL);
					//新建节点,	sName=str, Start->NEXT=NULL
		End=Start;
		cout << "\n   创建链表的第一个节点完毕!!! " << endl;
		return;						//函数返回,不再向下执行
	}
	Prev=Start;				//Prev指针初始化到表头
	Curr=Prev->NEXT;		//Cur指针初始化到表头
	while(Curr!=NULL)			//使用循环查找插入节点位置
	{
		Prev=Curr;				//后移Prev指针
		Curr=Prev->NEXT;		//后移Cur指针
	}
	End=new Node(str,NULL);
						//新建节点,	sName=str, End->NEXT=NULL
	Prev->NEXT=End;
	cout << "\n   增加链表节点到表尾!!! " << endl;
}

void List::AddNode(string sName,string sAddree,string sPhone,
				   string sMobile,string sEmail)
{		//从文件中读取节点,读入后的顺序和文件中的顺序一致
	if(Start==NULL)
	{
		Start=new Node(sName,sAddree,sPhone,sMobile,sEmail);
		Curr=End=Start;
	}
	else
	{
		Curr=End;
		End=new Node(sName,sAddree,sPhone,sMobile,sEmail);
		Curr->NEXT=End;
	}
}

void List::Modify()
{
	string sKey;				//声明关键字变量
	cout << "\n   输入修改关键字(姓名/地址/电话/手机/邮箱) : ";
	cin >> sKey;
	for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
	{
	   if(sKey==Curr->sName||Curr->stud.CmpKey(sKey))
	   {
		   Curr->stud.Modify();//修改节点信息		   
	   }
	}
	if(Curr=NULL)
		cout << "\n   查询完毕,没有查询到相关信息!!! " << endl;
}

void List::Traverse()					//遍历链表(浏览所有节点信息)
{
	if(Start==NULL)
	{
		cout << "\n   链表不存在!!! " << endl;
	}
	else
	{
		iPosition=1;
		for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
		{							//循环显示所有节点信息
			cout<<iPosition++<<" . ";		//显示节点序号
			cout<<Curr->sName<<endl;	//显示节点标示
//			Curr->stud.GetName()<<endl;	//显示节点信息姓名
//			Curr->stud.Display()<<endl;	//显示节点信息全部
		}
		cout << "\n   链表遍历完毕!!! " << endl;
	}
}

void List::QueryNode()	//查询节点(按照关键字查找符合条件的节点)
{
	string sKey;	//声明关键字变量
	cout << "\n   输入查询关键字(姓名/地址/电话/手机/邮箱) : ";
	cin >> sKey;
	for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
	{
	   if(sKey==Curr->sName||Curr->stud.CmpKey(sKey))
	   {
			cout<<"\n   查询到一个相关节点,显示如下: "<<endl;
			Curr->stud.Display();		//显示节点信息全部
			cout<<"\n   继续查询下一个相关节点吗(y/n): ";	
			char ch;
			cin>>ch;
			if(ch=='y'||ch=='Y')
				continue;
			else
				cout << "\n   查询完毕!!! " << endl;
				return;
	   }
	}
	if(Curr==NULL)
		cout << "\n   查询完毕,没有查询到相关信息!!! " << endl;
}

void List::DelNode()	//删除当前节点
{
	string sKey;		//声明关键字变量
	cout<<"\n   输入删除节点关键字(姓名/地址/电话/手机/邮箱) : ";
	cin >> sKey;
	for(Prev=Curr=Start;Curr!=NULL;Prev=Curr,Curr=Prev->NEXT)
	{
		if(sKey==Curr->sName||Curr->stud.CmpKey(sKey))
		{
			Curr->stud.Display();		//显示节点全部信息
			cout << "\n   确实要删除当前节点吗?(y/n) : ";
			char ch;
			cin >> ch;
			if(ch=='y'||ch=='Y')
			{
				Prev->NEXT=Curr->NEXT;	//删除当前节点
				if(Curr==Start)
				{
				   Start=Start->NEXT;
				}
				delete Curr;
				cout << "\n   删除链表当前节点完毕!!! " << endl;
				return;
			}
		}
	}
	cout << "\n   浏览完毕,未发现相关节点!!! " << endl;
}

void List::DelNodeSta()		//删除表头节点
{
	if(Start==NULL)
		cout << "\n   链表不存在!!! " << endl;
		return;
	Start=Start->NEXT;
	delete Start;
	cout << "\n   删除链表表头节点完毕!!! " << endl;
}

void List::DelNodeEnd()		//删除表尾节点
{
	if(Start==NULL)
		cout << "\n   链表不存在!!! " << endl;
		return;
	for(Curr=Start;Curr->NEXT!=NULL;Prev=Curr,Curr=Prev->NEXT);
	Prev->NEXT=NULL;		//删除表尾节点
	delete Curr;
	cout << "\n   删除链表表尾节点完毕!!! " << endl;
}

void List::RowOrder()		//链表按字母顺序排序
{
	if(Start==NULL)
	{
		cout << "\n   链表不存在!!! " << endl;
	}
	else
	{
		Prev=Start;
		Curr=Start->NEXT;
		while(Curr!=NULL) 
		{
			if(Prev->sName > Curr->sName)
			{
				Node *Temp;
				Temp=Prev;
				Prev=Curr;
				Curr=Temp;
				Prev=Start;
				Curr=Start->NEXT;
				continue;
			}
			Prev=Curr;
			Curr=Curr->NEXT;			
		}
		cout << "\n   链表按字母顺序排序完毕!!! " << endl;
	}
}

void List::Save(ofstream &ofile)
{
	for(Prev=Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
	{
		ofile << Curr->stud.GetName() << endl;
		ofile << Curr->stud.GetPhone() << endl;
		ofile << Curr->stud.GetMobile() << endl;
		ofile << Curr->stud.GetEmail() << endl;
	}
}

int main(int argc,char* argv[])		//向主函数传入参数
{
	List list;
	if(argc>1)
	{
		cout << argv[0] << endl;	//显示程序文件名
		cout << argv[1] << endl;	//显示加载文件名
		ifstream ifile(argv[1]);	//读取文件
		string sName,sAddree,sPhone,sMobile,sEmail;
		while(true)
		{
			if(!(ifile >> sName)) break;
			if(!(ifile >> sPhone)) break;
			if(!(ifile >> sMobile)) break;
			if(!(ifile >> sEmail)) break;
			list.AddNode(sName,sAddree,sPhone,sMobile,sEmail);
		}
	}
	cout << " ******************************《通 讯 录 程 序》****************************** "<< endl;
	char cCmd;
	do
	{
		cout << "\n   增加(A)  遍历(T)  修改(M)  删除(D)  查询(Q)  排序(R)  保存(S)   退出(X): ";
		cin >> cCmd;
		switch(cCmd)
		{
			case 'a':
			case 'A':
				{
					list.AddNode();
					break;
				}
			case 'm':
			case 'M':
				{
					list.Modify();
					break;
				}
			case 'd':
			case 'D':
				{
					list.DelNode();
					break;
				}
			case 't':
			case 'T':
				{
					list.Traverse();
					break;
				}
			case 'q':
			case 'Q':
				{
					list.QueryNode();
					break;
				}
			case 'r':
			case 'R':
				{
					list.RowOrder();
					break;
				}
			case 's':
			case 'S':
				{
					cout << "\n   输入要保存的文件路径名 : ";
					string sFile;
					cin >> sFile;
					ofstream ofile(sFile.data());
					list.Save(ofile);
					break;
				}
			case 'x':
			case 'X':
				{
					cout << "\n  ****************《操作完毕,感谢您使用宋振会软件工作室产品》****************\n"<< endl;	
					break;	
				}

			default:
					cout << "\n   输入错误,重新选择菜单 : ";
			}
	}while(cCmd!='x' && cCmd!='X' );
	return 0;
}

⌨️ 快捷键说明

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