本文为大家分享了C语言基于哈希表实现通讯录的具体代码,供大家参考,具体内容如下
1.需求分析
	本演示程序用C语言编写,完成哈希表的生成,电话号码的插入、以及查找等功能。
	  (1)按提示输入相应的联系人的相关资料;
	  (2)以相应的输出形式输出所存储的的联系人的资料;
	  (3)程序可以达到建立、添加、查找、打印的功能;
	  (4)程序可以判断用户输入的非法数据并引导正确的输入。
2.概要设计
存储电话号码的记录时,若在存储位置和其关键字之间建立某种确定的对应关系使得每个关键字和存储结构中一个唯一的存储位置相对应,那么在进行查找时,根据这个对应关系f就可以找到给定值K的像f(K)。若存储结构中存在关接找到所查记录。这个对应关系f称为哈希(Hash)函数或散列函数。按照以上思路建立的表称为哈希表或散列表。本案例设计主要考察散列表的建立、查找和修改。。
3.详细设计
				?
			
	
						
						
						
						
						
						
						
																		
    
        
    
        
                        
                
                    
                
                
                
                    
                
                
                
                    
                
                
                
                    
                
                        
    
 																		
						
																		
    
        
 												
						
																		
	
	
		
				
			
																		
						
						
					
				
				                | 
 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
 
								32
 
								33
 
								34
 
								35
 
								36
 
								37
 
								38
 
								39
 
								40
 
								41
 
								42
 
								43
 
								44
 
								45
 
								46
 
								47
 
								48
 
								49
 
								50
 
								51
 
								52
 
								53
 
								54
 
								55
 
								56
 
								57
 
								58
 
								59
 
								60
 
								61
 
								62
 
								63
 
								64
 
								65
 
								66
 
								67
 
								68
 
								69
 
								70
 
								71
 
								72
 
								73
 
								74
 
								75
 
								76
 
								77
 
								78
 
								79
 
								80
 
								81
 
								82
 
								83
 
								84
 
								85
 
								86
 
								87
 
								88
 
								89
 
								90
 
								91
 
								92
 
								93
 
								94
 
								95
 
								96
 
								97
 
								98
 
								99
 
								100
 
								101
 
								102
 
								103
 
								104
 
								105
 
								106
 
								107
 
								108
 
								109
 
								110
 
								111
 
								112
 
								113
 
								114
 
								115
 
								116
 
								117
 
								118
 
								119
 
								120
 
								121
 
								122
 
								123
 
								124
 
								125
 
								126
 
								127
 
								128
 
								129
 
								130
 
								131
 
								132
 
								133
 
								134
 
								135
 
								136
 
								137
 
								138
 
								139
 
								140
 
								141
 
								142
 
								143
 
								144
 
								145
 
								146
 
								147
 
								148
 
								149
 
								150
 
								151
 
								152
 
								153
 
								154
 
								155
 
								156
 
								157
 
								158
 
								159
 
								160
 
								161
 
								162
 
								163
 
								164
 
								165
 
								166
 
								167
 
								168
 
								169
 
								170
 
								171
 
								172
 
								173
 
								174
 
								175
 
								176
						  | 
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
typedef struct node 
{ 
char num[11],name[15],address[20],city[15],etp[20]; 
struct node *next; 
}NUM; 
struct NUM *num_list[19]; 
int hash(char num[]) 
{ 
int i,k=0; 
for(i=0;num[i]!='\\0';i++) 
{ 
k=10*k+num[i]-48; //字符转化为数字 
} 
k=(k%19); //除余法求散列地址 
return k; 
}//c除留余数法处理电话号码 
void create() 
{ 
struct node *p1; 
int k1,m=0; 
while(m==0) 
{ 
printf("请输入你想添加人的信息:num name address city etp,\\n"); 
p1=(struct node *)malloc(sizeof(struct node)); 
scanf("%s",p1->num); 
scanf("%s",p1->name); 
scanf("%s",p1->address); 
scanf("%s",p1->city); 
scanf("%s",p1->etp); 
k1=hash(p1->num);//用num数组值作为参数传递给哈希函数得到k1 
p1->next=num_list[k1];//將k1得到的值作为数组的储存地址赋值给头结点的下一个节点 
num_list[k1]=p1;//再將p1的数据传递给数组,故p1可以释放作为下一个节点产生 
printf("结束请按1,再次输入请按0\\n"); 
scanf("%d",&m); 
} 
printf("通讯表已经创建\\n"); 
} 
void dlter() 
{ 
char num[11]; 
int k1; 
int find=0; 
struct node *f; 
printf("请查询要修改的联系人的电话:\\n:"); 
scanf("%s",num); 
k1=hash(num); 
f=num_list[k1]; 
while(f!=NULL) 
{ 
if(strcmp(f->num,num)==0) 
{ 
printf("查找到了!请输入要修改的人的资料:\\n"); 
scanf("%s%s%s",f->num,f->name,f->address,f->city,f->etp); 
find=1; 
} 
f=f->next; 
} 
if(find=0) 
printf("没有找到要删除的节点!"); 
} 
void list() 
{ 
struct node *f;//打印节点指针 
int i; 
printf("打印通讯录如下:\\n"); 
for(i=0;i<19;i++) 
{ 
f=num_list[i]; 
while(f!=NULL) 
{ 
printf("--->num:%s\\t name:%s\\t address:%s\\t city:%s\\t etp:%s\\t \\n",f->num,f->name,f->address,f->city,f->etp); 
f=f->next; 
} 
} 
} 
void add() 
{ 
char num[11],name[15],address[20],city[15],etp[20]; 
struct node *p1; 
int k1; 
printf("请输入新添加的人的信息:电话 姓名 地址 城市 邮箱\\n"); 
p1=(struct node *)malloc(sizeof(struct node)); 
scanf("%s%s%s",num,name,address); 
strcpy(p1->num,num); 
strcpy(p1->name,name); 
strcpy(p1->address,address); 
strcpy(p1->city,city); 
strcpy(p1->etp,etp); 
k1=hash(p1->num); 
p1->next=num_list[k1]; 
num_list[k1]=p1; 
printf("ok\\n"); 
} 
void search() 
{ 
char num[11]; 
int k1; 
int find=0; 
struct node *f; 
printf("请输入查询人的电话号码:"); 
scanf("%s",num); 
k1=hash(num); 
f=num_list[k1]; 
while(f!=NULL) 
{ 
if(strcmp(f->num,num)==0) 
{ 
printf("所要查找的联系人信息 :num:%s name:%s address:%s city:%s etp:%s\\n",f->num,f->name,f->address,f->city,f->etp); 
find=1; 
} 
f=f->next; 
} 
if(find=0) 
printf("此联系人没有找到!"); 
} 
void main() 
{ 
int i; 
char x; 
for(i=0;i<19;i++) 
{ 
num_list[i]=NULL; 
} 
while(1) 
{ 
// system("cls"); 
printf("\\n"); 
printf("★★★★★★★★★通讯录★★★★★★★★★\\n"); 
printf("★◆----------------------------------◆★\\n"); 
printf("★|       1.建立       |★\\n"); 
printf("★|                 |★\\n"); 
printf("★|       2.查找       |★\\n"); 
printf("★|                 |★\\n"); 
printf("★|       3.添加       |★\\n"); 
printf("★|                 |★\\n"); 
printf("★|       4.修改       |★\\n"); 
printf("★|                 |★\\n"); 
printf("★|       5.打印       |★\\n"); 
printf("★|                 |★\\n"); 
printf("★|       6.结束       |★\\n"); 
printf("★◆----------------------------------◆★\\n"); 
printf("★★★★★★★★★★★★★★★★★★★★★\\n"); 
// x=getchar(); 
scanf("%s",&x); 
switch(x) 
{ 
case '1': create();break; 
case '2': search();break; 
case '3': add();break; 
case '4': dlter();break; 
case '5': list();break; 
case '6': return; 
default:printf("请重新输入;\\n"); 
} 
} 
}
 | 
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
相关文章
             猜你喜欢
        
        - 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
 - 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
 - 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
 - ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
 - ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
 
			TA的动态
			
		
				- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
 - 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
 - 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
 - 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
 - 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
 
快网idc优惠网
QQ交流群
				您的支持,是我们最大的动力!				
			
		
        热门文章
        
    
    - 
            2025-05-29 28
 - 
            2025-05-29 93
 - 
            2025-06-04 85
 - 
            
在 VPS 服务器上部署 DeepSeek 需要什么配置?怎么部署?
2025-05-25 100 - 
            2025-05-27 33
 
		热门评论
	
	
        
    		
            	
        
        