当前位置:文档之家› 哈希表的设计与实现

哈希表的设计与实现

洛阳理工学院课程设计报告课程名称数据结构课程设计设计题目哈希表的设计与实现专课程设计任务书设计题目:哈希表的设计与实现_________________________________ _________________________________________________________ 设计内容与要求:内容:1、设每个记录有下列数据项:电话号码、用户名、地址;2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;3、采用再哈希法解决冲突;4、查找并显示给定电话号码的记录;5、查找并显示给定用户名的记录。

6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至少两种),考察平均查找长度的变化。

课程设计评语成绩:指导教师:_______________年月日目录一.问题描述 (2)二.基本要求 (2)三.数据结构 (2)四.总体设计 (2)五.详细设计 (3)5.1录入功能 void lurugongneng() (3)5.2查询功能 void chaxungongnen() (3)5.3订票功能 void dingpiaogongnen() (4)5.4退票功能 void tuipiaogongnen() (4)5.5修改功能 void xiugaigongnen()................ 错误!未定义书签。

六.测试与调试. (4)6.1 程序的模块 (4)6.2 程序的调试 (4)6.3 测试结果 (5)七.源程序清单 (6)一.问题描述通过此系统可以实现如下功能:录入:可以录入通讯录情况查询:查询通讯录内的所有人插入:在通讯录内插入后来自己想要的人的信息删除:删除自己需要删除的信息修改:修改通讯录内的个人信息二.基本要求根据以上功能说明,设计哈希表通讯录的存储结构,设计程序完成功能。

三.数据结构int key; // 定义两个关键字为全局变量int key2;int *p;struct node{//建立节点,每个节点包括用户姓名,地址电话号码,以及指向下一个节点的指针 char name[8],address[20];char num[11];node *next;};四.总体设计五.详细设计5.1录入功能 void add()通过调用hash()和hasg2()函数录入个人信息,输入的航线信息包括姓名,地址,电话号码。

5 .2查询功能 void display()查询分为按目的地查询和按航班号查询,通过void display()函数调用search_name()//通过姓名查询函数和void search_num()//通过电话查询函数。

通过n控制功能选择,若找到,则输出该信息,否则提示用户没找到,退出。

5.3添加功能 void add()调用add()函数用来将需要插入的信息,插入到哈希表中,调用hash()函数将信息进行哈希排序。

并存储起来。

5.4删除功能 void create()调用create()函数,重新建议一个哈希表,覆盖掉以前的哈希表,就删除了以前建立的哈希表。

六.测试与调试6.1 程序的模块录入功能:原始数据的输入。

查询功能:根据客户需要,查询相关信息。

删除功能:根据客户的不同情况,删除信息。

退出功能:退出系统。

6.2 程序的调试(1)程序在起初的时候,在建立数据结构的时候有了一些困难,在查询了书之后,我建立了数据结构函数定义的数据类型出现了问题,对函数的定义不清楚,字符的不正确定义造成了后期大量的纠错工作(2)在写程序的时候忘记了一些c语言的语言规范,导致程序中出现了许多低级的错误(3)测试用例具有一定的广泛性。

运行程序时输入了多种不同字符信息,经过多次修改结果达到了预期效果,说明程序具有一定的可靠性和稳定性。

6.3 测试结果图 6-1 录入功能图 6-2 通过姓名查询图 6-3 通过电话查询图 6-5 删除功能七.源程序清单#include<string.h>#include<stdio.h>#include<stdlib.h>int key; // 定义两个关键字为全局变量int key2;int *p;struct node{//建立节点,每个节点包括用户姓名,地址电话号码,以及指向下一个节点的指针 char name[8];char address[20];char num[11];node *next;};typedef node* pnode;typedef node* mingzi;node **phone;//二级指针node **nam;void hash(char num[11]){//哈希函数,以电话号码为关键字建立哈希表int i=3;key=(int)num[2];while(num[i] != NULL){key+=(int)num[i];i++;}key = key % 20;}void hash2(char name[8]){//哈希函数以用户名为关键字建立哈希表//利用强制类型转换,将用户名的每一个字母的asc2码值相加并除以后的余数int i =1;key2 = (int)name[0];while(name[i] != NULL){key2+=(int)name[i];i++;}key2=key2%20;}node *input(){//输入节点信息,建立节点,并将节点的next指空node* temp;temp = new node;temp->next = NULL;printf("请输入姓名\n");scanf("%s",temp->name);printf("请输入地址");scanf("%s",temp->address);printf("请输入电话");scanf("%s",temp->num);return temp; // 返回指针类型}int add(){//添加节点node *newphone;node *newname;newphone=input();newname=newphone;hash(newphone->num); // 利用哈希函数计算出对应关键字的存储位置 hash2(newname->name);newphone->next=phone[key]->next; // 利用电话号码为关键字插入 phone[key]->next=newphone;newname->next=nam[key2]->next;nam[key2]->next=newname;return 0;}void create(){//新建节点phone= new pnode[20];for(int i= 0;i<20;i++){phone[i]=new node;phone[i]->next=NULL;}}void create2(){int i;nam = new mingzi[20];for(i=0;i<20;i++){nam[i]=new node;nam[i]->next=NULL;}}void display(){int i;node *p=NULL;for(int i=0;i<20;i++){p=nam[i]->next;while(p){printf("%s_%s_%s\n",p->name,p->address,p->num); p=p->next;}}}void search_num(char num[]){//在以电话号码为关键字的哈希表中查找用户信息hash(num);node *q=phone[key]->next;while(q != NULL){if(strcmp(num,q->num) == 0)break;q = q->next;}if(q)printf("%s_%s_%s\n",q->name,q->address,q->num);elseprintf("无此记录\n ");}void search_name(char name[8]){//以用户名为关键字在哈希表中查找用户hash2(name);node *q=nam[key2]->next;while(q!=NULL){if(strcmp(name,q->name)==0)break;q=q->next;}if(q){printf("%s_%s_%s\n",q->name,q->address,q->num);}elseprintf("无此记录\n");}void menu(){//菜单printf("----------------------------------------------\n"); printf("---------------------------菜单如下,请输入选择----------------\n");printf("---0添加记录\n");printf("---1查询记录\n");printf("---2显示记录\n");printf("---3清空记录\n");printf("---4退出系统\n");}int main(){char num[11]; //定义类型char name[8];create(); //开始创建函数create2();int sel ;while(1){menu();scanf("%d",&sel); //输入选择switch(sel){case 1:{system("cls");printf("6号码查询,姓名查询\n");int b;scanf("%d",&b);if(b==6){//按照号码查询printf("请输入电话号码");scanf("%s",num);printf("输出查找的信息");search_num(num);}else{printf("请输入姓名\n");scanf("%s",name);printf("输出查找的信息\n"); search_name(name);}}break;case 2:{//显示记录的所有信息system("cls");printf("显示结果\n");display();} break;case 0:{//添加记录system("cls");printf("请输入要添加的内容");add();}break;case 3:{system("cls");printf("列表已经清空");create();//重新创建函数create2();}break;default :return 0; //否则退出}}return 0;}。

相关主题