#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
using namespace std;
typedef struct DataType //定义所有信息
{
char number[20]; //学号
char name[20]; //姓名
char birthday[20]; //生日
char sex[6]; //性别
char telephone[10]; //电话号码
char address[20]; //地址
};
struct student //定义学生信息
{
DataType data;
student *next;
};
class txl
{
private:
student *head; //头指针
student *currptr; //当前指针
public:
txl();
~txl();
void Creat(); //新建学生通讯录
void Insert(); //向学生通讯录插入学生信息
void Delete(); //在通讯录删除学生信息
void WriteFile(); //从文件中读取通讯录的信息
void ReadFile(); //向文件写入学生通讯录信息
void Search(); //在通讯录中查询学生信息
void Display(); //在屏幕中输出全部学生信息
void Exit(); //退出
};
//通讯录.cpp
#include"通讯录.h"
txl::txl() //构造函数
{
head=currptr=NULL;
};
txl::~txl() //释构函数
{
student *temp=head; //释放空间
while(temp)
{
delete temp;
}
}
//新建学生通讯录
// 功能:采用头插入的方式建琏,并询问是否保存到文件
// 参数:无
//返回值:无
void txl::Creat()
{
cout<<"你想要建立多少个学生的通讯录:";
int i,n;
cin>>n;
for(i=0;i<n;i++) //输入学生信息
{
currptr=new student;
cout<<"请输入学生的学号:";
cin>>currptr->data.number;
cout<<"请输入学生的姓名:";
cin>>currptr->data.name;
cout<<"请输入学生的生日:";
cin>>currptr->data.birthday;
cout<<"请输入学生的性别:";
cin>>currptr->data.sex;
cout<<"请输入学生的电话号码:";
cin>>currptr->data.telephone;
cout<<"请输入学生的地址:";
cin>>currptr->data.address;
currptr->next=head; //头插入建琏
head=currptr;
}
};
//向学生通讯录插入学生信息
// 功能:采用头插入的方式把结点插进去,并询问是否保存到文件
// 参数:无
//返回值:无
void txl::Insert()
{
cout<<"你想要在哪个位置插入:";
int k,n=0; //k记录插入位置,n记录琏表长度
cin>>k;
student *p=head,*q=NULL,*t=head;
while(t)
{
t=t->next;
n++;
}
if(k>n+1||k<1) //不存在此位置,不能存入
{
cout<<"此位置不合法";
}
else{
currptr=new student;
cout<<"请输入你要插入的学生的信息!"<<endl; //需插入的学生信息
cout<<"请输入学生的学号:";
cin>>currptr->data.number;
cout<<"请输入学生的姓名:";
cin>>currptr->data.name;
cout<<"请输入学生的生日:";
cin>>currptr->data.birthday;
cout<<"请输入学生的性别(male/female):";
cin>>currptr->data.sex;
cout<<"请输入学生的电话号码:";
cin>>currptr->data.telephone;
cout<<"请输入学生的地址:";
cin>>currptr->data.address;
if(k==1) //建琏
{
currptr->next=head;
head=currptr;
}
else
{
for(int i=1;i<k;i++)
{
q=p;
p=p->next;
}
q->next=currptr;
currptr->next=p;
}
}
}
//在通讯录删除学生信息
// 功能:删除结点,并询问是否从文件中删除(采用覆盖原有文件的形式)
// 参数:无
//返回值:无
void txl::Delete()
{
if(head!=NULL) //琏表存在时就做删除操作
{
cout<<"你想要在哪个位置删除:";
int k,n=0; //k记录删除位置,n记录琏表长度
student *p=head,*q=head->next,*t=head;
cin>>k;
while(t)
{
t=t->next;
n++;
}
if(k>n||k<1)
cout<<"This position don't exist!"<<endl; //所要删除位置超出范围
else
{
if(k==1)
head=head->next;
else
{
for(int i=1;i<k-1;i++)
{
p=q;
q=q->next;
}
if(q==NULL)p=NULL;
else
p->next=q->next;
}
}
}
}
//向文件写入学生通讯录信息
// 功能:把琏表中的结点都保存到文件中
// 参数:琏表的一个结点
//返回值:无
void txl::WriteFile()
{
student *s=head;
ofstream fop;
fop.open("通讯录.dat",ios::binary|ios::trunc); //以二进制形式打开文件//覆盖原来的文件且重新保存删除后的内容
if(!fop)
{
cout<<"通讯录.dat can't open!"<<endl;
abort();
}
char Y_N;
cout<<"Would you like to save it in file(Y/N)"; //询问是否保存到文件中
cin>>Y_N;
while(Y_N!='Y'&&Y_N!='y'&&Y_N!='N'&&Y_N!='n') //使输入为yes或no
{
cout<<"Please input 'Y' or 'N'";
cin>>Y_N;
}
if(Y_N=='Y'||Y_N=='y') //保存
{
while(s)
{
while(fop.write((char *)&s->data,sizeof(s->data)))
{
s=s->next;
flush(cout);
}
}
cout<<"Successfully Save File!"<<endl;
}
fop.close();
}
//从文件中读取通讯录的信息
// 功能:从文件中读取内容,并建琏
// 参数:无
//返回值:无
void txl::ReadFile()
{
currptr=new student;
ifstream fip("通讯录.dat",ios::in|ios::binary); //以二进制形式打开文件
while(fip.read((char *)&currptr->data,sizeof(currptr->data)))
{
currptr->next=head;
head=currptr;
currptr=new student;
}
fip.close();
delete currptr;
}
//在通讯录中查询学生信息
// 功能:按姓名或学号的形式查找
// 参数:无
//返回值:无
void txl::Search()
{
cout<<"你可以通过以下方式查询:"<<endl;
cout<<"1、按学号查询"<<endl;
cout<<"2、按姓名查询"<<endl;
cout<<"你想要按什么方式查询(1 or 2):";
char ch;
cin>>ch;
cout<<"你要查询的信息是:";
while(ch!='1'&&ch!='2')
{
cout<<endl;
cout<<"操作错误,请重新输入:";
cin>>ch;
}
student *cu=head;
if(ch=='1') //按学号查询
{
char num[20];
cin>>num;
while(cu!=NULL)
{
if(strcmp(cu->data.number,num)==0) //判断是否是所查学号
{
cout<<"你要找的学生信息为:"<<endl;
cout<<cu->data.number<<" "<<cu->data.name<<" "<<cu->data.birthday<<" "<<cu->data.sex<<" "
<<cu->data.telephone<<" "<<cu->data.address<<endl;
break;
}
cu=cu->next;
}
if(cu==NULL)
cout<<"不存在这个学生!"<<endl;
}
else //按姓名查询
{
char na[20];
cin>>na;
while(cu!=NULL)
{
if(strcmp(cu->data.name,na)==0) //判断是否是所查姓名
{
cout<<"你要找的学生信息为:"<<endl;
cout<<cu->data.number<<" "<<cu->data.name<<" "<<cu->data.birthday<<" "<<cu->data.sex<<" "
<<cu->data.telephone<<" "<<cu->data.address<<endl;
break;
}
cu=cu->next;
}
if(cu==NULL) //查询不到
cout<<"不存在这个学生!"<<endl;
}
}
//在屏幕中输出全部学生信息
// 功能:输出琏表的每一个内容
// 参数:无
//返回值:无
void txl::Display()
{
if(head==NULL)
cout<<"通讯录里没有内容!\n\n";
else{
student *k=head;
cout<<setiosflags(ios::left)<<setw(10)<<"学号"<<setiosflags(ios::left)<<setw(10)<<"姓名"
<<setiosflags(ios::left)<<setw(10)<<"生日"<<setiosflags(ios::left)<<setw(6)<<"性别"
<<setiosflags(ios::left)<<setw(10)<<"电话号码"<<setiosflags(ios::left)<<setw(10)
<<"地址"<<endl; //设置左对齐输出
while(k)
{
cout<<setiosflags(ios::left)<<setw(10)<<k->data.number<<setw(10)<<setiosflags(ios::left)
<<k->data.name<<setw(10)<<setiosflags(ios::left)<<k->data.birthday<<setw(6)
<<setiosflags(ios::left)<<k->data.sex<<setw(10)<<setiosflags(ios::left)
<<k->data.telephone<<setw(10)<<setiosflags(ios::left)<<k->data.address<<endl;
k=k->next;
}
cout<<endl;
}
}
// 功能:告知结束运行系统
// 参数:无
//返回值:无
void txl::Exit() //退出
{
WriteFile(); //询问是否保存对文件的修改
cout<<"感谢使用本系统!"<<endl;
exit(1); //命令整个程序退出;
}
//main.cpp
#include<iostream>
#include"通讯录.h"
using namespace std;
int main()
{
cout<<"****************欢迎使用学生通讯录管理系统****************"<<endl;
cout<<"#========================================================#"<<endl;
cout<<"#*********在这个管理系统中,我们可以做以下的操作*********#"<<endl;
cout<<"#*********1、新建学生通讯录******************************#"<<endl;
cout<<"#*********2、向学生通讯录插入学生信息********************#"<<endl;
cout<<"#*********3、在通讯录删除学生信息************************#"<<endl;
cout<<"#*********4、在通讯录中查询学生信息**********************#"<<endl;
cout<<"#*********5、在屏幕中输出全部学生信息********************#"<<endl;
cout<<"#*********6、退出(并保存修改)****************************#"<<endl;
cout<<"#========================================================#"<<endl;
char ch;
txl t;
t.ReadFile(); //读取文件里的信息
cout<<"已从文件中读取内容了!\n";
do{
cout<<"********************************************************\n";
cout<<"**1、新建//2、插入//3、删除//4、查询//5、显示//6、退出**"<<endl;
cout<<"********************************************************\n";
cout<<"What do you want to do:";
cin>>ch;
while(ch>'6'||ch<'1') //使选择范围在1~6
{
cout<<"Error operation!Please input again:";
cin>>ch;
}
switch(ch)
{
case '1':t.Creat();break; //1、新建学生通讯录
case '2':cout<<"现在学生的信息如下:"<<endl;
t.Display();
t.Insert();break; //2、向学生通讯录插入学生信息
case '3':cout<<"现在学生的信息如下:"<<endl;
t.Display();
t.Delete();break; //3、在通讯录删除学生信息
case '4':cout<<"现在学生的信息如下:"<<endl;
t.Display();
t.Search();break; //5、在通讯录中查询学生信息
case '5':t.Display();break; //6、在屏幕中输出全部学生信息
case '6':t.Exit();break; //7、退出
}
}while(1);
return 0;
}