哈希表实现电话号码查找系统
设计任务
设计哈希表实现电话号码查找系统
- 设每个记录有下列数据项:电话号码、用户名、地址
- 从键盘输入个记录,分别以电话号码和用户名为关键字建立不同的哈希表
- 采用线性探测再散列的方法解决冲突
- 查找并显示给定电话号码的记录
- 查找并显示给定用户名的记录
主要算法功能
主要4个功能:
- 创建链表
- 查询(通过名字/电话)
- 显示
- 退出
以下是简易流程图:
代码
为了让主代码main.c看起来更加清晰,我把功能函数集成在一个头文件中hash.h。
代码里用不大好的英文注释,能懂9行
main.c文件
#include"hash.h"int main()
{char s[20];int n,Fn;int num;//contact numberBridge head;//include namehash table and phonehash tablewhile(1){Menu();printf("Enter:");scanf("%d",&n);switch(n){case 1:printf("Enter number of contacts:");scanf("%d",&num);Fn=Fprime(num);//get next primehead=Create(num);//creat linkClean();break;case 2:Query(head,Fn);Clean();break;case 3:ShowAll(head,Fn);//print all contactsClean();break;case 4:printf("\nThank you for using my software!\n");return 0;}}
}
hash.h文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAXNUMBER 100000
typedef struct node
{char name[8];char phone[12];char adress[50];int state;struct node *next;
}contnode;
typedef struct
{contnode *Hn;//head node of namecontnode *Hp;//head node of phone
}Bridge;
void Menu()
{printf("\n----------Menu----------\n\n");printf(" 1.Create contacts\n");printf(" 2.Query contacts\n");printf(" 3.Show all contacts\n");printf(" 4.Exit\n");printf("------------------------\n");}
void Clean()//clear window
{printf("\nClear window? (Y/N)\t");getchar();//filter \nif(getchar()=='Y')system("cls");
}
void ShowAll(Bridge h,int n)//show all contacts
{contnode *p=h.Hp;printf("\nName\tPhone\t\tAdress");printf("\n--------------------------------------\n");while(n--){if(p->state==1)printf("%s\t%s\t%s\n",p->name,p->phone,p->adress); p=p->next;} }
int Fprime(int n)//find next prime
{int i,p=(n%2)?n+2:n+1;while(p<=MAXNUMBER){for(i=(int)sqrt(p);i>2;i--)if(!(p%i))break;if(i==2)break;else p+=2;} return p;
}
contnode* CreatTable(int num)//insert tail & init
{contnode *p,*q,*h;q=p=h=(contnode*)malloc(sizeof(contnode));h->state=0;while(num--){p=(contnode*)malloc(sizeof(contnode));strcpy(p->name,"\0");strcpy(p->adress,"\0");strcpy(p->phone,"\0");p->state=0;q->next=p;q=p;}p->next=NULL;free(p);free(q);return h;
}
int Ghashn(char *key,int num)//get hash name number
{unsigned int h=0;while(*key!='\0')h=(h<<5)+*key++;return h%num;
}
int Ghashp(char *key,int num)//get hash phone number
{int i;int sum=0;for(i=6;i<=10;i++)sum=sum*10+key[i]-'0';return sum%num;
}void HashTable(char *name,char *phone,char *adress,contnode *h,int flag,int size)//create table
{int seat;contnode *p=h;if(flag)seat=Ghashp(phone,size);elseseat=Ghashn(name,size);while(seat&&seat--)//Go to the designated locationp=p->next;while(p->state!=0)//Linear Probing(if state==1 ,find the next one){if(p->next==NULL){p=h;continue; } p=p->next;} strcpy(p->name,name);strcpy(p->adress,adress);strcpy(p->phone,phone); p->state=1;
}
void show(contnode *n)//print the contact
{printf("\nName\tPhone\t\tAdress");printf("\n--------------------------------------\n");printf("%s\t%s\t%s\n",n->name,n->phone,n->adress);
}void FindSeat(contnode *h,int size,int flag)//find seat of number
{char key[15];int seat,bseat,f=1;contnode *p=h;printf("\nEnter key:");scanf("%s",key);if(flag)seat=Ghashp(key,size);//find table number of phoneelse seat=Ghashn(key,size);//find table number of namebseat=seat;while(seat>0&&--seat)p=p->next;if(flag)while(strcmp(p->phone,key)!=0){if(p->next==NULL)//If to the end back to the head{f=1;p=h;}if(f)bseat++;if(bseat>=size)//If steps are larger than size return{printf("\nSorry,not found!\n");return;}p=p->next;}elsewhile(strcmp(p->name,key)!=0){if(p->next==NULL){f=1;p=h;}if(f)bseat++;if(bseat>=size){printf("\nSorry,not found!\n");return;}p=p->next;}show(p);//print node
}
Bridge Create(int num)
{int i;contnode *Hp,*Hn;Bridge h;char name[8],adress[20],phone[12];Hp=CreatTable(Fprime(num));//get head nodeHn=CreatTable(Fprime(num));for(i=0;i<num;i++){printf("\n%dst contact:",i+1);printf("\nEnter name:");scanf("%s",name);printf("Enter phone:");scanf("%s",phone);printf("Enter adress:");scanf("%s",adress);HashTable(name,phone,adress,Hn,0,Fprime(num));//create hashtable by nameHashTable(name,phone,adress,Hp,1,Fprime(num));//create hashtable by phone}h.Hn=Hn;h.Hp=Hp;return h;
}
void Query(Bridge head,int size)
{int n;printf("\n-------Choose way-------\n");printf("1.By Name\n");printf("2.By Phone\n"); printf("------------------------\n");printf("Enter:"); scanf("%d",&n);switch(n){case 1:FindSeat(head.Hn,size,0);break;case 2:FindSeat(head.Hp,size,1);break;}
}
哈希表实现电话号码查找系统相关推荐
- 哈希表实现电话号码查询系统(c++)
问题描述:设计哈希表实现电话号码查询系统,实现下列功能: (1) 假定每个记录有下列数据项:电话号码.用户名.地址. (2) 一是从数据文件old.txt(自己现行建好)中读入各项记录,二是由系统随机 ...
- 设计散列表实现通讯录查找系统_[源码和文档分享]利用哈希表实现电话号码查询系统...
第一章 需求分析 1.1 问题描述 设计一个电话号码查询系统,为来访的客⼈提供各种信息查询服务. 1.2 基本要求 设计每个记录有下列数据项:电话号码.用户名.地址 从键盘输入个记录,分别以电话号码和 ...
- 【Java Swing/散列表】散列表实现电话号码查找系统——问题汇总分享
说明:本文为我在做课设时遇到的问题汇总,解决方法多数来自网络,因深感到处搜索解决方法不易,所以做成汇总.因搜索时没有记录每个答案来源网站,如有侵权,请联系我.感谢无私分享的每一个人. 题目:设计散列表 ...
- C++利用双哈希表实现存储机制hash table的算法(附完整源码)
C++利用双哈希表实现存储机制的算法 C++利用双哈希表实现存储机制的算法完整源码(定义,实现,main函数测试) C++利用双哈希表实现存储机制的算法完整源码(定义,实现,main函数测试) #in ...
- c语言哈希表电子辞典_C语言实现的哈希表实现程序
下面我们一起来看一个C语言实现的哈希表实现程序了,这个程序没有过多的说明只是一个例子,大家有兴趣可以进入看看或测试一下. 为了巩固一下链表知识,自己实现的一个哈希表,在GCC 4.4.7下编译通过: ...
- 数据结构课设(散列表的设计与实现---电话号码查找系统)
一.要求: [问题描述] 设计散列表实现电话号码查找系统. [基本要求] 1) 设每个记录有下列数据项:电话号码.用户名.地址:2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表:3) ...
- C语言项目 电话查询系统 哈希表实现(项目要求 + 运行界面 + 代码分析 + 完整代码)
电话查询系统 1. 项目要求 2. 数据样例 3. 运行界面 4. 代码分析 5. 完整代码 6. 项目报告 关注博主不迷路,博主带你码代码! 1. 项目要求 设每个记录有以下数据项:用户名.电话.地 ...
- 哈希表实现通讯录的设计与实现
[实验目的] 为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的电话与地址.设计哈希表存储,设计并实现通讯录查找系统. [实验要求] (1)每个员工记录有下列数据项:电话号码.用户名.地址 ...
- 数据结构课程设计-利用散列表做一个电话号码查找系统
[基本要求] (1)设每个记录有下列数据项:电话号码.用户名.地址: (2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表: (3)采用一定的方法解决冲突: (4)查找并显示给定电话号码的 ...
- 巧用哈希表实现随机操作
题目描述 这是 LeetCode 上的 380. O(1) 时间插入.删除和获取随机元素 ,难度为 中等. Tag : 「数据结构」.「哈希表」 实现 RandomizedSet 类: Randomi ...
最新文章
- PHP获取当前时间差8小时的问题
- 面试必过之Mongdodb数据库面试题总结大全!
- 2020年PHP中级面试知识点及答案
- python runner是什么_HttpRunner-01-初识
- ANSYS——对称模型对称边界的确定以及对称边界的约束施加问题
- HTML判断如果并且,将html转换为js,并且其中含有判断语句
- 基于AWT、Swing的GUI程序 - 改变观感
- E-Prime 软件中常用的 inline 语句
- seaborn无法下载数据的问题
- 创建Maven时生成的properties标签内容解释
- PHP折算,PHP实现货币换算的方法
- winpe装双系统linux_在Winpe下安装Ubuntu
- nmos导通流向_MOS管知识详细说明!结构,原理,技术参数详解,一定要进来看下...
- 别再问我2020年Android前景如何了,我都回答腻了…
- 深度学习(十三) Adversarial Attack 理论部分
- 浅谈Flink对象重用(object reuse)
- 苹果Mac电脑 如何设置Outlook企业邮箱
- 青龙面板 Bot配置教程
- JavaScript编程技术基础
- 鸿蒙系统安全模式,华为鸿蒙OS上线!开源开放毫无保留,这一友商早已用上鸿蒙同款系统...