📄 程序15.2:学员通讯录程序.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 + -