电话号码查找系统
数据结构毕业设计论文题目整理
数据结构课程设计题目1.飞机订票系统(限1 人完成)(顺序或链式存储)任务:通过此系统可以实现如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:当航班信息改变可以修改航班数据文件要求:根据以上功能说明,设计航班信息,订票信息,客户信息的存储结构,设计程序完成功能;2.宿舍管理查询软件(限1 人完成)任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:采用交互工作方式建立数据文件,包括学生信息、宿舍信息、住宿信息,学生信息按关键字(姓名、学号)进行排序(排序方法自选,不能相同);查询: (用二分查找实现以下操作)按姓名查询按学号查询(用顺序查找实现以下操作)按房号查询3.校园导航问题(限1 人完成)设计要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
要求:能增加场所4.图书借阅管理系统(限1 人完成)(顺序或链式存储)主要分为两大功能:1)图书管理(增加图书、查询图书、删除图书、图书借阅、还书);2)会员管理(增加会员、查询会员、删除会员、借书信息);5.学生成绩管理(限1 人完成)(顺序或链式存储)包括:课程信息,学生信息等;能增加课程或学生。
实现功能:输入、输出、插入、删除、查找、显示、保存、排序、退出。
6.活期储蓄帐目管理(限1 人完成)活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求:1)能比较迅速地找到储户的帐户,以实现存款、取款记账;2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
散列表实现电话号码查找系统
printf(" haha !!%s\n",person[j].name);
printf("input person %d tel:",i+1);
scanf("%d",&person[j].tel);
scanf("%d",&choice);
}
else{
switch(choice){
case 1:INPUT();break;
case 2:DISPLAY();break;
case 3:SORT();break;
case 0:EXIT(0);break;
}
else{ printf("apple!\n");
for(j=y+1;j<=y+5;j++){
if(person[j].name[0]=='\0'){
strcpy(person[j].name,a);//把字符数组a复制给散列表;
y=x%29;
if(person[y].name!='\0'&&person[y].tel!='\0'&&person[y].addr!='\0'){ //判断是否有信息;
if(strcmp(person[y].name,a)==0){
{
printf(" 1---input telephoto infoumantion.\n");
printf(" 2---display all students informantion.n\n");
JAVA语言课程设计报告(电话号码查询系统)
摘要系统主要功能包括:实现添加联系人的姓名和手机号码家庭电话号码和办公号码,并且连接进数据库,将信息储存进数据库文件中去,添加成功弹出添加成功的对话框,对话框中的信息可以重置。
消息对话框负责显示消息,调用其静态方法显示警告信息。
要求在文本框中显示姓名,手机号码,家庭电话,办公电话等用户信息。
添加姓名,手机号码,家庭电话,办公电话等信息到数据库中,同样需要连接SQLSERVER2005数据库,用户的图形界面要求在文本框中显示姓名,手机号码,家庭电话,办公电话等用户信息。
修改姓名,手机号码,家庭电话,办公电话等信息到数据库中,同样需要连接SQLSERVER2005数据库,用户的图形界面要求在文本框中显示姓名,手机号码,家庭电话,办公电话等用户信息。
对已经存储的信息进行查询,而客户的具体需求多样,为了给客户营造更多的便利,可以将软件的查询细分为按整体进行查询模糊查询和精确查询和整体查询,模糊查询允许用户用较为模糊的查询条件,比如信息的姓来进行查询。
实现了满足用户需求的多样化。
对已经存储的信息进行查询,而客户的具体需求多样,为了给客户营造更多的便利,可以将软件的查询细分为按整体进行查询模糊查询和精确查询和整体查询,整体查询允许用户用整体的查询条件,比如信息的姓来进行查询。
实现了满足用户需求的多样化。
本论文内容主要是运用软件工程的知识,先进行系统需求分析,之后是系统概要设计,详细设计,并且详细介绍了各个功能模块的具体实现和数据库的设计。
关键字:Java语言,SQLSERVER2005,JVM,添加,删除,查询和排序目录1、系统需求分析 (3)1.1系统名称: (3)1.2系统介绍: (3)1.3开发背景 (3)1.4.系统面向的用户群体 (4)1.5开发环境 (4)2.系统总体设计 (4)2.1系统功能结构图 (4)2.2系统数据流程图 (5)3 系统详细设计 (5)3.1数据库实体E-R图设计 (6)3.2数据库表的设计 (7)3.3.详细设计 (8)4软件测试 (17)5 系统总结 (17)6系统设计心得体会 (18)参考文献.................................................................. 错误!未定义书签。
简单个人电话号码查询系统数据结构课程设计
一、课题任务人们在日常生活中经常要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询二、设计要求(1)在外存上,用文件保存电话号码信息;(2)在内存中,设计数据结构存储电话号码信息;(3)提供查询功能:根据姓名或编号实现快速查询;(4)提供其他维护功能,例如插人、删除、修改等。
三、程序的结点设计现假设链表结点仅含有一个数据域和一个指针域。
数据域是为了描述通讯者的相关信息,定义通讯者的结点类型:typedef struct{char num[10]; //编号char name[15]; //姓名char phone[11]; //电话号码}dataType;因此,,线性表的链式存储结构定义如下:typedef struct node{ //结点类型定义dataType data; //结点的数据域struct node *next ; //结点指针域}listnode , * linklist ;linklist head ; //定义指向单链表的头指针listnode * p ; //定义一个指向结点的指针变量四、程序的功能设计创建:创建通讯录文件添加:添加通讯录记录输出:显示通讯录记录删除:删除通讯录记录查找:查询通讯录记录修改:修改通讯录记录保存:将信息保存到文件中五、程序的数据设计该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。
下面六个模块都是利用C语言文件,向文件中追加数据、修改数据、查询数据和删除数据。
建立:可以建立通讯录记录,利用C语言文件,向文件中按顺序输入编号、姓名、电话号码,这里实际上是要求建立一个带头结点的单链表。
添加:可以添加通信录记录,向链表中继续增加结点,但只是输入到内存中,如果要输入到文件中还得调用保存函数。
输出:也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。
简单个人电话号码查询系统
/**********************************************************//*人们在日常生活中经常需要查找某个人或某个单位的电话号码, *//*本程序将实现一个简单的个人电话号码查询系统,根据用户输入*//*的信息(例如姓名等)进行快速查询。
*//**********************************************************/#include<iostream>#include<fstream>#include<string>using namespace std;int x=0;char a;int j=1;struct TeleNumber //电话号码类{char name[10]; //姓名int phoneNumber; //固定电话号码int mobileNumber; //移动电话号码char email[10]; //电子邮箱int s;TeleNumber * Next; //下一指针void ReadFile(istream & in); //读取数据文件void input(); //数据输入函数void display(); //数据显示函数} ;void TeleNumber::ReadFile(istream & in) //从文件把数据读入到程序{in>>name>>phoneNumber>>mobileNumber>>email; //将文件信息读到相关变量里面}void TeleNumber::input() //信息输入{cout<<"请输入姓名"<<endl;cin>>name;cout<<"请输入固定电话号码"<<endl;cin>>phoneNumber;cout<<"请输入移动电话号码"<<endl;cin>>mobileNumber;cout<<"请输入电子邮箱"<<endl;cin>>email;s=j++; //记录插入的人的信息的数量}void TeleNumber::display() //信息输出{cout<<"姓名:"<<name<<'\t'<<"固定号码:"<<phoneNumber<<'\t'<<"移动电话号码:"<<mobileNumber<<'\t'<<"电子邮箱:"<<email<<endl;}class TeleMessage //功能类{public:TeleMessage(); //构造数据结构~TeleMessage(); //释放单链表析构函数void Save(); //数据保存到文件TeleNumber * Search(char *); //信息查找void Sort(); //排序void Insert(); //插入void Remove(); //删除void Change(); //更改void Show(); //显示void Swap(TeleNumber *,TeleNumber *); //两个TeleNumber对象交换数据域private:TeleNumber * End,* Head;ifstream in; //定义读,写文件对象ofstream out;};TeleMessage::TeleMessage() //构造函数初始化{Head=new TeleNumber; //头插法建立单链表Head->Next=new TeleNumber;End=Head->Next;in.open("TeleNumber.text"); //打开外存文件,看是否有数据存在if(!in)cout<<"电话系统中没有任何号码,请输入号码"<<endl;else{while(!in.eof()) //如果有,则打开,并将数据读取到程序{End->ReadFile(in);if(End->name[0]=='\0')break; //如果名字为空End->Next=new TeleNumber; //为下一个指针分配内存End=End->Next; //指针下移}in.close(); //in对象关闭cout<<"读取电话号码系统成功!"<<endl;}cout<<"输入任意字母继续"<<endl;cin>>a;TeleMessage::~TeleMessage() //析构函数释放单链表{TeleNumber * temp; //定义一个当前的指针while(Head->Next!=End){temp=Head->Next;Head=Head->Next;delete temp; //逐个释放内存空间}delete Head,End; //删除头尾指针}void TeleMessage::Save() //保存文件{out.open("TeleNumber.txt"); //建立外存文件TeleNumber.txt for(TeleNumber *p=Head->Next;p!=End;p=p->Next)out<<p->name<<"\t"<<p->phoneNumber<<"\t"<<p->mobileNumber<<"\t"<<p->email<<e ndl; //将数据存到外存文件里out.close();cout<<"保存成功!"<<endl;}void TeleMessage::Swap(TeleNumber *p1,TeleNumber *p2) //两个类对象数据域进行交换{TeleNumber * temp=new TeleNumber; //定义一个中转指针strcpy(temp->name,p1->name); //将当前要交换指针中间的一个的name值赋值给中间变量strcpy(temp->email,p1->email);temp->mobileNumber=p1->mobileNumber;temp->phoneNumber=p1->phoneNumber;temp->s=p1->s;strcpy(p1->name,p2->name);strcpy(p1->email,p2->email);p1->mobileNumber=p2->mobileNumber;p1->phoneNumber=p2->phoneNumber;p1->s=p2->s;strcpy(p2->name,temp->name);strcpy(p2->email,temp->email);p2->mobileNumber=temp->mobileNumber;p2->phoneNumber=temp->phoneNumber;p2->s=temp->s; //将p1,p2的各个成员变量交换}void TeleMessage::Sort() //起泡排序TeleNumber *p=NULL,*q=NULL;int exchange=j-1; //要排序的电话号码的条数int bound; //int i;while(exchange){bound=exchange;exchange=0;for(p=Head->Next,i=1;i<bound;i++,p=p->Next)if(p->mobileNumber>p->Next->mobileNumber){Swap(p,p->Next); //调用交换函数exchange=p->s;}}Show();}void TeleMessage::Insert() //插入{End->input(); //从单链表尾部插入End->Next=new TeleNumber;End=End->Next;cout<<endl<<"插入成功"<<endl;}void TeleMessage::Remove() //删除{char name[20];TeleNumber * p=new TeleNumber,*temp=NULL;cout<<"请输入要删除人的姓名:"<<endl;cin>>name;p->Next=Search(name); //先进行查找,找到所要删除的结点if(Search(name)){temp=p->Next;p->Next=p->Next->Next; //摘链delete temp;cout<<"\t\t删除成功!"<<endl;}else{cout<<"\t\t没有找到!"<<endl;}}TeleNumber * TeleMessage::Search(char * name){for(TeleNumber *p=Head->Next;p!=End;p=p->Next)if(!strcmp(p->name,name)){if(x==4){p->display();return p;}elsereturn p;}if(x==4)cout<<"查无此人"<<endl;return 0;}void TeleMessage::Change() //修改信息{char name[20];cout<<"请输入要修改的人的姓名:";cin>>name;if(Search(name)){cout<<"\t\t已找到个人的信息,请输入新的信息!"<<endl;Search(name)->input();cout<<"修改成功!"<<endl;}else{cout<<"\t\t没有找到!"<<endl;}}void TeleMessage::Show(){for(TeleNumber * p=Head->Next;p!=End;p=p->Next)p->display();}int main(){bool flag=true;TeleMessage tele;char name[20];while(flag){system("cls");cout<<"简单个人电话号码查询系统"<<endl<<endl;cout<<"1.增加信息"<<endl;cout<<"2.显示信息"<<endl;cout<<"3.排序个人电话号码"<<endl;cout<<"4.查找号码"<<endl;cout<<"5.删除信息"<<endl;cout<<"6.修改信息"<<endl;cout<<"7.保存信息"<<endl;cout<<"0.退出系统"<<endl<<endl;cout<<"请选择服务:";cout<<"\n\t\t\n\t\t请选择:";cin>>x;switch(x){case 0:flag=false;break;case 1:tele.Insert();break;case 2:tele.Show();break;case 3:tele.Sort();break;case 4:cout<<"请输入欲查找认得姓名"<<endl;cin>>name;tele.Search(name);break;case 5:tele.Remove();break;case 6:tele.Change();break;case 7:tele.Save();break;}cout<<"输入任意字母返回"<<endl;cin>>a;}return 0;}。
java电话号码查询系统-
《Java程序设计》课程设计报告四、课程设计原始记录(数据、图表、计算等)1.系统总设计图2.系统流程图1、登陆界面import javax.swing.*;import java。
awt。
*;import java.awt。
event。
*;import java.awt。
*;import java。
awt.event。
*;import java。
sql.*;import javax.swing。
*;public class Deng extends Frame implements ActionListener{public static final String Statement = null;JPanel p = new JPanel();JLabel username=new JLabel(”学号 : ”);//使用文本创建一个用户名标签JTextField t1=new JTextField();//创建一个文本框对象JLabel password=new JLabel("密码:”);//创建一个密码标签JTextField t2=new JTextField();JButton b1=new JButton("登陆");//创建登陆按钮”\t电话号码:"+rs。
getString(5);t.setText(str);}elset。
setText(””);rs。
close();stmt。
close();}catch (SQLException e4){// TODO Auto-generated catch blocke4。
printStackTrace();}}}}五、课程设计结果及分析:结果:登陆界面查询界面总结:在该程序编写的过程中,时刻要用到数据库和数据源,将这些与java程序联系起来在这次设计中遇到了很多问题,对于面向对象的方法了解不够透彻,以至于错误层出不穷。
个人电话号码查询系统
#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct TeleNumber{char name[10]; //姓名char phoneNumber[20]; //固定电话号码char mobileNumber[20]; //移动电话号码char area[20]; //归属地struct TeleNumber *next;} TeleNumber,*TeleLink;TeleLink InitList(); //初始化链表void menu(); //系统菜单void Tele_Insert(TeleLink L,int Num); //插入联系人void Info_Search(TeleLink &L); //查找联系人void Search_Name(TeleLink L); //按姓名查找void Search_Mobile(TeleLink L); //按移动电话查找void Search_Area(TeleLink L); //按归属地查找void Search_Phone(TeleLink L); //按固定电话查找void Info_Change(TeleLink L); //修改联系人void Tem_Delate(TeleLink L); //删除联系人void Save(TeleLink &L); //保存联系人void sort(TeleLink &L); //对联系人排序void Display_Single(TeleLink tem); //单个联系人输出void Display_All(TeleLink L); //输出所有联系人void read(TeleLink &L); //从文件中读取int main(){menu();return 0;}TeleLink InitList() //初始化链表{TeleLink L=(TeleLink)malloc(sizeof(TeleNumber));if(L){L->next=NULL;return L;}elsereturn(NULL);}void menu() //系统菜单{TeleLink L;L=InitList();int n,i;bool flag=1;while(flag==1){system("cls");printf("\t\t\t**********************************\n");printf("\t\t\t\t个人电话号码查询系统\n");printf("\t\t\t**********************************\n");printf("\t\t\t\t请选择您所需服务\n\n");printf("\t\t\t\t1.增加联系人\n\n");printf("\t\t\t\t2.查询联系人\n\n");printf("\t\t\t\t3.修改联系人\n\n");printf("\t\t\t\t4.删除联系人\n\n");printf("\t\t\t\t5.保存联系人\n\n");printf("\t\t\t\t6.输出联系人\n\n");printf("\t\t\t\t7.读取联系人\n\n");printf("\t\t\t\t0.退出系统\n\n");printf("\t\t\t**********************************\n");printf("\t\t\t\t请选择:");scanf("%d",&n);switch(n){case 0:exit(0);case 1:int NUM;system("cls");printf("\t\t\t**********************************\n");printf("\t\t\t\t 增加联系人\n");printf("\t\t\t**********************************\n\n");printf("请输入要添加人的数目:");scanf("%d",&NUM);Tele_Insert(L,NUM); //调用插入函数printf("\n是否返回上一级菜单?(0/1)");scanf("%d",&i);if(i==1){break;}else{flag=0;break;}break;case 2:Info_Search(L); //调用查找函数printf("\n是否返回上一级菜单?(0/1)");scanf("%d",&i);if(i==1){flag=1;break;}else{flag=0;break;}break;case 3:Info_Change(L); //调用修改函数printf("\n是否返回上一级菜单?(0/1)");scanf("%d",&i);if(i==1){flag=1;break;}else{flag=0;break;}printf("%d",flag);break;case 4:Tem_Delate(L); //删除联系人printf("\n是否返回上一级菜单?(0/1)");scanf("%d",&i);if(i==1){flag=1;}else{flag=0;break;}printf("%d",flag);break;case 5:sort(L); //排序函数Save(L); //保存printf("保存成功!\n");printf("\n是否返回上一级菜单?(0/1)");scanf("%d",&i);if(i==1){flag=1;break;}else{flag=0;break;}case 6:sort(L); //排序Display_All(L); //输出printf("\n是否返回上一级菜单?(0/1)");scanf("%d",&i);if(i==1){flag=1;break;}else{flag=0;break;}case 7:read(L); //读取数据printf("读取成功!\n\n");printf("是否返回上一级菜单?(0/1)");scanf("%d",&i);if(i==1){flag=1;break;}else{flag=0;break;}printf("%d",flag);break;}}}void Tele_Insert(TeleLink L,int Num) //插入联系人{TeleLink Head,q=NULL;Head=L;for(int i=0; i<Num; i++){TeleLink p = (TeleLink)malloc(sizeof(TeleNumber));getchar();printf("\n请输入联系人姓名: ");gets(p->name);fflush(stdin);printf("\n请输入固定电话: ");gets(p->phoneNumber);fflush(stdin);printf("\n请输入移动电话:");gets(p->mobileNumber);fflush(stdin);printf("\n请输入归属地:");gets(p->area);fflush(stdin);for(q=Head->next; q!=NULL; q=q->next){if(strcmp(p->name,q->name)==0&&strcmp(p->phoneNumber,q->phoneNumber)==0&&strcmp(p->mobileNum ber,q->mobileNumber)==0&&strcmp(p->area,q->area)==0)printf("\n\n联系人已存在!\n");}p->next = L->next;L->next = p;//从头节点插入节点}}void Info_Search(TeleLink &L) //查找联系人{int j,i;bool flag=1;while(flag==1){system("cls");printf("\t\t\t**********************************\n");printf("\t\t\t\t 查询联系人\n");printf("\t\t\t**********************************\n\n");printf("\t\t\t\t请选择查询方式:\n\n");printf("\t\t\t\t1.通过姓名查找\n\n");printf("\t\t\t\t2.通过移动电话查找\n\n");printf("\t\t\t\t3.通过归属地查询\n\n");printf("\t\t\t\t4.通过固定电话查询\n\n");printf("\t\t\t\t0.退出查找\n\n\n");printf("\t\t\t\t请选择: ");scanf("%d",&j);switch(j){case 0:printf("确定退出查找?(0/1) ");scanf("%d",&i);if(i==1){flag=0;break;}else{flag=1;break;}case 1:Search_Name(L);break;case 2:Search_Mobile(L);break;case 3:Search_Area(L);break;case 4:Search_Phone(L);break;}}}void Search_Name(TeleLink L) //按姓名查找{int i;char name[20];int flag;TeleLink pHead,p=NULL;pHead=L;system("cls");printf("\n\n\n\t\t\t\t 姓名查找\n");printf("********************************************************************************\n");do{flag=0;printf("请输入要查找的联系人姓名:");scanf("%s",name);for(p=pHead->next; p!=NULL; p=p->next){if(strcmp(p->name,name)==0){Display_Single(p);flag=1;}}if(flag==0){printf("无该联系人!\n");}printf("\n是否继续?(1/0)");scanf("%d",&i);}while(i==1);}void Search_Mobile(TeleLink L) //按移动电话查找{int i;char mobile[20];int flag;TeleLink pHead,p=NULL;pHead=L;system("cls");printf("\n\n\n\t\t\t\t 移动电话号码查找\n");printf("********************************************************************************\n");do{flag=0;printf("请输入要查找的联系人电话:");scanf("%s",mobile);for(p=pHead->next; p!=NULL; p=p->next){if(strcmp(p->mobileNumber,mobile)==0){Display_Single(p);flag=1;}}if(flag==0){printf("无该联系人!\n");}printf("\n是否继续?(1/0)");scanf("%d",&i);}while(i==1);}void Search_Area(TeleLink L) //按归属地查找{int i;char area[20];int flag;TeleLink pHead,p=NULL;pHead=L;system("cls");printf("\n\n\n\t\t\t\t 归属地查找\n");printf("********************************************************************************\n");do{flag=0;printf("请输入要查找的联系人归属地:");scanf("%s",area);for(p=pHead->next; p!=NULL; p=p->next){if(strcmp(p->area,area)==0){Display_Single(p);flag=1;}}if(flag==0){printf("无该联系人!\n");}printf("\n是否继续?(1/0)");scanf("%d",&i);}while(i==1);}void Search_Phone(TeleLink L) //按固定电话查找{int i;char phone[20];int flag;TeleLink pHead,p=NULL;pHead=L;system("cls");printf("\n\n\n\t\t\t\t 固定电话号码查找\n");printf("********************************************************************************\n");do{flag=0;printf("请输入要查找的联系人电话:");scanf("%s",phone);for(p=pHead->next; p!=NULL; p=p->next){if(strcmp(p->phoneNumber,phone)==0){Display_Single(p);flag=1;}}if(flag==0){printf("无该联系人!\n");}printf("\n是否继续?(1/0)");scanf("%d",&i);}while(i==1);}void Info_Change(TeleLink L) //修改联系人{int i,n,flag;char name[20];char mobile[20];char phone[20];char area[20];TeleLink pHead,p=NULL;pHead=L;system("cls");printf("\t\t\t**********************************\n");printf("\t\t\t\t 修改联系人\n");printf("\t\t\t**********************************\n\n");do{flag=0;p=pHead;printf("\n请输入要修改的联系人姓名: ");scanf("%s",name);printf("\n请输入要修改的联系人固定电话: ");scanf("%s",phone);printf("\n请输入要修改的联系人移动电话: ");scanf("%s",mobile);printf("\n请输入要修改的联系人归属地: ");scanf("%s",area);for(p=pHead->next; p!=NULL; p=p->next){if(strcmp(p->name,name)==0||strcmp(p->phoneNumber,phone)==0||strcmp(p->mobileNumber,mobile)==0||strc mp(p->area,area)==0){Display_Single(p);printf("是否修改联系人信息?(1/0)");scanf("%d",&n);if(n==1)printf(" %s %s %s %s\n",p->name,p->mobileNumber,p->phoneNumber,p->area);printf("\n修改后的联系人姓名: ");scanf("%s",p->name);printf("\n修改后的固定电话: ");scanf("%s",p->phoneNumber);printf("\n修改后的移动电话: ");scanf("%s",p->mobileNumber);printf("\n修改后的归属地: ");scanf("%s",p->area);flag=1;Save(L);printf("\n修改成功!\n");}else{printf("已成功退出修改!");flag=1;}}}if(flag==0)printf("该联系人不存在!\n");printf("\n是否继续?(1/0)\n");scanf("%d",&i);}while(i==1);}void Tem_Delate(TeleLink L) //删除联系人{int i,flag,n;char name[20];char mobile[20];char phone[20];char area[20];TeleLink Head,p=NULL,q;Head=L;system("cls");printf("\t\t\t**********************************\n");printf("\t\t\t\t 删除联系人\n");printf("\t\t\t**********************************\n\n");do{flag=0;printf("\n请输入要删除的联系人姓名: ");scanf("%s",name);printf("\n请输入要删除的联系人固定电话: ");scanf("%s",phone);printf("\n请输入要删除的联系人移动电话: ");scanf("%s",mobile);printf("\n请输入要删除的联系人归属地: ");scanf("%s",area);for(p=Head; p->next!=NULL; p=p->next){if(strcmp(p->next->name,name)==0||strcmp(p->next->phoneNumber,phone)==0||strcmp(p->next->mobileNumb er,mobile)==0||strcmp(p->next->area,area)==0){Display_Single(p->next);printf("\n是否删除联系人?(1/0)");scanf("%d",&n);if(n==1){q=p->next;p->next=q->next;free(q);flag=1;printf("\n删除成功!\n");break;}else{flag=1;printf("\n已退出删除!\n");}}}if(flag==0)printf("该联系人不存在!\n\n");printf("\n是否继续?(1/0)");scanf("%d",&i);}while(i==1);Save(L);}void Save(TeleLink &L) //保存联系人{FILE *fp;TeleLink p1;if((fp=fopen("C://data.txt","w+"))==NULL){printf("File open error!\n");exit(0);}for(p1=L->next; p1; p1=p1->next){fprintf(fp,"%-7s\t%-10s\t%-15s\t%-10s\n",p1->name,p1->phoneNumber,p1->mobileNumber,p1->area);}fclose(fp);}void sort(TeleLink &L) //对联系人排序{TeleLink m,p,q,n;m=NULL;if(L->next==NULL||L->next->next==NULL){return;}while(m!=L->next->next){for(p=L; p->next->next!=m; p=p->next){if(strcmp(p->next->name,p->next->next->name)>0){q=p->next;n=p->next->next;p->next=n;q->next=n->next;n->next=q;}}m=p->next;}}void Display_Single(TeleLink tem) //单个联系人输出{printf("\n\n联系人信息: \n\n");printf("姓名: %s \n\n",tem->name);printf("移动电话:%s \n\n",tem->mobileNumber);printf("固定电话:%s \n\n",tem->phoneNumber);printf("号码归属地:%s \n\n\n",tem->area);}void Display_All(TeleLink L) //输出所有联系人{system("cls");if(L->next == NULL)printf("无联系人!\n");else{printf("\t\t\t**********************************\n");printf("\t\t\t\t 联系人信息:\n");printf("\t\t\t**********************************\n\n");for(TeleLink tem=L->next; tem!=NULL; tem=tem->next){printf("姓名:%s\t固定电话:%s\t移动电话:%s\t归属地:%s\n",tem->name,tem->phoneNumber,tem->mobileNumber,tem->area);}}}void read(TeleLink &L) //从文件中读取数据{FILE *fp;TeleLink Head,tail,p;Head=tail=L;if((fp=fopen("C://data.txt","r+"))==NULL){printf("File open error!\n");exit(0);}while(!feof(fp)){p=(TeleLink)malloc(sizeof(TeleNumber));fscanf(fp,"%s%s%s%s\n",p->name,p->phoneNumber,p->mobileNumber,p->area);if(Head==NULL)Head=p;elsetail->next=p;tail=p;}tail->next=NULL;fclose(fp);}。
数据结构课程设计-利用散列表做一个电话号码查找系统
数据结构课程设计-利⽤散列表做⼀个电话号码查找系统【基本要求】(1)设每个记录有下列数据项:电话号码、⽤户名、地址;(2)从键盘输⼊各记录,分别以电话号码和⽤户名为关键字建⽴散列表;(3)采⽤⼀定的⽅法解决冲突;(4)查找并显⽰给定电话号码的记录;(5)查找并显⽰给定⽤户名的记录。
【选做内容】(1)系统功能的完善;(2)设计不同的散列函数,⽐较冲突率; (3)在散列函数确定的前提下,尝试各种不同类型处理冲突的⽅法,考察平均查找长度的变化。
⽤的C++开发,基本实现了3种哈希函数+3种解决冲突的⽅法。
因为要求同时有姓名散列与按号码散列,所以⽤了flag标记每次的散列类型,针对不同的要求对散列函数做了个别优化。
哈希表类的结构如下1class HashTable{2public:3 HashTable(int size = MAXSIZE-1);4 ~HashTable(){ delete[]E; delete[]tag; delete[]E2; delete[]tag2; }5int hash1(string name, int flag);//哈希函数1 除数求余法6int hash2(string tel);//哈希函数2 折叠法7int hash3(string tel);//哈希函数3 数字分析法8int solve1(int hashVal, int flag);//线性探测法解决冲突9int solve2(int hashVal, int flag);//⼆次探测法解决冲突10 Node* solve3(int hashVal, int flag);//拉链法解决冲突11 User input();//往电话薄中添加⽤户12void creat(int flag); //创建散列表13void show(int flag); //列出电话薄所有元素14void search(int flag,string at); //搜索指定⽤户15void searchByNode(int flag, string at); //拉链法搜索指定⽤户16void insert(int flag, User newUser); //插⼊17void del(int flag, string by);//删除18void save(int flag);//将电话薄保存⾄本地⽂件19int length; //要创建的电话本长度20 Node** ht;21private:22 User* E; //⽤户数组按姓名散列23 User* E2; //⽤户数组2 按电话号码散列24int* tag; //标记散列表1每个桶的存储状态 0为空 1为实25int* tag2;//标记散列表2每个桶的存储状态26int flag; //1表⽰是按姓名 2表⽰按电话号码新建的哈希表27int maxSize; //哈希表最⼤长度28int f;//⽐例因⼦主要⽤于折叠法29 };View CodeUser类的结构class User{public:string name;string tel;string address;bool operator==(const User&target){if (this->name == &&this->address == target.address&&this->tel == target.tel)return true;elsereturn false;}};哈希函数1int HashTable::hash1(string name,int flag) //除留求余法{int hashValue; long a = 0;switch (flag){case1:for (int i = 0; i < name.length(); i++)a += int(name[i]);hashValue = a%maxSize;break;case2:int temp = atof(name.c_str());hashValue = temp%maxSize;break;}return hashValue;};哈希函数2int HashTable::hash2(string tel) //折叠法--移位法{int hashValue;int temp; //移位法求和temp = atof(tel.substr(0, 3).c_str()) + atof(tel.substr(3, 3).c_str())+ atof(tel.substr(6, 3).c_str()) + atof(tel.substr(9, 2).c_str());//取计算之后的数的最后三位if (temp >= 999){char p[10];sprintf(p, "%d", temp);string lastThree = p;lastThree = lastThree.substr(lastThree.length() - 3, 3);hashValue = atof(lastThree.c_str());return hashValue;}hashValue = temp;return hashValue;};哈希函数3int HashTable::hash3(string tel)//数字分析法做哈希函数{int hashValue;hashValue = atof(tel.substr(8, 3).c_str()); //因为电话号码⼀般后4位不同return hashValue;};解决冲突的⽅法1.线性探测法int HashTable::solve1(int hashVal,int flag) //线性探查法处理冲突{int output = hashVal;switch (flag){case1:for (int j = 1; j < MAXSIZE; j++){output = (hashVal + j) % MAXSIZE;if (tag[output] == 0){tag[output] = 1;return output;}}return -1;break;case2:for (int j = 1; j < MAXSIZE; j++){output = (hashVal + j) % MAXSIZE;if (tag2[output] == 0){tag2[output] = 1;return output;}}return -1;default:break;}};2.⼆次探查法int HashTable::solve2(int hashVal, int flag) //⼆次探查法解决冲突{int i = hashVal; //i为初始桶号int k = 0; //k为探查次数int odd = 0; //odd为控制加减的标志int save; //缓存上⼀次的桶号switch (flag){case1:while (tag[i]==1){if (odd == 0){k++; save = i;i = (i + 2 * k-1) % MAXSIZE;odd = 1;}else{i = (save - 2 * k+1) % MAXSIZE;odd = 0;if (i<0){i = i + MAXSIZE;}}}return i;break;case2:while (tag2[i] == 1){if (odd == 0){k++; save = i;i = (i + 2 * k - 1) % MAXSIZE;odd = 1;}else{k++;i = (save - 2 * k + 1) % MAXSIZE;odd = 0;if (i<0){i = i + MAXSIZE;}}}return i;break;default:break;}};3.拉链法Node* HashTable::solve3(int hashVal, int flag)//拉链法解决冲突{int i = hashVal; //第i条链Node*p = ht[i]; //该链上的头指针while (p!=NULL)p = p->next;//往后遍历直到找到⼀个空节点⽤于存放userreturn p;};所有代码如下1 #include <iostream>2 #include <string>3 #include <fstream>45using namespace std;67const int MAXSIZE = 12;//默认最⼤表长89101112//存储项13class User{14public:15string name;16string tel;17string address;18bool operator==(const User&target)19 {20if (this->name == &&this->address == target.address&&this->tel == target.tel) 21return true;22else23return false;24 }25 };2627//⽤于拉链法28struct Node{29 User user;30 Node* next;31 };32class HashTable{33public:34 HashTable(int size = MAXSIZE-1);35 ~HashTable(){ delete[]E; delete[]tag; delete[]E2; delete[]tag2; }36int hash1(string name, int flag);//哈希函数1 除数求余法37int hash2(string tel);//哈希函数2 折叠法38int hash3(string tel);//哈希函数3 数字分析法39int solve1(int hashVal, int flag);//线性探测法解决冲突40int solve2(int hashVal, int flag);//⼆次探测法解决冲突41 Node* solve3(int hashVal, int flag);//拉链法解决冲突42 User input();//往电话薄中添加⽤户43void creat(int flag); //创建散列表44void show(int flag); //列出电话薄所有元素45void search(int flag,string at); //搜索指定⽤户46void searchByNode(int flag, string at); //拉链法搜索指定⽤户47void insert(int flag, User newUser); //插⼊48void del(int flag, string by);//删除49void save(int flag);//将电话薄保存⾄本地⽂件50int length; //要创建的电话本长度51 Node** ht;52private:53 User* E; //⽤户数组按姓名散列54 User* E2; //⽤户数组2 按电话号码散列55int* tag; //标记散列表1每个桶的存储状态 0为空 1为实56int* tag2;//标记散列表2每个桶的存储状态57int flag; //1表⽰是按姓名 2表⽰按电话号码新建的哈希表58int maxSize; //哈希表最⼤长度59int f;//⽐例因⼦主要⽤于折叠法60 };6162 HashTable::HashTable(int size)63 {64 maxSize = size; //⽤作除数65 E = new User[MAXSIZE];66 E2 = new User[MAXSIZE];67 tag = new int[MAXSIZE];68 tag2 = new int[MAXSIZE];69for (int i = 0; i < MAXSIZE; i++)70 {71 tag[i] = 0;72 tag2[i] = 0;73 }74 f = maxSize / 512; //⽤于折叠法产⽣的哈希值过⼤保留3位数的地址范围为0~51175 ht = new Node*[maxSize]; //存放节点的⼀维数组拉链法76 };7778int HashTable::hash1(string name,int flag) //除数求余法79 {80int hashValue; long a = 0;81switch (flag)82 {83case1:84for (int i = 0; i < name.length(); i++)85 a += int(name[i]);86 hashValue = a%maxSize;87break;88case2:89int temp = atof(name.c_str());90 hashValue = temp%maxSize;91break;9293 }94return hashValue;95 };9697int HashTable::hash2(string tel) //折叠法--移位法98 {99int hashValue;100int temp; //移位法求和101 temp = atof(tel.substr(0, 3).c_str()) + atof(tel.substr(3, 3).c_str())102 + atof(tel.substr(6, 3).c_str()) + atof(tel.substr(9, 2).c_str());103//取计算之后的数的最后三位104if (temp >= 999)105 {106char p[10];107 sprintf(p, "%d", temp);108string lastThree = p;109 lastThree = lastThree.substr(lastThree.length() - 3, 3);110 hashValue = atof(lastThree.c_str());111return hashValue;112 }113 hashValue = temp;114return hashValue;115 };116117int HashTable::hash3(string tel)//数字分析法做哈希函数118 {119int hashValue;120 hashValue = atof(tel.substr(8, 3).c_str()); //因为电话号码⼀般后4位不同121return hashValue;122 };123124int HashTable::solve1(int hashVal,int flag) //线性探查法处理冲突125 {126int output = hashVal;127switch (flag)128 {129case1:130for (int j = 1; j < MAXSIZE; j++)131 {132 output = (hashVal + j) % MAXSIZE;133if (tag[output] == 0)134 {135 tag[output] = 1;136return output;137 }138 }139return -1;140break;141case2:142for (int j = 1; j < MAXSIZE; j++)143 {144 output = (hashVal + j) % MAXSIZE;145if (tag2[output] == 0)146 {147 tag2[output] = 1;148return output;149 }150 }151return -1;152default:153break;154 }155156 };157158int HashTable::solve2(int hashVal, int flag) //⼆次探查法解决冲突159 {160int i = hashVal; //i为初始桶号161int k = 0; //k为探查次数162int odd = 0; //odd为控制加减的标志163int save; //缓存上⼀次的桶号164switch (flag)165 {166case1:167while (tag[i]==1)168 {169if (odd == 0)170 {171 k++; save = i;172 i = (i + 2 * k-1) % MAXSIZE;173 odd = 1;174 }175else176 {177 i = (save - 2 * k+1) % MAXSIZE;178 odd = 0;179if (i<0)180 {181 i = i + MAXSIZE;182 }183 }184 }185return i;186break;187case2:188while (tag2[i] == 1)189 {190if (odd == 0)191 {192 k++; save = i;193 i = (i + 2 * k - 1) % MAXSIZE;194 odd = 1;195 }196else197 {198 k++;199 i = (save - 2 * k + 1) % MAXSIZE;200 odd = 0;201if (i<0)202 {203 i = i + MAXSIZE;204 }205 }206 }207return i;208break;209default:210break;211 }212213 };214215/*216Node* HashTable::solve3(int hashVal, int flag)//拉链法解决冲突217218{219 int i = hashVal; //第i条链220221 Node*p = ht[i]; //该链上的头指针222 while (p!=NULL)223 p = p->next;//往后遍历直到找到⼀个空节点⽤于存放user 224 return p;225};226227void HashTable::searchByNode(int flag, string at)//调⽤拉链法搜索228{229 int i = hash1(at,1);230 Node** ht = new Node*[maxSize]; //存放节点的⼀维数组231 Node*p = ht[i]; //该链上的头指针232 while (p!=NULL&&p->!=at)233 {234 p = p->next;235 }236};237*/238 User HashTable::input()239 {240 User user;241 cout << "请输⼊姓名:" << endl;242 cin >> ;243 cout << "请输⼊电话号码:" << endl;244 cin >> user.tel;245 cout << "请输⼊地址:" << endl;246 cin >> user.address;247return user;248 };249250void HashTable::creat(int flag)251 {252switch (flag)253 {254case1: //按姓名哈希创建哈希表255for (int i = 0; i < length; i++)256 {257 User newUser = input();258int val = hash1(,1);259if (tag[val] == 1)260 val = solve1(val,1);//线性探测法解决冲突261 E[val] = newUser;262 tag[val] = 1;263 }264break;265case2: //按电话号码哈希创建哈希表266for (int i = 0; i < length; i++)267 {268 User newUser = input();269int val = hash1(newUser.tel,2);270if(tag2[val] == 1)271 val = solve1(val,2);//线性探测法解决冲突272 E2[val] = newUser;273 tag2[val] = 1;274 }275break;276 }277 };278void HashTable::show(int flag)279 {280switch (flag)281 {282case1:283for (int i = 0; i < MAXSIZE; i++)284 {285if (tag[i] == 1)286 cout << E[i].name << "" << E[i].tel << "" << E[i].address << " 位于: " << i << endl; 287 }288break;289case2:290for (int i = 0; i < MAXSIZE; i++)291 {292if (tag2[i] == 1)293 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << " 位于: " << i << endl; 294 }295break;296 }297298 };299300void HashTable::search(int flag,string at) //at表⽰索引内容301 {302int i = 0;303switch (flag)304 {305case1: //调⽤线性探测法查找姓名306 i = hash1(at,1);307if (tag[i] == 1 && E[i].name != at)308 i = solve1(i, 2);309if (i < 0 || tag2[i] == 0)310 {311 cout << "查⽆此⼈!" << endl;312return;313 }314if (tag[i] == 1 && E[i].name == at)315 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl;316break;317case2: //调⽤⼆次探测法查找电话号码318 i = hash2(at);319if (tag2[i] == 1&&E2[i].tel!=at)320 i = solve2(i,2);321if (i < 0||tag2[i]==0)322 {323 cout << "查⽆此⼈!" << endl;324return;325 }326if (tag2[i] == 1 && E2[i].tel==at)327 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl;328break;329 }330 };331332void HashTable::insert(int flag, User newUser){333int i = -1;334switch (flag)335 {336case1:337 i = hash1(,1);338if (tag[i] == 1||E[i]==newUser)339 i = solve1(i, 1);340if (i < 0)341 {342 cout << "表满!插⼊失败!" << endl;343return;344 }345if (tag[i] == 0)346 {347 E[i] = newUser;348 tag[i] = 1;349 length++;350 cout << "插⼊成功" << endl;351 }352case2:353 i = hash1(newUser.tel,2);354if (tag2[i] == 1 || E2[i] == newUser)355 i = solve1(i, 2);356if (i < 0)357 {358 cout << "表满!插⼊失败!" << endl;359return;360 }361if (tag2[i] == 0)362 {363 E2[i] = newUser;364 tag2[i] = 1;365 length++;366 cout << "插⼊成功" << endl;367 }368default:369break;370 }371 };372373void HashTable::del(int flag, string by) //by表⽰按照何种标签进⾏删除374 {375int i = -1;376int select;//选择是否删除377switch (flag)378 {379case1: //调⽤线性探测法查找姓名380 i = hash1(by,1);381if (tag[i] == 1 && E[i].name != by)382 i = solve1(i, 2);383if (i < 0 || tag2[i] == 0)384 {385 cout << "查⽆此⼈!" << endl;386return;387 }388if (tag[i] == 1 && E[i].name == by)389 {390 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl; 391 cout << "是否删除 0.删了 1.算了" << endl;392 cin >> select;393if (select == 0)394 tag[i] = 0;//伪删除395 }396break;397case2: //调⽤⼆次探测法查找电话号码398 i = hash2(by);399if (tag2[i] == 1 && E2[i].tel != by)400 i = solve2(i, 2);401if (i < 0 || tag2[i] == 0)402 {403 cout << "查⽆此⼈!" << endl;404return;405 }406if (tag2[i] == 1 && E2[i].tel == by)407 {408 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl; 409 cout << "是否删除 0.删了 1.算了" << endl;410 cin >> select;411if (select == 0)412 tag2[i] = 0;//伪删除413 }414break;415 }416 };417418void HashTable::save(int flag)419 {420 fstream out1("电话薄(姓名散列).txt", ios::out);421 fstream out2("电话薄(号码散列).txt", ios::out);422switch (flag)423 {424case1:425for (int i = 0; i < maxSize; i++)426 {427if (tag[i] == 1)428 out1 << E[i].name << "" << E[i].tel << "" << E[i].address << endl; 429 }430 cout << "已存⾄电话薄(姓名散列).txt" << endl;431return;432break;433case2:434for (int i = 0; i < maxSize; i++)435 {436if (tag2[i] == 1)437 out2 << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl; 438 }439 cout << "已存⾄电话薄(号码散列).txt" << endl;440return;441break;442default:443break;444 }445446 };hashtable.h1 #include <iostream>2 #include <string>3 #include <fstream>4 #include "hashtable.h"5using namespace std;67//菜单8void menu()9 {10 cout << " ****************************" << endl;11 cout << "|| 0.建表 ||" << endl;12 cout << "|| 1.查看 ||" << endl;13 cout << "|| 2.搜索 ||" << endl;14 cout << "|| 3.添加 ||" << endl;15 cout << "|| 4.删除 ||" << endl;16 cout << "|| 5.保存 ||" << endl;17 cout << "|| 6.退出 ||" << endl;18 cout << " ****************************" << endl;1920 }2122int main()23 {24 User user;25int size;//第⼀次创建的数据量⼤⼩26int select;//主菜单选项27int select_;//⼦菜单选项28 cout << "欢迎使⽤电话簿" << endl;29 HashTable ht;30while (1)31 {32 menu();33 cin >> select;34switch (select)35 {36case0:37 cout << "第⼀次使⽤,请输⼊要新建的电话本⼤⼩:" << endl;38 cin >> size;39 ht.length = size;40 cout << "1.姓名散列 2.电话号码散列" << endl;41 cin >> select_;42 ht.creat(select_);43break;44case1:45 cout << "1.姓名散列 2.电话号码散列" << endl;46 cin >> select_;47 ht.show(select_);48break;49case2:50 cout << "1.按姓名查找 2.按电话号码查找" << endl;51 cin >> select_;52if (select_==1)53 {54 cout << "输⼊姓名" << endl;55string name;56 cin >> name;57 ht.search(1, name);58 }59else if (select_ == 2)60 {61 cout << "输⼊号码" << endl;62string tel;63 cin >> tel;64 ht.search(2, tel);65 }66else67 cout << "不合法操作" << endl;68break;69case3:70 user = ht.input();71 cout << "1.插⼊到姓名散列表 2.插⼊到电话号码散列" << endl;72 cin >> select_;73 ht.insert(select_,user);74break;75case4:76 cout << "1.根据姓名删除 2.根据电话号码删除" << endl;77 cin >> select_;78if (select_ == 1)79 {80 cout << "输⼊姓名" << endl;81string name;82 cin >> name;83 ht.del(1, name);84 }85else if (select_ == 2)86 {87 cout << "输⼊号码" << endl;88string tel;89 cin >> tel;90 ht.del(2, tel);91 }92else93 cout << "不合法操作" << endl;94break;95case5:96 cout << "1.保存姓名散列表到本地 2.保存电话号码散列表到本地" << endl;97 cin >> select_;98 ht.save(select_);99case6:100return0;101 }102 }103 }main.cpp通过这次课程设计,总结如下1. C++技艺不精,语法不熟悉,⽐如模版类与运算符重载,指针更是不⼤熟练。
个人电话号码查询系统设计报告
问题描述:实现一个简单个人电话号码查询系统,根据用户输入信息(如姓名等)进行快速查询。
基本要求:(1)在内存中,设计数据结构存储电话号码信息;(2)在外存上,用文件保存电话号码信息;(3)提供查询功能:根据姓名实现快速查询;(4)提供其他维护功能,例如插入、删除、修改等。
需求分析:(1)输入数据建立个人电话号码查询系统。
(2)输出个人电话号码查询系统中的所有联系信息。
(3)插入新的联系人信息。
(4)查询该系统中满足要求的信息。
(5)删除不需要的联系人信息。
数据结构设计:(一)模块设计本程序包含两个模块:主程序模块和链表操作模块。
其调用关系如下图所示.(二)系统子程序及功能设计本系统中共设置5个子程序,子程序的函数名及功能说明如下,其中大部分都是链表的基本操作函数。
(1)LinkList Book_Creat(LinkList list) //1.新建个人电话号码信息(2)LinkList Book_Print(LinkList list) //2.浏览个人电话号码信息(3)Book_Search(LinkList list) //3.查找个人电话号码信息(4)LinkList Book_Del(LinkList list) //4.删除个人电话号码信息(5)main() //主函数。
设定界面颜色和大小,调用链表操作模块(三)函数主要调用关系图算法设计:(一)概要设计:为了实现需求分析中的功能,可以从三个方面着手设计。
1.主界面设计为了实现个人电话号码查询系统各功能的管理,设计一个含有多个菜单项的主菜单子程序已链接系统各项子功能,方便用户使用本系统。
本系统主控菜单运行界面如图所示:2.存储结构设计本系统主要采用链表结构类型来表示存储在“简单个人电话号码查询系统”中的信息。
其中,链表结点由4个分量构成:成员姓名、电话号码1、电话号码2、指向该结构体的指针。
3.系统功能设计本系统设置了5个子功能菜单,设计描述如下:(1)新建个人电话号码信息。
简单个人电话号码查询系统
课程设计任务书2011—2012学年第1学期电子与信息工程系专业班级课程设计名称:数据结构课程设计设计题目:简单个人电话号码查询系统完成期限:自2012 年1月2日至2012 年1月 6 日共 1 周一、设计目的熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求在本课程设计过程中要求学生:(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩。
(3)学生在接受设计任务后,根据要求认真完成。
(4)认真编写课程设计报告。
三、设计内容1) 问题描述人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。
2) 基本要求(1) 在外存上,用文件保存电话号码信息;(2) 在内存中,设计数据结构存储电话号码信息;(3) 提供查询功能:根据姓名实现快速查询;(4) 提供其他维护功能:例如插入、删除、修改等;(5) 按电话号码进行排序。
3) 设计思想由于需要管理的电话号码信息较多,而且要在程序运行结束后仍然保存电话号码信息,所以电话号码信息采用文件的形式存放到外存中。
在系统运行时,需要将电话号码信息从文件调入内存来进行查找等操作,为了接收文件中的内容,要有一个数据结构与之对应,可以设计如下结构类型的数组来接收数据:const int max=10;struct TeleNumber{string name; //姓名string phoneNumber; //固定电话号码string mobileNumber; //移动电话号码string email; //电子邮箱} Tele[max];为了实现对电话号码的快速查询,可以将上述结构数组排序,以便应用折半查找,但是,在数组中实现插入和删除操作的代价较高。
小型电话号码查询系统
小型电话号码查询系统王雨娉目录摘要 (1)1绪论 (1)2系统分析 (1)2.1功能需求 (1)2.2性能需求 (2)3总体设计 (2)3.1功能模块设计 (2)3.2系统设计方案 (3)4详细设计 (3)4.1系统信息添加和结果显示模块 (3)4.2系统信息保存和清空操作模块 (6)4.3系统信息查询模块 (7)5调试与测试 (8)5.1调试 (8)5.2测试 (10)6结论 (9)结束语 (9)参考文献 (9)附录1-用户手册 (10)附录2-源程序 (15)摘要当前社会已经步入了一个信息化的时代,随着社会劳动生产率的不断提高,与之相对应的信息查询服务系统也在不断的完善。
本程序运用查找函数和结构体的建立,构建的哈希表采用再哈希的方法解决冲突,实现电话号码及有相关信息的准确查询,同时编译了对信息的保存和清空函数,使该电话号码的查询系统操作起来更加自如。
本文从分析课题的题目背景、题目意义、题目要求等出发,分别从需求分析、总体设计、详细设计、测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。
关键词:哈希表;再哈希法;查找函数1绪论高度信息化的年代里,电话号码信息系统的出现正是当前时代发展的需要,它的出现给我们的工作生活无疑带来了很多方便。
编程人员通过对电话号码及其相关信息查询功能的不断编写和完善,来尽量满足人们的需要。
根据课程设计任务书要求,本程序的开发主要完成以下功能和性能。
(1)设置一个包括用户姓、地址、号码的信息的结构体。
(2)编译void Create()函数来创建结点,运用int Apend()函数来添加结点信息,通过node* Input()函数来对用户的信息进行存储。
(3)编译函数void List()、void List2()分别根据号码和姓名的查询方式显示用户信息的哈希结果,并且结果会在屏幕上显示出来。
(4)编译void Find(char num[11]) 、void Find2(char name[8])函数分别根据用户的电话号码和姓名对用户的详细信息进行查找,当要查询的结果不在系统存储时,屏幕上将显示“无此记录”。
电话号码查询系统
电话号码查询系统郭凯汾西重工有限责任公司科技处摘要:本文首先介绍办公自动化的定义,使人们对自动化有所认识,其次分析自动化办公的技术层次,在办公过程中对信息的检索尤为重要,面对大量的数据手工检测是个费时费力的工作,为了提高效率可借助于计算机,但是计算机还只是个壳子,需要有软件来实现相应的功能,两者的协同工作提高了检索效率与准确率,另一方面也大大提高了相关的工作效率。
关键词:网络,电话,办公自动化,信息,信息检索1 前言1.1 办公自动化定义办公室自动化是近年随着计算机科学发展而提出来的新概念。
办公室自动化英文原称Office Automation,缩写为 OA。
办公室自动化系统一般指实现办公室内事务性业务的自动化,而办公自动化则包括更广泛的意义,包括网络化的大规模信息处理系统,及凡是在传统的办公室中采用各种新技术、新机器、新设备从事办公业务,都属于办公自动化的领域。
1.2 办公自动化的技术层次随着三大核心支柱技术(网络通讯技术、计算机技术和数据库技术)的成熟,世界上的OA已进入到新的层次。
第一个层次只限于单机或简单的小型局域网上的文字处理、电子表格、数据库等辅助工具的应用,一般称之为事务型办公自动化系统。
信息管理型OA系统是第二个层次。
信息管理型的办公系统,是把事务型(或业务型)办公系统和综合信息(数据库)紧密结合的一种一体化的办公信息处理系统。
决策支持型 OA系统是第三个层次。
它建立在信息管理级OA系统的基础上。
它使用由综合数据库系统所提供的信息,针对所需要做出决策的课题,构造或选用决策数字模型,结合有关内部和外部的条件,由计算机执行决策程序,做出相应的决策。
1.3 信息检索1)信息检索的原理信息系统在存储信息时,按照信息的外部特征和内容特征赋予特征标识。
检索时,将所需信息的特征标识与所存的信息的特征标识进行比较。
当二者的特征标识一致时,或所存信息的特征标识包含所需信息的标识时,就检索到了用户所需的信息。
数据结构毕业设计论文题目整理
数据结构课程设计题目1.飞机订票系统(限1 人完成)(顺序或链式存储)任务:通过此系统可以实现如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:当航班信息改变可以修改航班数据文件要求:根据以上功能说明,设计航班信息,订票信息,客户信息的存储结构,设计程序完成功能;2.宿舍管理查询软件(限1 人完成)任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:采用交互工作方式建立数据文件,包括学生信息、宿舍信息、住宿信息,学生信息按关键字(姓名、学号)进行排序(排序方法自选,不能相同);查询: (用二分查找实现以下操作)按姓名查询按学号查询(用顺序查找实现以下操作)按房号查询3.校园导航问题(限1 人完成)设计要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
要求:能增加场所4.图书借阅管理系统(限1 人完成)(顺序或链式存储)主要分为两大功能:1)图书管理(增加图书、查询图书、删除图书、图书借阅、还书);2)会员管理(增加会员、查询会员、删除会员、借书信息);5.学生成绩管理(限1 人完成)(顺序或链式存储)包括:课程信息,学生信息等;能增加课程或学生。
实现功能:输入、输出、插入、删除、查找、显示、保存、排序、退出。
6.活期储蓄帐目管理(限1 人完成)活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求:1)能比较迅速地找到储户的帐户,以实现存款、取款记账;2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
数据结构课程设计-简单个人电话号码查询系统
中南大学二○一一~二○一二学年第二学期信息科学与工程学院课程设计报告书课程名称:简单个人电话号码查询系统班级:电子信息1001学号:zzz姓名:指导教师:李登曾志文设计时间:2012年6月18日~6月30日目录一、绪论 (3)1.1课程设计目的 (3)1.2 问题描述 (3)1.3基本要求 (3)二、数据结构的设计 (4)2.1需求分析 (4)2.2 概要设计 (4)2.3软件模块结构图 (4)2.4程序设计思想 (5)四、程序流程图 (5)4.1主函数流程图 (5)4.2 mainmenu()函数流程图 (6)五、详细设计 (9)5.1头文件,双链表,结构体的建立 (9)5.2主函数算法 (10)5.2.1.main()函数的算法 (10)5.22.mainmenu()函数算法 (10)5.2.3.searchmenu()函数算法 (11)5.2.4.创建新的通讯录enter()函数算法 (11)5.2.5.显示通讯录信息display()函数算法 (12)5.2.6.保存通讯录save()函数算法 (13)5.2.7.增加一个节点listinsert()函数算法 (13)5.2.8.建立头结点 (14)5.2.9.查找search()函数算法 (14)5.2.10.删除delete()函数算法 (15)5.2.11.打开文件load()函数算法 (16)六、调试分析及测试数据 (17)6.1显示菜单 (18)6.2新添记录 (18)6.3查找联系人 (18)6.3.1查找菜单的显示 (18)6.3.2显示所有 (19)6.3.3按姓名查找 (20)6.4删除联系人 (20)6.5保存退出 (21)6.6打开通讯录 (21)七、用户使用手册 (22)八、心得体会 (23)附录(源代码) (23)一、绪论1.1课程设计目的1.训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
800免费电话号码查询系统及其数据库与数据产品[发明专利]
专利名称:800免费电话号码查询系统及其数据库与数据产品专利类型:发明专利
发明人:周瑞
申请号:CN03129457.X
申请日:20030623
公开号:CN1489365A
公开日:
20040414
专利内容由知识产权出版社提供
摘要:800免费电话(Freephone)号码查询系统及其数据库与数据产品。
800业务在国际上被称为Freephone(免费电话)。
它最主要的特色是话费全由受话人支付,是企业向客户提供免费服务热线的主要方式,是极具现代营销理念的一项电信业务。
本发明提供了一种800免费电话号码查询系统以及为支持该系统的运行所建立的800电话号码数据库。
采用该系统,消费者可通过电话或电脑上网的方式方便快捷地查询到所需企业800号码,从而通过拨打800电话,咨询或购买所需产品或服务。
为便于800电话号码的传播,通过对该数据资源的编辑整理,还开发了“800电话(Freephone)号码光盘”与“800电话(Freephone)号码簿”等两种数据产品。
申请人:周瑞
地址:200237 上海市徐汇区华东理工大学华理苑58号101室
国籍:CN
更多信息请下载全文后查看。
哈希表实现电话号码查询系统
哈希表实现电话号码查询系统一目的利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C++语言进行程序设计,并规范地完成课程设计报告。
通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。
二需求分析1、程序的功能1)读取数据①读取原电话本存储的电话信息。
②读取系统随机新建电话本存储的电话信息。
2)查找信息①根据电话号码查询用户信息。
②根据姓名查询用户信息。
3)存储信息查询无记录的结果存入记录文档。
2、输出形式1)数据文件“”存放原始电话号码数据。
2)数据文件“”存放有系统随机生成的电话号码文件。
3)数据文件“”存放未查找到的电话信息。
4)查找到相关信息时显示姓名、地址、电话号码。
3、初步测试计划1)从数据文件“”中读入各项记录,或由系统随机产生各记录,并且把记录保存到“”中。
2)分别采用伪随机探测再散列法和再哈希法解决冲突。
3)根据姓名查找时显示给定姓名用户的记录。
4)根据电话号码查找时显示给定电话号码的用户记录。
5)将没有查找的结果保存到结果文件中。
6)系统以菜单界面工作,运行界面友好,演示程序以用户和计算机的对话方式进行。
三概要设计1、子函数功能int Collision_Random(int key,int i)Coiiision-random()Seach-by-name()Collision-rehash()Seach-by-phone()Outhash()输入姓名显示哈希表输入电话号码显示哈希表显示信息无此记录显示信息无此记录写入“out.txt”写入“out.txt”结束1212ame=name;ddress=address;intermediate_data[key].phone=phone;sign[key]='1';ame=name;intermediate_data[key].address=address;intermediate_data[key].phone=phone;sign[key]='1';}void Outfile(string name,int key)ame[0]));i++)cout<<intermediate_data[key].name[i];for(i=0;i<8;i++)cout<<" ";cout<<intermediate_data[key].phone;for(i=0;i<8;i++)cout<<" ";cout<<intermediate_data[key].address<<endl;}}void Rafile()ame!=name)){key=Collision_Random(key,i+1);j++;if(j=count)return -1;}return key;}int Search_by_phone(string phone)hone!=phone)) {key=Collision_Rehash(key,phone);j++;if(j=count)return-1;}return key;}void main(){count=0;sizeindex=50;int i,k;int ch;char *Fname;sign=new char[sizeindex];intermediate_data=new Data[sizeindex];for(i=0;i<sizeindex;i++)sign[i]='0';sign[i]='\0';for(i=0;i<sizeindex;i++){intermediate_data[i].name="";intermediate_data[i].phone="";intermediate_data[i].address="";}cout<<"§**********************************************************§"<<endl;cout<<"§* *§"<<endl;cout<<"§* 请选择用于查找的数据来源*§"<<endl;cout<<"§**§"<<endl;cout<<"§* 1 .*§"<<endl;cout<<"§* 2 . 随机生成*§"<<endl;cout<<"§* 0 . 退出程序*§"<<endl;cout<<"§**********************************************************§"<<endl;do{cout<<"\n"<< " 请输入选择 : \n";cin>>k;switch(k){case 0:return;case 1:Fname="";break;case 2:Rafile();Fname="";break;default:cout<<"输入序号有误,请重新输入!!!\n"<<endl;}}while((k!=1)&&(k!=2)&&(k!=0));根据姓名查找 *§"<<endl;cout<<"§* 2 . 根据电话号查找*§"<<endl;cout<<"§**§"<<endl;cout<<"§**********************************************************§"<<endl;do{cout<<"\n"<< " 请输入选择 : \n";cin>>ch;if(ch!=1&&ch!=2){cout<<" 输入序号有误,请重新输入!!!\n"<<endl;}}while((ch!=1)&&(ch!=2));输入姓名查找数据 *§"<<endl;cout<<"§* 2 . 显示哈希表*§"<<endl;cout<<"§* 0 . 退出程序!!! *§"<<endl;cout<<"§* *§"<<endl;cout<<"§**********************************************************§"<<endl;do{cout<<"\n"<< " 请输入选择 : \n";cin>>choice;switch(choice){case 1:{int key1;string name;cout<<"\n"<<" 请输入姓名: \n";cin>>name;key1=Search_by_name(name);Outfile(name,key1);cout<<"\n"<<"查找结果:\n"<<endl;Outhash(key1);}break;case 2:{cout<<"\n"<<" 哈希表: \n"<<endl;for(i=0;i<sizeindex;i++){if(sign[i]!='0'){cout<<"* ";Outhash(i);}}cout<<"* *"<<endl;}break;case 0:return;default:cout<<" 输入序号有误,请重新输入!!!\n"<<endl;}}while((choice!=1)&&(choice!=2)&&(choice!=0));}while(ch==2){int choice;cout<<"§**********************************************************§"<< endl;cout<<"§* *§"<<endl;cout<<"§* 请选择功能*§"<<endl;cout<<"§* 1 . 输入电话查找数据*§"<<endl;cout<<"§* 2 . 显示哈希表*§"<<endl;cout<<"§* 0 . 退出*§"<<endl;cout<<"§**§"<<endl;cout<<"§**********************************************************§"<<endl;do{cout<<"\n"<< " 请输入选择 : \n";cin>>choice;switch(choice){case 1:{int key2;string phone;do{cout<<"* 请输入11位的电话号码: ";cin>>phone;if(strlen(&phone[0])!=11){cout<<"\n"<<"电话号码输入不正确!请重新输入!!!\n"<<endl;}}while(strlen(&phone[0])!=11);key2=Search_by_phone(phone);Outfile(phone,key2);cout<<"\n"<<"查找结果:\n"<<endl;cout<<"* ";Outhash(key2);}break;case 2:{cout<<"\n"<<"哈希表:\n"<<endl;for(i=0;i<sizeindex;i++){if(sign[i]!='0'){cout<<"* ";Outhash(i);}}cout<<"* *"<<endl;}break;case 0:return;default:cout<<" 输入序号有误,请重新输入!!!\n"<<endl;}}while((choice!=1)&&(choice!=2)&&(choice!=0));}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录摘要 (1)前言 (2)正文 (3)1.采用类c语言定义相关的数据类型 (3)2.各模块的伪码算法 (3)3. 函数的调用关系图 (6)4. 调试分析 (7)5. 测试结果 (8)总结 (9)参考文献 (11)致谢 (12)附件1 部分源程序代码 (13)摘要在本设计实验中,我所采用的是散列列表作为电话号码查询结构,根据线性表、树、图的基本概念、逻辑结构、查询结构算法的应用,用不同的功能模块对电话号码信息进行编辑和查询。
电话号码的查询程序的目的是为人们提供各种信息查询服务:即查询客户的电话号码,依据电话号码查询客户信息等。
电话号码的查询时用散列列表实现的。
散列列表的设计与实现实现了用户的信息和电话号码的查询。
关键词:电话号码的查询,散列列表,散列列表的实现前言随着计算机科学的迅速发展,计算机已深入到人类社会的各个领域,它的应用已不再局限于科学计算,以解决一些数学问题,而且可以解决一些抽象化的具体问题,更多地用于控制,管理及数据处理等非数值计算的处理工作,这便为我们的日常生活提供了很多的方便。
我们在对一些问题进行求解时,会发现有些问题很难找到规律,或者根本无规律可寻。
对于这样的问题,可以利用计算机运算速度快的特点,先搜索查找所有可能出现的情况,再根据题目条件从所有可能的情况中,删除那些不符合条件的解。
电话号码的查询系统马祖了人们查询和储存电话号码的功能。
从而方便了人们查询电话号码。
从电话号码查询客户信息的功能。
正文1.采用类c语言定义相关的数据类型函数有:void getin(();//输入信息函数void ShowInformation();)//显示输入的用户信息void CreateHash1 ();//建表函数void SearchHash1 ();//查询函数void output();/*输出函数*/void main()/*主函数*/类有:#define MAXSIZE 20 //电话薄记录数量#define MAX_SIZE 20 //人名的最大长度#define HASHSIZE 53 //定义表长int Hash1(NA str){//散列函数2.各模块的伪码算法int Hash1(NA str){//散列函数long n;int m;n=fold(str);//先将用户名进行折叠处理m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造散列函数return m; //并返回模值}int Hash2(NA str){//散列函数long n;int m;n = atoi(str);//把字符串转换成整型数.m=n%HASHSIZE; //用除留余数法构造散列函数return m; //并返回模值}Status collision(int p,int &c){//冲突处理函数,采用二次探测再散列法解决冲突int i,q;i=c/2+1;while(i<HASHSIZE){if(c%2==0){c++;q=(p+i*i)%HASHSIZE;if(q>=0) return q;else i=c/2+1;}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0) return q;else i=c/2+1;}}return UNSUCCESS;}printf("\n建表完成!\n此散列表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);benGetTime();}1.函数的调用关系图3.调试分析a、调试中遇到的问题及对问题的解决方法遇到的问题:在调试时,有时会把值输错,导致超出范围,输出错误结果或程序直接结束。
或者有时候还会在错误的环境下运行。
解决方法:首先注意值的范围,输入在范围内的任意值。
其次注意运行环境,有中文的一定要在中文运行环境中进行。
b、算法的时间复杂度和空间复杂度时间复杂度O(n2)。
空间复杂度O(n2)4.测试结果总结通过这次数据结构的编程题目,使我对C语言有了更深的了解,明白了在C中数据的流动和转移方法。
从最初的不知道从何入手到最后编写程序的完成,虽然耗费了我们一定的时间跟精力,但同时我们也收获硕果累累,一方面使我对函数的运用有了更加深刻的了解,对面向对象语言更深层次的掌握和应用。
在初始编程的过程中,出现了许多的错误,但通过改正,借阅书本,对程序的运行方式有了进一步体会。
参考文献1 严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社.2 严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.3 《DATA STRUCTURE WITH C++》. William Ford,William Topp .清华大学出版社(影印版).4 谭浩强.《c语言程序设计》. 清华大学出版社.5.数据结构与算法分析(Java版) , A Practical Introduction to Data Structures and Algorithm Analysis Java Edition Clifford A. Shaffer , 张铭,刘晓丹译电子工业出版社 2001 年1月致谢在本次设计的过程中我遇到了很多困难,衷心的感谢卢鹏丽老师和同学在课设期间对我的辛勤指导和帮助,老师的引导与点拨使我在学习过程中少走了许多的弯路,而且增加了不少的经验,学会了许多课本上没有的东西,同学的帮助同样也让我进步了很多。
才使我在顺利完成设计项目的同时又加深了对数据结构这门学问的理解,并且发现了自己的不足。
许多同学也对我给予了许多帮助,向我推荐了一些好的书籍,它们给我提供了许多优秀的设计思路和简洁而精辟的算法,使我在整体设计的基础上得以完善各个模块的设计,从而设计了一个比较合理的道路查询程序,在这里一并致谢。
我还要感谢我所参考的那几本书的编者,它们对我的帮助也不小,总之我要对所有在这次课设中帮助过我的人说声谢谢!附件Ⅰ部分源程序代码#include<stdio.h>#include<stdlib.h>#include<string>#include <windows.h>#define MAXSIZE 20 //电话薄记录数量#define MAX_SIZE 20 //人名的最大长度#define HASHSIZE 53 //定义表长#define SUCCESS 1#define UNSUCCESS -1#define LEN sizeof(HashTable)typedef int Status;typedef char NA[MAX_SIZE];typedef struct{//记录NA name;NA tel;NA add;}Record;typedef struct{//散列表Record *elem[HASHSIZE]; //数据元素存储基址int count; //当前数据元素个数int size; //当前容量}HashTable;Status eq(NA x,NA y){//关键字比较,相等返回SUCCESS;否则返回UNSUCCESSif(strcmp(x,y)==0)return SUCCESS;else return UNSUCCESS;}Status NUM_BER; //记录的个数void getin(Record* a){//键盘输入各人的信息printf("输入要添加的个数:\n");scanf("%d",&NUM_BER);int i;for(i=0;i<NUM_BER;i++){printf("请输入第%d个记录的用户名:\n",i+1);scanf("%s",a[i].name);printf("请输入%d个记录的电话号码:\n",i+1);scanf("%s",a[i].tel);printf("请输入第%d个记录的地址:\n",i+1);scanf("%s",a[i].add); //gets(str2);??????}}void ShowInformation(Record* a)//显示输入的用户信息{int i;for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 电话号码:%s\n 联系地址:%s\n",i+1,a[i].name,a[i].tel,a[i].add);}void Cls(Record* a){printf("*");system("cls");}long fold(NA s){//人名的折叠处理char *p;long sum=0;NA ss;strcpy(ss,s);//复制字符串,不改变原字符串的大小写strupr(ss);//将字符串ss转换为大写形式p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}int Hash1(NA str){//散列函数long n;int m;n=fold(str);//先将用户名进行折叠处理m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造散列函数return m; //并返回模值}int Hash2(NA str){//散列函数long n;int m;n = atoi(str);//把字符串转换成整型数.m=n%HASHSIZE; //用除留余数法构造散列函数return m; //并返回模值}Status collision(int p,int &c){//冲突处理函数,采用二次探测再散列法解决冲突int i,q;i=c/2+1;while(i<HASHSIZE){if(c%2==0){c++;q=(p+i*i)%HASHSIZE;if(q>=0) return q;else i=c/2+1;}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0) return q;else i=c/2+1;}}return UNSUCCESS;}void benGetTime();void CreateHash1(HashTable* H,Record* a){//建表,以人的姓名为关键字,建立相应的散列表//若散列地址冲突,进行冲突处理benGetTime();int i,p=-1,c,pp;for(i=0;i<NUM_BER;i++){c=0;p=Hash1(a[i].name);pp=p;while(H->elem[pp]!=NULL) {pp=collision(p,c);if(pp<0){printf("第%d记录无法解决冲突",i+1);//需要显示冲突次数时输出continue;}//无法解决冲突,跳入下一循环}H->elem[pp]=&(a[i]); //求得散列地址,将信息存入H->count++;printf("第%d个记录冲突次数为%d。