电话号码查找系统
- 格式:doc
- 大小:252.00 KB
- 文档页数:29
数据结构课程设计题目1.飞机订票系统(限1 人完成)(顺序或链式存储)任务:通过此系统可以实现如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:当航班信息改变可以修改航班数据文件要求:根据以上功能说明,设计航班信息,订票信息,客户信息的存储结构,设计程序完成功能;2.宿舍管理查询软件(限1 人完成)任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:采用交互工作方式建立数据文件,包括学生信息、宿舍信息、住宿信息,学生信息按关键字(姓名、学号)进行排序(排序方法自选,不能相同);查询: (用二分查找实现以下操作)按姓名查询按学号查询(用顺序查找实现以下操作)按房号查询3.校园导航问题(限1 人完成)设计要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
要求:能增加场所4.图书借阅管理系统(限1 人完成)(顺序或链式存储)主要分为两大功能:1)图书管理(增加图书、查询图书、删除图书、图书借阅、还书);2)会员管理(增加会员、查询会员、删除会员、借书信息);5.学生成绩管理(限1 人完成)(顺序或链式存储)包括:课程信息,学生信息等;能增加课程或学生。
实现功能:输入、输出、插入、删除、查找、显示、保存、排序、退出。
6.活期储蓄帐目管理(限1 人完成)活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求:1)能比较迅速地找到储户的帐户,以实现存款、取款记账;2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
摘要系统主要功能包括:实现添加联系人的姓名和手机号码家庭电话号码和办公号码,并且连接进数据库,将信息储存进数据库文件中去,添加成功弹出添加成功的对话框,对话框中的信息可以重置。
消息对话框负责显示消息,调用其静态方法显示警告信息。
要求在文本框中显示姓名,手机号码,家庭电话,办公电话等用户信息。
添加姓名,手机号码,家庭电话,办公电话等信息到数据库中,同样需要连接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程序设计》课程设计报告四、课程设计原始记录(数据、图表、计算等)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)前言 (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。