哈希表制作通讯录 数据结构程序设计
数据结构哈希表设计
数据结构哈希表设计数据结构哈希表设计⒈简介哈希表是一种常见的数据结构,用于存储和查找数据。
它基于哈希函数将键映射到一个固定大小的数组索引。
在本文档中,我们将详细介绍哈希表的设计、实现和使用。
⒉哈希函数设计哈希函数是哈希表的核心,它将键转换成对应的数组索引。
以下是一些常见的哈希函数设计方法:●直接定址法:使用键的某个属性作为数组索引,例如将键的ASCII码值作为数组索引。
●除留余数法:将键除以某个数并取余,得到的余数作为数组索引。
●平方取中法:将键的平方值的中间几位数作为数组索引。
●折叠法:将键分成几个部分,然后将这些部分进行叠加或者异或操作,得到的结果作为数组索引。
⒊哈希表实现哈希表实际上是一个数组,数组的每个元素称为桶(bucket)每个桶可以存储一个键值对,或者一个链表/数组用于解决哈希冲突。
以下是哈希表的基本操作:●插入(Insert):根据键的哈希值找到对应的桶,插入键值对。
●查找(Search):根据键的哈希值找到对应的桶,查找键对应的值。
●删除(Delete):根据键的哈希值找到对应的桶,删除键值对。
⒋哈希冲突解决哈希函数的设计不能保证每个键都映射到不同的索引,因此可能会出现哈希冲突。
常见的解决哈希冲突的方法有以下几种:●链地质法:每个桶存储一个链表或者数组,具有相同哈希值的键值对存储在同一个桶中。
●开放地质法:当发生冲突时,继续探测数组中的下一个位置,直到找到一个空闲位置来存储键值对。
●再哈希法:使用多个哈希函数,当发生冲突时,使用下一个哈希函数来计算下一个索引。
⒌哈希表性能分析哈希表的性能与哈希函数的设计和冲突解决方法有关。
以下是一些常见的性能指标:●负载因子(Load Factor):表示哈希表中已经存储的键值对数量与桶的总数量之比。
负载因子越大,哈希冲突的可能性越高。
●查找时间复杂度:理想情况下,哈希表的查找时间复杂度为O(1)但在发生哈希冲突时,可能需要遍历链表或者进行探测,导致查找时间复杂度增加。
数据结构课程设计--哈希表实验报告
福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级:xxxxxx班座号:xxxxxxxxxxxx姓名:xxxxxxx2011年12 月31 日实验题目:哈希表一、要解决的问题针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。
以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。
基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。
完成按姓名查询的操作。
运行的环境:Microsoft Visual C++ 6.0二、算法基本思想描述设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。
建立哈希表并且将其显示出来。
通过要查找的关键字用哈希函数计算出相应的地址来查找人名。
通过循环语句调用数组中保存的数据来显示哈希表。
三、设计1、数据结构的设计和说明(1)结构体的定义typedef struct //记录{NA name;NA xuehao;NA tel;}Record;录入信息结构体的定义,包含姓名,学号,电话号码。
typedef struct //哈希表{Record *elem[HASHSIZE]; //数据元素存储基址int count; //当前数据元素个数int size; //当前容量}HashTable;哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。
2、关键算法的设计(1)姓名的折叠处理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;}(2)建立哈希表1、用除留余数法构建哈希函数2、用线性探测再散列法处理冲突int Hash1(NA str) //哈希函数{long n;int m;n=fold(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();}else printf("\n此人不存在,查找不成功!\n");benGetTime();}(4)显示哈希表void ShowInformation(Record* a) //显示输入的用户信息{int i;system("cls");for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 学号:%s\n 电话号码:%s\n",i+1,a[i].name,a[i].xuehao,a[i].tel);}(5)主函数的设计void main(int argc, char* argv[]){Record a[MAXSIZE];int c,flag=1,i=0;HashTable *H;H=(HashTable*)malloc(LEN);for(i=0;i<HASHSIZE;i++){H->elem[i]=NULL;H->size=HASHSIZE;H->count=0;}while (1){ int num;printf("\n ");printf("\n 欢迎使用同学通讯录录入查找系统");printf("\n 哈希表的设计与实现");printf("\n 【1】. 添加用户信息");printf("\n 【2】. 读取所有用户信息");printf("\n 【3】. 以姓名建立哈希表(再哈希法解决冲突) ");printf("\n 【4】. 以电话号码建立哈希表(再哈希法解决冲突) ");printf("\n 【5】. 查找并显示给定用户名的记录");printf("\n 【6】. 查找并显示给定电话号码的记录");printf("\n 【7】. 清屏");printf("\n 【8】. 保存");printf("\n 【9】. 退出程序");printf("\n 温馨提示:");printf("\n Ⅰ.进行5操作前请先输出3 ");printf("\n Ⅱ.进行6操作前请先输出4 ");printf("\n");printf("请输入一个任务选项>>>");printf("\n");scanf("%d",&num);switch(num){case 1:getin(a);break;case 2:ShowInformation(a);break;case 3:CreateHash1(H,a); /* 以姓名建立哈希表*/break;case 4:CreateHash2(H,a); /* 以电话号码建立哈希表*/break;case 5:c=0;SearchHash1(H,c);break;case 6:c=0;SearchHash2(H,c);break;case 7:Cls(a);break;case 8:Save();break;case 9:return 0;break;default:printf("你输错了,请重新输入!");printf("\n");}}system("pause");return 0;3、模块结构图及各模块的功能:四、源程序清单:#include<stdio.h>#include<stdlib.h>#include<string.h>#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 xuehao;NA tel;}Record;typedef struct {Record *elem[HASHSIZE]; int count; int size; }HashTable;Status eq(NA x,NA y) {if(strcmp(x,y)==0)return SUCCESS;else return UNSUCCESS;}Status NUM_BER;void getin(Record* a) {int i;system("cls");printf("输入要添加的个数:\n");scanf("%d",&NUM_BER);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].xuehao);printf("请输入第%d个记录的电话号码:\n",i+1);scanf("%s",a[i].tel);}}void ShowInformation(Record* a){int i;system("cls");for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 学号:%s\n 电话号码:%s\n",i+1,a[i].name,a[i].xuehao,a[i].tel);}void Cls(Record* a){printf("*");system("cls");}long fold(NA s){char *p;long sum=0;NA ss;strcpy(ss,s);strupr(ss);p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}int Hash1(NA str){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){ int i,p=-1,c,pp;system("cls"); benGetTime();for(i=0;i<NUM_BER;i++){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。
通讯录的制作数据结构课程设计
通讯录的制作数据结构课程设计一、引言随着互联网和移动设备的普及,通讯录的重要性日益凸显。
通讯录不仅是一个人与人之间联系的桥梁,也是个人和组织之间沟通的纽带。
在数据结构课程设计中,我们将探讨如何制作一个高效、易用且具备良好扩展性的通讯录。
二、通讯录的需求分析在设计通讯录时,我们需要考虑以下需求: 1. 支持添加、删除、修改联系人信息的功能; 2. 支持按姓名、电话号码等属性进行搜索的功能; 3. 支持导入、导出通讯录的功能; 4. 支持多用户共享的功能; 5. 支持通讯录的快速访问和响应;6. 支持对联系人信息进行分类和标记的功能。
三、通讯录的数据结构设计为了满足上述需求,我们需要设计一个合适的数据结构来存储通讯录信息。
一种常见的数据结构是哈希表(Hash Table)。
哈希表可以通过将联系人的属性(如姓名、电话号码)进行哈希运算,将其转换为一个唯一的索引,从而实现快速的插入、搜索和删除操作。
3.1 哈希函数的选择在设计哈希表时,选择合适的哈希函数十分关键。
一个好的哈希函数应具备以下特点: - 均匀性:能够将联系人的属性均匀地映射到哈希表的槽位上,避免出现冲突; - 快速性:计算哈希值的过程应尽量简单、高效; - 低冲突率:尽可能避免多个联系人映射到同一个槽位的情况。
3.2 哈希表的实现我们可以使用数组来表示哈希表的槽位,每个槽位存储一个链表。
链表的节点包含联系人的信息。
当发生冲突时,我们可以使用链表来解决。
3.3 哈希表的性能分析哈希表在理想情况下可以达到常数级的时间复杂度,但在最坏情况下可能会退化为线性时间复杂度。
为了降低冲突率,我们可以使用一些解决冲突的技术,如链地址法、开放地址法等。
四、通讯录的功能实现在通讯录中,我们需要实现添加、删除、修改联系人信息的功能,以及按属性进行搜索等功能。
4.1 添加联系人当用户需要添加一个联系人时,我们首先需要计算联系人的哈希值,并找到对应的槽位。
然后将联系人的信息插入到链表的头部。
数据结构课程设计通讯录查询系统的设计与实现
数据结构课程设计通讯录查询系统的设计与实现一、需求分析1、问题描述为某个单位建立一个员工通讯录管理系统,能够方便查询每一个员工的电话与地址。
设计散列表存储,设计并实现通讯录查找系统。
2、基本要求a.每个记录有下列数据项:电话号码、用户名、地址;b.从键盘输入各记录,分别以电话号码为关键字建立散列表;c.采用二次探测再散列法解决冲突;d.查找并显示给定电话号码的记录;e.通讯录信息文件保存。
二、概要设计1.数据结构本程序需要用到两个结构体,分别为通讯录 message以及哈希表HxList2.程序模块本程序包含两个模块,一个是实现功能的函数的模块,另一个是主函数模块。
系统子程序及功能设计本系统共有三个子程序,分别是:int Hx(long long key,int data)//哈希函数void BulidHx(HxList &L)//建立通讯录int Search(HxList &L)//查找3. 各模块之间的调用关系以及算法设计主函数调用BulidHx以及Search函数。
函数BulidHx调用函数Hx。
三、详细设计1.数据类型定义typedef struct{char *name;char *add;long long phonenumber;}message;typedef struct{message *list;int number;//记录数}HxList;2.系统主要子程序详细设计a. 建立通讯录void BulidHx(HxList &L)//建立通讯录{FILE *f = fopen("E:\\tongxunlu.txt", "w");char buf[20]={0},str[20]={0};long long key;cout<<"输入要建立的记录数:";cin>>L.number;L.number+=1;L.list=new message[L.number];//分配哈希表的存储空间for(int i=0;i<L.number;i++){L.list[i].phonenumber=-1;}L.list[L.number-1].name=NULL;L.list[L.number-1].add=NULL;cout<<"输入记录信息(电话号码用户名地址)"<<endl;for(int i=0;i<L.number-1;i++){cin>>key>>buf>>str;int pose=Hx(key,L.number);//获取理论上的存储位置if(L.list[pose].phonenumber==-1){}else{//用二次探测再散列法解决冲突//1^2 -1^2 2^2 -2^2int di,count=1;xunhuan: if(count%2==0)di=-(count/2)*(count/2);elsedi=((count/2)+1)*((count/2)+1);int site=Hx(key+di,L.number);if(site>=0){if(L.list[site].phonenumber==-1){pose=site;}else{count++;goto xunhuan;}}else{site=L.number-abs(site);if(L.list[site].phonenumber==-1){pose=site;}else{count++;goto xunhuan;}}}L.list[pose].phonenumber=key;fprintf(f,"%lld",key);fprintf(f," ");L.list[pose].name=new char[strlen(buf)+1];strcpy(L.list[pose].name,buf);fprintf(f,"%s",buf);fprintf(f," ");L.list[pose].add=new char[strlen(str)+1];strcpy(L.list[pose].add,str);fprintf(f,"%s",str);fprintf(f,"\n");}}b.查找int Search(HxList &L)//查找{long long key;cout<<"输入要查找记录的关键字(电话号码):";cin>>key;int pose=Hx(key,L.number);//计算理论上的位置if(L.list[pose].phonenumber==key){}else{int count=1,di;//二次探测再散列,查找xunhuan: if(count%2==0){di=-(count/2)*(count/2);}else{di=((count/2)+1)*((count/2)+1);}int site=Hx(key+di,L.number);if(site>=0){if(L.list[site].phonenumber==key){pose=site;}else{count++;if(L.list[site].phonenumber==-1){cout<<"没有找到"<<endl; return -1;//没有找到}goto xunhuan;}}else{site=L.number-abs(site);if(L.list[site].phonenumber==key){pose=site;}else{count++;if(L.list[site].phonenumber==-1){cout<<"没有找到"<<endl;return -1;//没有找到}goto xunhuan;}}}if(L.list[pose].phonenumber==key){cout<<"电话号码\t"<<"用户名\t"<<"地址"<<endl;cout<<L.list[pose].phonenumber<<"\t"<<L.list[pose].name<< "\t"<<L.list[pose].add<<endl;return pose;}}四、测试与分析1.显示主菜单,运行程序能够显示出如下界面。
数据结构课程设计通讯录管理系统
数据结构课程设计通讯录管理系统
数据结构课程设计中的通讯录管理系统可以涉及到以下几个方面的知识点:
1. 数据结构:通讯录管理系统中需要使用到的数据结构包括数组、链表、哈希表等。
其中,数组用于存储通讯录中的人员信息,链表用于存储联系人信息,哈希表用于实现快速查找功能。
2. 算法:通讯录管理系统中需要使用到的算法包括查找算法、排序算法、动态规划算法等。
其中,查找算法用于实现快速查找联系人功能,排序算法用于实现通讯录的排序功能,动态规划算法用于实现最长公共子序列问题等。
3. 数据库:通讯录管理系统需要使用到数据库来存储通讯录中的数据。
需要掌握关系型数据库的设计和操作,包括数据表的设计、SQL 语句的编写等。
4. 界面设计:通讯录管理系统需要有友好的用户界面,需要进行界面设计和开发,包括前端技术的使用,如HTML、CSS和JavaScript等。
5. 系统测试:通讯录管理系统需要进行系统测试,包括功能测试、性
能测试等,确保系统能够正常运行并满足用户需求。
通过设计和实现通讯录管理系统,可以锻炼学生对数据结构和算法的理解和应用能力,同时还能提高学生的编程能力和团队合作能力。
数据结构课程设计通讯录管理系统
数据结构课程设计通讯录管理系统一、系统需求分析通讯录管理系统的主要目标是提供一个方便、高效的方式来管理联系人信息。
具体需求包括:1、能够添加联系人,包括姓名、电话号码、电子邮件、地址等基本信息。
2、可以对联系人信息进行修改和删除操作。
3、支持按照姓名、电话号码等关键字进行快速查找。
4、能够以列表形式展示所有联系人的信息。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储联系人信息。
考虑到联系人信息的多样性和动态性,链表是一个不错的选择。
链表可以方便地进行插入、删除和修改操作,并且能够灵活地调整存储空间。
另外,为了提高查找效率,我们可以结合使用哈希表。
通过将联系人的关键信息(如姓名或电话号码)进行哈希运算,快速定位到对应的联系人节点。
三、系统功能实现1、添加联系人功能当用户选择添加联系人时,系统会提示用户输入联系人的各项信息。
这些信息被封装成一个结构体,并通过链表的插入操作添加到链表中。
同时,将关键信息映射到哈希表中,以便后续快速查找。
2、修改联系人功能用户输入要修改的联系人的关键字,系统通过哈希表快速找到对应的联系人节点。
然后,提示用户输入修改后的信息,并更新链表和哈希表中的数据。
3、删除联系人功能与修改功能类似,通过关键字找到联系人节点,从链表和哈希表中删除相应的节点和信息。
4、查找联系人功能用户输入查找关键字,系统通过哈希表进行快速定位,如果找到匹配的联系人,则显示其详细信息。
5、展示所有联系人功能遍历链表,将所有联系人的信息以列表形式输出到屏幕上。
四、系统界面设计为了提高用户体验,系统设计了简洁直观的界面。
主界面提供了添加、修改、删除、查找和展示所有联系人等功能选项。
用户通过选择相应的选项,进入对应的操作流程。
五、代码实现示例以下是部分关键代码的示例:```c//联系人结构体typedef struct Contact {char name50;char phoneNumber20;char email50;char address100;struct Contact next;} Contact;//哈希表节点结构体typedef struct HashNode {char key50;Contact contact;struct HashNode next;} HashNode;//链表插入联系人void insertContact(Contact head, Contact newContact) {newContact>next = head;head = newContact;}//哈希函数unsigned int hashFunction(const char key) {unsigned int hash = 0;while (key) {hash =(hash << 5) + key++;}return hash % HASH_TABLE_SIZE;}//查找联系人Contact findContact(Contact head, const char key, HashNode hashTable) {unsigned int hashValue = hashFunction(key);HashNode node = hashTablehashValue;while (node) {if (strcmp(node>key, key) == 0) {return node>contact;}node = node>next;}Contact current = head;while (current) {if (strcmp(current>name, key) == 0 ||strcmp(current>phoneNumber, key) == 0) {//更新哈希表HashNode newNode =(HashNode )malloc(sizeof(HashNode));strcpy(newNode>key, key);newNode>contact = current;newNode>next = hashTablehashValue;hashTablehashValue = newNode;return current;}current = current>next;}return NULL;}```六、系统测试在完成系统的开发后,需要进行全面的测试以确保系统的稳定性和可靠性。
数据结构哈希表设计
数据结构哈希表设计数据结构哈希表设计====================章节一:引言---------------------在计算机科学中,哈希表(Hash Table)是一种用于实现关联数组(Associative Array)或映射(Map)的数据结构。
哈希表通过使用哈希函数将键(Key)映射到存储位置(数组索引)来实现快速的插入、删除和查找操作。
本文将详细介绍哈希表的设计原理和实现方法。
章节二:哈希函数---------------------哈希函数是哈希表的核心,它将任意大小的输入映射为固定大小的输出,通常是一个整数。
好的哈希函数应该具有以下特性:1.一致性:对于相同的输入,始终返回相同的输出。
2.均匀性:哈希函数应将输入均匀地映射到输出范围内。
3.支持快速计算:哈希函数应该能够在常数时间内计算出哈希值。
章节三:哈希冲突解决方法------------------------由于哈希函数的输出空间通常较小,不同的键可能会被映射到相同的存储位置上,这就导致了哈希冲突。
在实际应用中,哈希冲突是不可避免的。
为了解决哈希冲突,常用的方法有以下几种:1.法(Chning):将冲突的键值对存储在同一个链表中,在插入和查找时顺序遍历链表即可。
2.开放地质法(Open Addressing):将冲突的键值对存储在哈希表中的其他位置,通过一定的规则(如线性探测、二次探测等)查找下一个可用的位置。
3.建立更好的哈希函数:合适的哈希函数能够尽量减少冲突的概率。
章节四:哈希表的实现--------------------在实现哈希表时,我们需要考虑以下几个重要的方面:1.哈希函数的选择:选择合适的哈希函数是保证哈希表性能的关键。
不同的键类型可能需要不同的哈希函数。
2.存储结构的选择:可以使用数组、链表、红黑树等数据结构来存储哈希表中的键值对。
3.动态扩容:当哈希表中的数据量增加时,需要及时进行扩容操作,以保证哈希表的性能。
数据结构哈希表设计
数据结构哈希表设计在计算机科学领域中,数据结构是我们组织和存储数据的方式,而哈希表则是其中一种非常重要和高效的数据结构。
哈希表能够在平均情况下以接近常量的时间复杂度完成数据的插入、查找和删除操作,这使得它在许多应用场景中都大显身手。
要理解哈希表,首先得明白“哈希”这个概念。
简单来说,哈希就是把一个任意长度的输入通过某种规则变换成一个固定长度的输出。
这个输出通常被称为哈希值或者哈希码。
那么哈希表是怎么工作的呢?我们先有一个固定大小的数组,然后通过一个哈希函数将需要存储的数据的关键值转换为数组的索引。
比如说,我们要存储一组学生的姓名和他们的成绩,学生的姓名就是关键值。
通过哈希函数计算出姓名对应的哈希值,这个哈希值就决定了数据在数组中的存储位置。
但是这里有一个问题,如果不同的关键值通过哈希函数计算出来的哈希值相同,那该怎么办呢?这种情况被称为哈希冲突。
为了解决哈希冲突,有几种常见的方法。
一种是开放寻址法。
当发生冲突时,我们按照一定的规则在数组中寻找下一个空闲的位置来存储数据。
比如说线性探测,就是从发生冲突的位置开始,依次往后查找空闲的位置。
另一种是链地址法。
在数组的每个位置上,不是直接存储数据,而是存储一个链表。
当发生冲突时,新的数据就添加到对应位置的链表中。
在设计哈希表时,哈希函数的选择至关重要。
一个好的哈希函数应该能够尽量均匀地将关键值映射到数组的不同位置,减少冲突的发生。
常见的哈希函数有直接定址法、除留余数法、数字分析法等等。
直接定址法就是直接取关键值的某个部分或者全部作为哈希值。
除留余数法是用关键值除以一个数,然后取余数作为哈希值。
数字分析法则是通过分析关键值的数字分布特征来设计哈希函数。
除了哈希函数,哈希表的负载因子也是一个重要的概念。
负载因子是指已经存储的数据个数与数组大小的比值。
当负载因子过大时,冲突的概率会增加,从而影响哈希表的性能。
因此,当负载因子超过一定的阈值时,我们需要对哈希表进行扩容,重新分配数据的存储位置。
通讯录制作(数据结构课程设计)
line *temp=p;
line *del=temp->next;
temp->next=temp->next->next;
free(del);
printf("删除成功\n"); return p;
}
//指定名字删除
int select_name(line *p,char *name)
if (t->elem==elem){
return i;
}
i++;
}
//程序执行至此处,表示查找失败
return -1;
}
三、课程设计中遇到的难点及解决办法问题:对数据进行增删改查后,如何将改变的数据同步到文件? 解决方法:在退出函数前面设置一个保存文件的函数,这样无论数据发生怎样的变化, 都会在结尾时,随着退出函数的实现而实现。
while(temp->next)
{if(strcmp(temp->name,name)==0)
{
printf("请对该账号进行重新修改\n");
scanf("%s %s",&temp->name,&temp->cell_number);
printf("修改成功!\n");
}
temp=temp->next;
算法实现:
//p为原链表,elem表示被查找元素、
int selectElem(link * p,int elem){
//新建一个指针t,初始化为头指针p
link * t=p;
int i=1;
//由于头节点的存在,因此while中的判断为t->next
通讯录的制作数据结构课程设计
通讯录的制作数据结构课程设计
在通讯录的制作数据结构课程设计中,我们将使用链表作为主要的数据结构来存储联系人的信息。
链表是一种动态数据结构,它可以根据实际需要动态地分配和释放内存,非常适合用来存储不定数量的联系人信息。
首先,我们需要设计一个联系人的结构体,包含姓名、电话号码、邮箱等基本信息。
然后,我们可以使用链表节点来表示每个联系人,每个节点包含一个联系人的信息以及指向下一个节点的指针。
在创建通讯录时,我们将使用一个头节点来表示通讯录的起始位置,该头节点不包含任何联系人信息,只有一个指向第一个联系人节点的指针。
这样,我们可以通过头节点来遍历整个通讯录,并且在需要插入或删除联系人时更加方便。
在通讯录的实现中,我们可以提供一系列的操作函数,例如添加联系人、删除联系人、查找联系人、显示通讯录等。
这些操作函数可以通过遍历链表来实现对联系人的管理。
除了基本的功能,我们还可以扩展通讯录的功能,例如按照姓名首字母进行排序、按照电话号码进行查找等。
这些功能的实现可以通过链表的操作和排序算法来完成。
此外,我们还可以考虑使用其他数据结构来优化通讯录的实现。
例如,可以使用哈希表来加快对联系人的查找速度,或者使用二叉搜索树来实现按照姓名首字母进行排序。
综上所述,通讯录的制作数据结构课程设计中,我们将使用链表作为主要的数据结构,并通过实现一系列的操作函数和扩展功能来实现对联系人的管理和查询。
同时,我们也可以考虑使用其他数据结构来优化通讯录的实现。
这样的设计可以提高通讯录的效率和方便性,使用户能够更加方便地管理和查找自己的联系人信息。
数据结构哈希表设计
数据结构哈希表设计1.引言哈希表(Hash Table)是一种常用的数据结构,用于快速存储和检索数据。
它通过将键(Key)映射到值(Value)来实现高效的数据存储和查找。
本文将介绍哈希表的设计原理和实现方法,以及一些常见的应用场景。
2.哈希函数的选择哈希函数是实现哈希表的关键,它将键映射到哈希值。
一个好的哈希函数应当具有以下特点:●均匀性:对于任意的输入,哈希函数应该能够将其均匀地映射到哈希表的各个位置,避免产生过多的冲突。
●高效性:哈希函数应当能够在常数时间内计算出哈希值,避免影响哈希表的性能。
●低冲突性:哈希函数应当能够尽可能少的冲突,即不同的键经过哈希函数计算得到相同的哈希值的概率应当很低。
3.冲突解决方法由于哈希函数的有限性,不同的键可能会产生相同的哈希值,这种情况称为冲突。
常见的冲突解决方法有以下几种:●链地质法(Chning):将哈希表的每个位置引入链表,当多个键映射到相同的位置时,将它们存储在链表中。
●开放寻址法(Open Addressing):当发生冲突时,通过一定的方法在哈希表中寻找下一个可用的位置,直到找到一个空位置或者遍历完整个哈希表。
●再哈希法(Rehashing):当发生冲突时,通过应用另一个哈希函数来计算出一个新的哈希值,以此来解决冲突。
4.哈希表的操作哈希表支持以下几种操作:●插入(Insert):将一个键值对插入到哈希表中。
●删除(Delete):从哈希表中删除指定的键值对。
●查找(Search):根据给定的键,在哈希表中查找对应的值。
●更新(Update):根据给定的键,更新哈希表中对应的值。
5.哈希表的应用哈希表广泛应用于各种场景,例如:●缓存:哈希表可以用于实现高效的缓存系统,根据请求的键值对快速查找到对应的数据。
●字典:哈希表可以被用作实现字典,将单词与其定义相关联。
●数据库索引:哈希表可以用于构建数据库的索引,提高数据的检索性能。
6.总结哈希表是一种高效的数据结构,通过将键映射到值来实现快速的数据存储和检索。
数据结构哈希表设计
数据结构哈希表设计数据结构哈希表设计一、概述哈希表是一种在计算机科学中广泛应用的数据结构,它通过将关键字映射到哈希表中的位置来实现快速的查找、插入和删除操作。
本文将详细介绍哈希表的设计原理、实现方法和常见应用场景。
二、设计原理1、哈希函数的选择哈希函数是哈希表的关键,它将关键字映射到哈希表中的位置。
一个好的哈希函数能够尽可能地将关键字均匀地分布在哈希表中,减少冲突。
2、冲突解决方法由于哈希函数的输出值的范围通常远小于关键字的范围,不可避免地会出现冲突。
冲突解决方法主要有开放定址法、链地质法和再哈希法。
3、动态扩容在使用哈希表的过程中,可能会发生数据增加的情况。
为了保持哈希表的性能,需要进行动态扩容,重新计算哈希函数,并将原有数据重新散列。
三、实现方法1、哈希表的数据结构哈希表通常由一个数组和一个哈希函数组成。
数组的大小为哈希表的容量,每个位置存储一个链表或其他数据结构。
2、哈希函数的实现哈希函数的实现可以基于关键字的特征进行设计,例如,对于字符串关键字,可以使用字符的ASCII码值的和或乘积作为哈希函数。
3、冲突解决方法的实现- 开放定址法:当发生冲突时,依次查找下一个空位置,并将数据插入其中。
- 链地质法:每个位置存储一个链表,发生冲突时,将数据插入到链表的末尾。
- 再哈希法:使用不同的哈希函数重新计算哈希值,直到找到一个空位置。
四、常见应用场景1、数据库索引哈希表可以用于实现数据库的索引功能,快速定位到存储的数据。
2、缓存实现哈希表可以作为缓存系统的核心数据结构,用于存储缓存的键值对。
3、字典实现哈希表可以用于实现字典,将单词作为键进行存储和查询。
附件:无附件。
法律名词及注释:1、哈希表:是一种数据结构,它通过哈希函数将关键字映射到哈希表中的位置,实现快速的查找、插入和删除操作。
2、关键字:在哈希表中与数据相关联的标识符或键。
关键字是哈希函数的输入。
3、哈希函数:将关键字映射到哈希表中位置的函数。
数据结构哈希表设计
数据结构哈希表设计在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地访问、操作和管理数据。
哈希表(Hash Table)作为一种重要的数据结构,在许多应用中都发挥着关键作用。
它以其高效的查找、插入和删除操作,成为了处理大量数据时的得力工具。
那么,什么是哈希表呢?简单来说,哈希表是一种根据关键码值(Key)而直接进行访问的数据结构。
通过一个哈希函数(Hash Function),将关键码映射到表中的一个位置来访问记录,以加快查找的速度。
要设计一个有效的哈希表,首先需要考虑的是哈希函数的选择。
一个好的哈希函数应该尽可能地将不同的关键码值均匀地分布在哈希表的存储空间中,以减少冲突的发生。
常见的哈希函数设计方法包括直接定址法、数字分析法、平方取中法、折叠法、除留余数法等。
以除留余数法为例,假设我们要存储的关键码值是整数,哈希表的长度为 m,那么哈希函数可以设计为 h(key) = key % m 。
也就是说,用关键码值除以 m 取余数,得到的结果就是在哈希表中的存储位置。
然而,即使选择了一个较好的哈希函数,冲突仍然可能会发生。
这是因为哈希函数将一个无限的关键码值集合映射到一个有限的存储空间中,必然会存在多个关键码值被映射到相同位置的情况。
当发生冲突时,就需要采用合适的冲突解决方法。
常见的冲突解决方法有开放定址法和链地址法。
开放定址法是指当发生冲突时,按照某种探查方式在哈希表中寻找下一个空闲的位置来存储冲突的元素。
常见的探查方法有线性探查、二次探查和双重探查等。
链地址法则是将所有哈希地址相同的元素构成一个单链表,并将单链表的头指针存储在哈希表的对应位置。
当查找元素时,首先通过哈希函数计算出哈希地址,然后在对应的单链表中进行查找。
在实际设计哈希表时,还需要考虑哈希表的装填因子(Load Factor)。
装填因子是指哈希表中已存储的元素个数与哈希表的长度之比。
装填因子越大,冲突发生的可能性就越高;装填因子越小,虽然冲突减少,但会浪费更多的存储空间。
通讯录程序设计
通讯录程序设计通讯录程序设计是一个涉及数据结构、用户界面设计和编程技巧的综合性项目。
设计一个通讯录程序,需要考虑以下几个关键方面:1. 需求分析在设计通讯录程序之前,首先要明确用户需求。
通讯录的基本功能包括:- 添加联系人- 删除联系人- 修改联系人信息- 搜索联系人- 显示所有联系人2. 数据结构设计通讯录程序的核心是联系人信息的存储和管理。
常见的数据结构有:- 数组:简单但不利于动态扩展。
- 链表:便于动态添加和删除。
- 哈希表:快速检索。
联系人信息通常包括:- 姓名- 电话号码- 邮箱地址- 地址- 备注信息3. 程序架构通讯录程序可以分为以下几个模块:- 用户界面(UI):提供用户交互界面,如输入框、按钮、列表等。
- 数据管理:负责联系人数据的增删改查。
- 搜索模块:实现联系人的快速查找功能。
- 数据持久化:将联系人信息存储到文件或数据库中。
4. 技术选型根据项目需求和开发环境,选择合适的编程语言和开发工具。
例如:- C/C++:适合底层开发,性能高。
- Java:跨平台,适合大型应用开发。
- Python:语法简洁,开发效率高。
- 前端技术:如HTML/CSS/JavaScript,用于开发Web版通讯录。
5. 用户界面设计用户界面应简洁直观,易于操作。
常见的设计元素包括:- 主界面:展示所有联系人列表。
- 添加界面:填写新联系人信息。
- 编辑界面:修改现有联系人信息。
- 搜索框:输入关键字进行搜索。
6. 功能实现- 添加联系人:用户输入信息后,程序将其存储到数据结构中。
- 删除联系人:根据用户选择,从数据结构中移除联系人。
- 修改联系人:允许用户更新现有联系人的信息。
- 搜索联系人:根据用户输入的关键字,快速定位联系人。
- 显示联系人:将所有或筛选后的联系人信息展示给用户。
7. 数据持久化为了使联系人信息在程序关闭后依然可用,需要实现数据持久化。
常见的方法有:- 将数据写入文本文件。
哈希表实现通讯录-数据结构与算法课程设计报告
合肥学院计算机科学与技术系课程设计报告2009~2010学年第二学期课程数据结构与算法课程设计名称哈希表实现通讯录题目:(哈希表的设计与实现的问题)设计哈希表实现电话号码查询系统。
设计程序完成以下要求:(1)设每个记录有下列数据项:电话号码、用户名、地址;(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)采用再哈希法解决冲突;(4)查找并显示给定电话号码的记录;(5)查找并显示给定用户的记录。
一、问题分析和任务定义此程序需要完成如下要求:设计哈希表实现电话号码查询系统。
实现本程序需要解决以下几个问题:(1)设计结点使该结点包括电话号码、用户名、地址。
(2)利用再哈希法解决冲突。
(3)分别以电话号码和用户名为关键字建立哈希表。
(4)实现查找并显示给定电话号码的记录。
(5)查找并显示给定用户的记录。
本问题的关键和难点在于如何解决散列的问题。
由于结点的个数无法的知,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。
所以采用链地址法散列算法。
采用拉链法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。
首先,解决的是定义链表结点,在拉链法中,每个结点对应一个链表结点,它由三个域组成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表,所以该链表结点它是由四个域组成.name[8] 、num[11]和address[20]都是char浮点型,输入输出都只能是浮点型的。
采用拉链法,其中的所有同义词构成一个单链表,再由一个表头结点指向这个单链表的第一个结点。
这些表头结点组成一个一维数组,即哈希表。
数组元素的下标对应由散列函数求出的散列地址。
其次,设计散列函数,本程序需要设计两个散列函数才能解决问题,程序需要分别为以电话号码和用户名为关键字建立哈希表。
所以要分别以用户名、号码为关键字建立两个散列函数,对于以号码为关键字的散列函数,是将十一个数字全部相加,然后对20求余。
通讯录——数据结构课程设计
通讯录——数据结构课程设计通讯录是一个用于存储和管理联系人信息的工具。
在数据结构课程设计中,我们需要设计一个通讯录系统,使用户能够方便地添加、查找、修改和删除联系人信息。
下面是通讯录系统的标准格式文本,详细介绍了系统的功能和实现方法。
一、系统概述通讯录系统是一个基于数据结构的软件应用程序,用于存储和管理联系人信息。
它提供了一系列功能,包括添加联系人、查找联系人、修改联系人和删除联系人。
二、系统功能1. 添加联系人用户可以通过系统界面输入联系人的姓名、电话号码、电子邮件地址等信息,系统将这些信息存储在数据结构中。
每一个联系人的信息应包括惟一的标识符,以便于后续的查找、修改和删除操作。
2. 查找联系人用户可以通过姓名、电话号码或者电子邮件地址等关键字进行联系人的查找。
系统将根据用户提供的关键字,在数据结构中进行搜索,并返回与之匹配的联系人信息。
3. 修改联系人用户可以选择要修改的联系人,并提供新的姓名、电话号码、电子邮件地址等信息。
系统将根据用户提供的联系人标识符,在数据结构中找到对应的联系人,并更新其信息。
4. 删除联系人用户可以选择要删除的联系人,并确认删除操作。
系统将根据用户提供的联系人标识符,在数据结构中找到对应的联系人,并将其从通讯录中删除。
三、系统实现1. 数据结构选择为了高效地存储和管理联系人信息,我们选择使用链表作为数据结构。
每一个节点表示一个联系人,包含姓名、电话号码、电子邮件地址等信息,以及指向下一个节点的指针。
2. 添加联系人用户输入联系人信息后,系统将创建一个新的节点,并将其插入到链表的末尾。
为了保证联系人信息的惟一性,系统将检查新节点的标识符是否与已有节点的标识符重复。
如果重复,则提示用户重新输入。
3. 查找联系人用户输入关键字后,系统将从链表的头节点开始遍历,逐个比较节点中的姓名、电话号码和电子邮件地址与关键字是否匹配。
如果找到匹配的联系人,系统将返回其信息。
如果遍历完整个链表仍未找到匹配的联系人,则提示用户未找到。
数据结构课程设计_通讯录查询系统的设计与实现
Word格式通讯录查询系统的设计与实现完美整理一、需求分析1、问题描述为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的电话与地址。
设计散列表存储,设计并实现通讯录查找系统。
2、基本要求a.每个记录有下列数据项:电话号码、用户名、地址;b.从键盘输入各记录,分别以电话号码为关键字建立散列表;c.采用二次探测再散列法解决冲突;d.查找并显示给定电话号码的记录;e.通讯录信息文件保存。
二、概要设计1.数据结构本程序需要用到两个结构体,分别为通讯录 message以及哈希表HxList2.程序模块本程序包含两个模块,一个是实现功能的函数的模块,另一个是主函数模块。
系统子程序及功能设计本系统共有三个子程序,分别是:int Hx(long long key,int data)//哈希函数void BulidHx(HxList &L)//建立通讯录int Search(HxList &L)//查找3.各模块之间的调用关系以及算法设计主函数调用BulidHx以及Search函数。
函数BulidHx调用函数Hx。
三、详细设计1.数据类型定义typedef struct{char *name;char *add;long long phonenumber;}message;typedef struct{message *list;int number;//记录数}HxList;2.系统主要子程序详细设计a. 建立通讯录void BulidHx(HxList &L)//建立通讯录{FILE *f = fopen("E:\\tongxunlu.txt", "w");char buf[20]={0},str[20]={0};long long key;cout<<"输入要建立的记录数:";cin>>L.number;L.number+=1;L.list=new message[L.number];//分配哈希表的存储空间for(int i=0;i<L.number;i++){L.list[i].phonenumber=-1;}L.list[L.number-1].name=NULL;L.list[L.number-1].add=NULL;cout<<"输入记录信息(电话号码用户名地址)"<<endl; for(int i=0;i<L.number-1;i++){cin>>key>>buf>>str;int pose=Hx(key,L.number);//获取理论上的存储位置if(L.list[pose].phonenumber==-1){}else{//用二次探测再散列法解决冲突//1^2 -1^2 2^2 -2^2int di,count=1;xunhuan: if(count%2==0)di=-(count/2)*(count/2);elsedi=((count/2)+1)*((count/2)+1);int site=Hx(key+di,L.number);if(site>=0){if(L.list[site].phonenumber==-1){pose=site;}else{count++;goto xunhuan;}}else{site=L.number-abs(site);if(L.list[site].phonenumber==-1){pose=site;}else{count++;goto xunhuan;}}}L.list[pose].phonenumber=key;fprintf(f,"%lld",key);fprintf(f," ");L.list[pose].name=new char[strlen(buf)+1];strcpy(L.list[pose].name,buf);fprintf(f,"%s",buf);fprintf(f," ");L.list[pose].add=new char[strlen(str)+1];strcpy(L.list[pose].add,str);fprintf(f,"%s",str);fprintf(f,"\n");}}b.查找int Search(HxList &L)//查找{long long key;cout<<"输入要查找记录的关键字(电话号码):";cin>>key;int pose=Hx(key,L.number);//计算理论上的位置if(L.list[pose].phonenumber==key){}else{int count=1,di;//二次探测再散列,查找xunhuan: if(count%2==0){di=-(count/2)*(count/2);}else{di=((count/2)+1)*((count/2)+1);}int site=Hx(key+di,L.number);if(site>=0){if(L.list[site].phonenumber==key){pose=site;}else{count++;if(L.list[site].phonenumber==-1){cout<<"没有找到"<<endl;return -1;//没有找到}goto xunhuan;}}else{site=L.number-abs(site);if(L.list[site].phonenumber==key){pose=site;}else{count++;if(L.list[site].phonenumber==-1){cout<<"没有找到"<<endl;return -1;//没有找到}goto xunhuan;}}}if(L.list[pose].phonenumber==key){cout<<"电话号码\t"<<"用户名\t"<<"地址"<<endl;cout<<L.list[pose].phonenumber<<"\t"<<L.list[pose].name<<"\t"<<L.list [pose].add<<endl;return pose;}}四、测试与分析1.显示主菜单,运行程序可以显示出如下界面。
哈希表设计-数据结构课程设计
输出超找结果
printf("\n 姓名:%s 关键字:%d 查找长度为: 1\n",HashTable[adr].py,s);
else if (HashTable[adr].m==0)
printf("没有想要查找的人!\n");
else
{
while(1)
{
adr=(adr+d[j++])%HASH_LEN;//伪随机探测再散列法处理冲突
取读者周围较熟悉的 30 个人的姓名。 4. 实现提示
如果随机数自行构造,则应首先调整好随机函数,使其分布均匀。人名的长度均不超 过 19 个字符(最长的人名如:庄双双(Zhuang Shuangshuang))。字符的取码方法可直接利 用 C 语言中的 toascii 函数,并可先对过长的人名先作折叠处理。
四、调试分析
编译环境为 CodeBlocks。
山东科技大学学生课程设计
山东科技大学学生课程设计
山东科技大学学生课程设计
int si; //查找长度
}HASH;
HASH HashTable[HASH_LEN];
//全局定义哈希表
int d[30],i,j; //全局定义随机数,循环用的 i、j
void InitNameTable() {//姓名表的初始化
NameTable[0].py="caowukui"; NameTable[1].py="langzhijie"; NameTable[2].py="dongshuliang"; NameTable[3].py="qiuhouyang"; NameTable[4].py="zhangxu"; NameTable[5].py="duhuan"; NameTable[6].py="fanqing"; NameTable[7].py="songxiaofei"; NameTable[8].py="dutongtong"; NameTable[9].py="sunhaohao"; NameTable[10].py="shanjianfeng"; NameTable[11].py="wangbaoshan"; NameTable[12].py="houfeng"; NameTable[13].py="hujiaming"; NameTable[14].py="jiangkaiqiang"; NameTable[15].py="xuyang"; NameTable[16].py="lvdelu"; NameTable[17].py="shenjinfeng"; NameTable[18].py="xuhui"; NameTable[19].py="hanle"; NameTable[20].py="xunwenwen"; NameTable[21].py="chenhongcong"; NameTable[22].py="zhangyanyan"; NameTable[23].py="nieyanshun"; NameTable[24].py="haopengcheng"; NameTable[25].py="yuhaiyuan"; NameTable[26].py="shuxiang"; NameTable[27].py="sunyingjie"; NameTable[28].py="wangbo"; NameTable[29].py="zhaoqing"; NameTable[30].py="zhangshengqian"; for (i=0;i<NAME_LEN;i++) //将字符串的各个字符所对应的 ASCII 码相加,所得的整数做 为哈希表的关键字
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件学院
课程设计报告书
课程名称数据结构
设计题目哈希表制作通讯录
专业班级
学号
姓名
指导教师
2014年 1月
目录
1 设计时间 (1)
2 设计目的 (1)
3设计任务 (1)
4 设计内容 (1)
4.1需求分析 (1)
4.11程序所能达到的功能 (1)
4.12输入的形式和输入的范围 (1)
4.2总体设计 (1)
4.21说明本程序中用到的所有抽象数据类型的定义 (1)
4.22说明主程序的流程 (2)
4.23说明各程序模块之间的层次(调用)关系 (2)
4.3详细设计 (3)
4.31实现概要设计中定义的所有数据类型,对每个操作只需要写出
伪码算法 (3)
4.32对主程序和其它主要函数写出伪码算法 (4)
4.4测试 (5)
4.5 附录 (6)
5 总结与展望 (16)
参考文献 (17)
成绩评定 (18)
4.4测试
图4-1 程序运行图
图4-2输入信息图
图4-3显示信息4.5 附录
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct address{ /*定义结构*/ char name[10];
char street[50];
char city[10];
char state[15];
char tel[7];
struct address *next; /*后继指针*/ struct address *prior; /*前驱指针*/ };。