#include <iostream.h>
#include <fstream>
#include <string.h>
#include <sstream>
using namespace std;
//定义文件名
#define FileName "data.txt"
//定义循环变量
bool mVal=true;
//定义个新的变量
typedef string mData;
typedef char mChar[50];
//定义一个CrmCperson结构体
typedef struct CrmCperson
{
struct CrmCperson *lplink;
string mName;
string mpNumber;
string mhAddress;
string mhZip;
}msData;
msData *Data;
class Crm
{
public:
Crm();
AddData(mData mName,mData mpNumber,mData mhAddress,mData mhZip ); //添加用户
FindData(mData mName);
RevData(mData mName);
DelData(mData mName);
myWhile();
ShowData();
~Crm();
};
class CrmFile
{
public:
CrmFile();
GetData();
SavaData(msData& mymsData);
UpDateData(void);
~CrmFile();
};
CrmFile::CrmFile()
{}
CrmFile::GetData()
{
msData *mymsData=new msData;
//msData *myothermsData=new msData; 放这里会出错,放下面
Data=mymsData; //保存基址指针
fstream myfile(FileName);
string str[4];
while(!myfile.eof()){
for(int j=0;j<4;j++){
getline(myfile,str[j]);
}
msData *myothermsData=new msData; //这里是关键位置,不然地址不能更新,会出错
mymsData->mName=str[0];
mymsData->mpNumber=str[1];
mymsData->mhAddress=str[2];
mymsData->mhZip=str[3];
mymsData->lplink=myothermsData;
mymsData=myothermsData;
}
mymsData->lplink=NULL; //设置链表尾为NULL
myfile.close();
}
CrmFile::SavaData(msData& mymsData) //保存数据到文件
{
fstream myfile;
myfile.open(FileName,ios_base::out|ios_base::app); //以追加方式打开文件
myfile<<mymsData.mName<<endl;
myfile<<mymsData.mpNumber<<endl;
myfile<<mymsData.mhAddress<<endl;
myfile<<mymsData.mhZip<<endl;
myfile.close();
}
CrmFile::UpDateData(void) //更新到文件
{
msData *mymsData=new msData;
mymsData=Data; //基址指针
fstream myfile;
myfile.open(FileName,ios_base::out); //打开文件
while(mymsData!=NULL){ //更新数据
myfile<<mymsData->mName<<endl;
myfile<<mymsData->mpNumber<<endl;
myfile<<mymsData->mhAddress<<endl;
myfile<<mymsData->mhZip<<endl;
mymsData=mymsData->lplink;
}
myfile.close();
}
CrmFile::~CrmFile()
{}
Crm::Crm()
{}
Crm::AddData(mData mName,mData mpNumber,mData mhAddress,mData mhZip ) //添加用户
{
msData mymsData;
mymsData.mName=mName;
mymsData.mpNumber=mpNumber;
mymsData.mhAddress=mhAddress;
mymsData.mhZip=mhZip;
CrmFile myCrmFile;
myCrmFile.SavaData(mymsData); //调用CrmFile类中的SavaData函数保存数据
}
Crm::FindData(mData mName) //查找用户
{
CrmFile myCrmFile;
myCrmFile.GetData(); //读取文件内容到链表
msData *mymsData=new msData;
mymsData=Data; //基址指针
while(mymsData!=NULL){
if(mName==mymsData->mName){
cout<<"姓名"<<" ";
cout<<"联系号码"<<" ";
cout<<"联系地址"<<" ";
cout<<"邮编"<<endl;
cout<<mymsData->mName.c_str()<<" ";
cout<<mymsData->mpNumber.c_str()<<" ";
cout<<mymsData->mhAddress.c_str()<<" ";
cout<<mymsData->mhZip.c_str()<<endl;
break;
}
mymsData=mymsData->lplink;
}
}
Crm::RevData(mData mName)
{
CrmFile myCrmFile;
myCrmFile.GetData(); //读取文件内容到链表
msData *mymsData=new msData;
mymsData=Data; //基址指针
mChar mystr[3];
while(mymsData!=NULL){
if(mymsData->mName==mName){ //判断在链表的位置
mymsData->mName=mName;
cin>>mystr[0];
mymsData->mpNumber=mystr[0];
cin>>mystr[1];
mymsData->mhAddress=mystr[1];
cin>>mystr[2];
mymsData->mhZip=mystr[2];
myCrmFile.UpDateData(); //调用更新数据到文件
cout<<"修改成功"<<endl;
return 0;
}
mymsData=mymsData->lplink;
}
cout<<"修改失败,用户不存在!"<<endl;
}
Crm::DelData(mData mName)
{
CrmFile myCrmFile;
myCrmFile.GetData(); //读取文件内容到链表
msData *mymsData=new msData;
msData *myotherData=new msData;
mymsData=Data; //基址指针
while(mymsData!=NULL){
if(mymsData->mName==mName){ //判断在链表的位置
if(mymsData==Data){
Data=mymsData->lplink;
}else{
myotherData->lplink=mymsData->lplink; //删除节点
}
myCrmFile.UpDateData(); //调用更新数据到文件
cout<<"删除成功"<<endl;
return 0;
}
myotherData=mymsData;
mymsData=mymsData->lplink;
}
cout<<"删除失败,用户不存在!"<<endl;
}
Crm::myWhile() //判断是否继续循环输入
{
cout<<"继续y,任意退出"<<endl;
if(getchar()=='y'){
mVal=true;
}else{
mVal=false;
}
getchar(); //取回车
}
Crm::ShowData()
{
CrmFile myCrmFile;
myCrmFile.GetData();
msData *mymsData=new msData;
mymsData=Data; //基地指针
cout<<"姓名";
cout<<" ";
cout<<"电话号码";
cout<<" ";
cout<<"联系地址";
cout<<" ";
cout<<"邮编";
cout<<endl;
//编历链表显示数据
while(mymsData!=NULL){
cout<<mymsData->mName.c_str();
cout<<" ";
cout<<mymsData->mpNumber.c_str();
cout<<" ";
cout<<mymsData->mhAddress.c_str();
cout<<" ";
cout<<mymsData->mhZip.c_str();
cout<<endl;
mymsData=mymsData->lplink;
}
}
Crm::~Crm()
{}
int main()
{
cout<<"Communications Recorded Management(通讯录管理程序)"<<endl;
cout<<"**************************************************"<<endl;
cout<<"1)添加用户 2)查找用户 3)修改记录 "<<endl;
cout<<"4)删除记录 5)显示记录 6)装入数据 "<<endl;
cout<<"**************************************************"<<endl;
Crm myCrm;
CrmFile myCrmFile;
while(mVal){ //循环重复输入
cout<<"输入序号:(1~6)"<<endl;
int x;
cin>>x;
switch(x){
case 1:{
cout<<"添加用户"<<endl;
cout<<"格式:姓名(回车)联系号码(回车)联系地址(回车)邮编"<<endl;
mChar mymChar[4];
for(int i=0;i<4;i++){
cin>>mymChar[i];
}
myCrm.AddData(mymChar[0],mymChar[1],mymChar[2],mymChar[3]);
myCrm.myWhile();
break;
}
case 2:{
cout<<"查找用户,请输入姓名:"<<endl;
mChar mymChar;
cin>>mymChar;
myCrm.FindData(mymChar);
myCrm.myWhile();
break;
}
case 3:{
cout<<"修改记录,请输入姓名:"<<endl;
mChar mymChar;
cin>>mymChar;
myCrm.RevData(mymChar);
myCrm.myWhile();
break;
}
case 4:{
cout<<"删除记录,请输入姓名:"<<endl;
mChar mymChar;
cin>>mymChar;
myCrm.DelData(mymChar);
myCrm.myWhile();
break;
}
case 5:{
cout<<"显示记录"<<endl;
myCrm.ShowData();
myCrm.myWhile();
break;
}
case 6:{
cout<<"装入数据"<<endl;
myCrmFile.GetData();
myCrm.myWhile();
cout<<"装入数据成功!"<<endl;
break;
}
default:{
cout<<"输入不正确(1~6)"<<endl;
myCrm.myWhile();
break;
}
}
}
cout<<"成功退出!感谢使用!再见!"<<endl;
return 0;
}