📄 shujujiegoukechengsheji__tongxunluguanlixitong.cpp
字号:
//头文件包含信息
#include<iostream.h>
#include<string.h>//strcmp();
#include<stdlib.h>
#include<conio.h>//getch();
#include<iomanip.h>//setf(),setw();
const int n=26;//定义n为指针数组的大小
//下面定义一个记录类型(data)
struct data{
char name[13];
char sex[3];
char tele[13];
char addr[31];
};
//定义领接表中结点的类型
struct person{
data Data;
person*next;
};
person*people[n];//people为n个表头指针的数组类型
//领接表的抽象数据类型
void Init(person*p[]);
void Create(person*p[]);
//函数的超前声明
int menu_select();
void Insert(person*&p,person*np);
void Find(person*&p,const char a[]);
void Delete(person*&p,char a[]);
void Modify(person*&,char a[]);
void Output(person*p[]);
void Print(person*&p);
void Cout(person*p);
void Cin(person*p);
//主函数:对领接表的处理
void main()
{
Init(people);//领接表的初始化
for(;;){
switch(menu_select())//菜单选择,返回int型值
{
case 1:
//创建通讯录的存储结构——领接表
cout<<"****************************"<<endl;
cout<<"* 通讯录管理系统! *"<<endl;
cout<<"****************************"<<endl;
Create(people);//调用Create函数
break;
case 2:
//向领接表中插入记录
cout<<"****************************"<<endl;
cout<<"* 通讯者结点的插入 *"<<endl;
cout<<"****************************"<<endl;
person*np;
np=new person;//申请新结点,便于存储记录信息
if(np==NULL){
cerr<<"The memory is full!"<<endl;
exit(1);
}
Cin(np);//输入记录信息
int m;
//取出记录中name[]的首字母name[0],然后减去97赋予m,
// 以people[m]指向领接表中的单链表表头
m=np->Data.name[0]-97;
Insert(people[m],np);//调用Insert函数
break;
case 3:
//访问领接表中记录的信息
cout<<"****************************"<<endl;
cout<<"* 通讯录的查询 *"<<endl;
cout<<"****************************"<<endl;
char a[13];//a为需要访问记录的name值
cout<<"name(12) ";
cin>>a;
m=a[0]-97;//m同上面
Find(people[m],a);//调用Find函数
break;
case 4:
//删除领接表中的记录信息
cout<<"****************************"<<endl;
cout<<"* 通讯录的删除 *"<<endl;
cout<<"****************************"<<endl;
char b[13];//b为删除记录的name值
cout<<"name(12) ";
cin>>b;
m=b[0]-97;//m同上
Delete(people[m],b);//调用Delete函数
break;
case 5:
//修改领接表中的记录信息
cout<<"****************************"<<endl;
cout<<" 通讯录的修改"<<endl;
cout<<"****************************"<<endl;
char c[13];//c为修改记录的name值
cout<<"name(12): ";
cin>>c;
m=c[0]-97;//m同上
Modify(people[m],c);//调用Modify函数
break;
case 6:
//输出领接表中所有记录的信息
cout<<"****************************"<<endl;
cout<<"* 通讯录的输出 *"<<endl;
cout<<"****************************"<<endl;
Output(people);//调用Output函数
break;
case 0:
//所有操作结束,退出通讯录系统
cout<<" 再 见!"<<endl;
cout<<"~!@#$%^&*(*)_+|*|+_)*(*&^%$#@!~"<<endl;
cout<<"按任意键退出系统"<<endl;
getch();//从键盘获得任意键信息
return;
}
}
}
//菜单选择函数
int menu_select()
{
int m;
cout<<"* 通讯录管理系统! *"<<endl;
cout<<"============================"<<endl;
cout<<" 1. 创建领接表 "<<endl;
cout<<" 2. 结点的插入 "<<endl;
cout<<" 3. 结点的查询 "<<endl;
cout<<" 4. 结点的删除 "<<endl;
cout<<" 5. 结点的修改 "<<endl;
cout<<" 6 领接表输出 "<<endl;
cout<<" 0. 推出系统 "<<endl;
cout<<"============================"<<endl;
cout<<" 请选择0-6:";
for(;;){
cin>>m;
//当输入的值>6或<0时,请重新输入
if(m<0||m>6)
cout<<"输入错误,重选0-6:";
else
break;
}
return m;
}
//初始化领接表
void Init(person*p[])
{
for(int i=0;i<n;i++)
p[i]=NULL;//将领接表中的每个单链表置为空
}
//创建领接表
void Create(person*p[])
{
char ch='y';
//循环控制是否继续创建,即添加记录信息
while(ch=='y'||ch=='Y'){
person*np=new person;
if(np==NULL)
{
cerr<<"The memory is full!"<<endl;
exit(1);
}
Cin(np);//输入记录信息
np->next=NULL;
int m=np->Data.name[0]-97;
//取出记录中name[]的首字母name[0],然后减去97赋予m,
// 以people[m]指向领接表中的单链表表头
Insert(p[m],np);//调用插入函数
cout<<"继续吗?(Y/N):";
cin>>ch;
}
}
//有序的插入记录信息
void Insert(person*&p,person*np)
{
//首先查找插入点的位置
person*cp=p,*ap=NULL;
while(cp!=NULL){
if(strcmp(np->Data.name,cp->Data.name)<0)
//如果当前信息小于待插入的信息,退出循环
break;
else{
ap=cp;
cp=cp->next;
}
}
if(ap==NULL){
//ap==NULL表头为空,把结点插在表头
np->next=p;
p=np;
}
else{
//将结点插在ap与cp之间
np->next=cp;
ap->next=np;
}
}
//查找记录信息
void Find(person*&p,const char a[])
{
int i=0;
//i标记是否已找到记录信息,找到i=1,否则i=0
person*np=p;
while(np!=NULL){
if(strcmp(np->Data.name,a)<=0){
if(strcmp(np->Data.name,a)==0){
i=1;
break;
}
else
break;
}
else
np=np->next;
}
if(i==1){//找到记录,输出对应的信息
cout<<"The person is find!"<<endl;
Cout(np);//调用输出函数
}
else//未找到,打印提示信息
cout<<"The person is not find!"<<endl;
}
//删除记录信息
void Delete(person*&p,char a[])
{
//首先查找记录,i作为记录是否从在的标记
int i=0;
person*cp=p,*ap=NULL;
while(cp!=NULL){
if(strcmp(cp->Data.name,a)==0){
i=1;//找到记录i=1
break;
}
else if(strcmp(cp->Data.name,a)>0)
break;
else{
ap=cp;
cp=cp->next;
}
}
if(i==1){//找到删除记录
cout<<"The person is exit!"<<endl;
Cout(cp);
person*np=cp;
if(ap!=NULL){//待删除记录在单链表的中间
ap->next=cp->next;
}
if(ap==NULL)//待删除记录为单链表表头结点
p=cp->next;
delete cp;
}
else//未找到待删除的记录
cout<<"The person is not exit!"<<endl;
}
//修改记录信息
void Modify(person*&p,char a[])
{
//首先寻找记录,i作为是否找到记录的标记
int i=0;
person*p1=p;
while(p1!=NULL){
if(strcmp(p1->Data.name,a)==0){
i=1;//找到记录i=1
break;
}
else if(strcmp(p1->Data.name,a)>0)
break;
else
p1=p1->next;
}
if(i==0)//输出未找到纪录的提示信息
cout<<"The modify person is not exit!"<<endl;
if(i==1){
cout<<"The modify person is find:"<<endl;
cout<<"原纪录信息为: "<<endl;
Cout(p1);//输出原纪录信息
cout<<"输入新纪录信息: "<<endl;;
Cin(p1);//输入新记录信息
cout<<"新纪录为 :"<<endl;
Cout(p1);//输出新记录信息
}
}
//输出领接表中的所有信息
void Output(person*p[])
{
person*np;
cout<<"%&@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@&%"<<endl;
cout.setf(ios::left);//指定输出信息的对齐方式
cout<<setw(13)<<"name"<<setw(5)<<"sex"<<setw(13)<<"tele"<<setw(31)<<"addr"<<endl;
for(int i=0;i<n;i++){
np=p[i];
Print(np);//调用打印记录函数
}
cout<<endl;
cout<<"%&@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@&%"<<endl;
}
//打印记录
void Print(person*&p)
{
person*np=p;
while(np!=NULL){
Cout(np);//调用输出记录信息函数
np=np->next;
}
}
//输出记录信息
void Cout(person*p)
{
cout.setf(ios::left);
//指定输出信息的对齐方式
cout<<setw(13)<<p->Data.name<<setw(5)<<p->Data.sex<<setw(13)<<p->Data.tele<<setw(31)<<p->Data.addr<<endl;
//set()指出输出信息的长度
}
//输入记录信息
void Cin(person*p)
{
cout<<"name(12): ";
cin>>p->Data.name;
cout<<"sex(m/f): ";
cin>>p->Data.sex;
cout<<"tele(12): ";
cin>>p->Data.tele;
cout<<"addr(30): ";
cin>>p->Data.addr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -