语言选择错了,你选的是C,要选C++
【相关推荐】
问题描述
人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。
基本要求
在外存上,用文件保存电话号码信息;
在内存中,设计数据结构存储电话号码信息;
提供查询功能:根据姓名实现快速查询;
提供其他维护功能:例如插入、删除、修改等;
按电话号码进行排序。
设计思想
由于需要管理的电话号码信息较多,而且要在程序运行结束后仍然保存电话号码信息,所以电话号码信息采用文件的形式存放到外存中。在系统运行时,需要将电话号码信息从文件调入内存来进行查找等操作,为了接收文件中的内容,要有一个数据结构与之对应,可以设计如下结构类型的数组来接收数据:
const int max=10;
struct TeleNumber
{
string name; //姓名
string phoneNumber; //固定电话号码
string mobileNumber; //移动电话号码
string email; //电子邮箱
} Tele[max];
为了实现对电话号码的快速查询,可以将上述结构数组排序,以便应用折半查找,但是,在数组中实现插入和删除操作的代价较高。如果记录需频繁进行插入或删除操作,可以考虑采用二叉排序树组织电话号码信息,则查找和维护都能获得较高的时间性能。更复杂地,需要考虑该二叉排序树是否平衡,如何使之达到平衡。
#include<bits/stdc++.h>
using namespace std;
const int N=10000;
#define lc a[p].l
#define rc a[p].r
struct BST{
int l,r;
int dat;
string name;
string phone;
}a[N];
int tot,root,n;
int New(string val,string na){
a[++tot].phone=val;
a[tot].name=na;
a[tot].dat=rand();//随机数据为了使二叉树尽量平衡
return tot;
}
//初始化
void build(){
New(" "," ");New("99999999999"," ");
root=1,a[1].r=2;
}
//查找
int Get(int p,string val){
if(p==0) return 0;//检索失败
if(val==a[p].phone) return p;//检索成功
return val<a[p].phone?Get(lc,val):Get(rc,val);
}
//左旋
void zig(int &p){
int q=a[p].l;
a[p].l=a[q].r;a[q].r=p;
p=q;
}
//右旋
void zag(int &p){
int q=a[p].r;
a[p].r=a[q].l,a[q].l=p;
p=q;
}
//插入
void Insert(int & p,string val,string na){
if(p==0) { p=New(val,na);return;}
if(val==a[p].phone) return;
if(val<a[p].phone){
Insert(lc,val,na);
if(a[p].dat<a[lc].dat) zig(p);
}
else{
Insert(rc,val,na);
if(a[p].dat<a[rc].dat) zag(p);
}
}
//删除
void Remove(int &p,string val){
if(p==0) return;
if(val==a[p].phone){
if(lc||rc){
if(rc==0||a[lc].dat>a[rc].dat) zig(p),Remove(rc,val);
else zag(p),Remove(lc,val);
}
else p=0;
return;
}
val<a[p].phone?Remove(lc,val):Remove(rc,val);
}
//暴力查找名字
int GetByName(string na){
for(int i=1;i<=tot;i++){
if(na==a[i].name) {
return i;
}
}
return 0;
}
void menu(){
printf("1.插入电话信息与姓名\n");
printf("2.根据姓名查询\n");
printf("3.删除电话信息\n");
printf("4.修改电话信息\n");
printf("5.打印所有信息(按照电话排序)\n");
printf("0.退出\n");
printf("输入选择:");
}
void output(int p){
cout<<"姓名: "<<a[p].name<<" 联系电话: "<<a[p].phone<<endl;
}
//先序遍历
void display(int p){
if(lc) display(lc);
output(p);
if(rc) display(rc);
}
#undef lc
#undef rc
void run(){
int ch;
do{
string na,phone,newphone;
menu();
cin>>ch;
switch(ch){
case 1:
printf("输入姓名 电话:");
cin>>na>>phone;
Insert(root,phone,na);
break;
case 2:
printf("输入要查询姓名:");
cin>>na;
int x;
if((x=GetByName(na))==0) {
printf("不存在!\n");
}
else{
output(x);
}
break;
case 3:
printf("输入删除的电话:");
cin>>phone;
Remove(root,phone);
break;
case 4:
printf("输入你要修改的手机号:");
cin>>phone;
printf("输入你要新的手机号:");
cin>>newphone;
if(Get(root,phone)==0){
printf("不存在!\n");
}
else{
Insert(root,newphone,a[Get(root,phone)].name);
Remove(root,phone);
}
break;
case 5:display(root);
break;
}
}while(ch);
}
int main(){
run();
return 0;
}