C语言基于哈希表实现通讯录

所属分类: 软件编程 / C 语言 阅读数: 37
收藏 0 赞 0 分享

本文为大家分享了C语言基于哈希表实现通讯录的具体代码,供大家参考,具体内容如下

1.需求分析

本演示程序用C语言编写,完成哈希表的生成,电话号码的插入、以及查找等功能。
  (1)按提示输入相应的联系人的相关资料;
  (2)以相应的输出形式输出所存储的的联系人的资料;
  (3)程序可以达到建立、添加、查找、打印的功能;
  (4)程序可以判断用户输入的非法数据并引导正确的输入。

2.概要设计

存储电话号码的记录时,若在存储位置和其关键字之间建立某种确定的对应关系使得每个关键字和存储结构中一个唯一的存储位置相对应,那么在进行查找时,根据这个对应关系f就可以找到给定值K的像f(K)。若存储结构中存在关接找到所查记录。这个对应关系f称为哈希(Hash)函数或散列函数。按照以上思路建立的表称为哈希表或散列表。本案例设计主要考察散列表的建立、查找和修改。。

3.详细设计

#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"); 
    } 
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

C语言非递归后序遍历二叉树

这篇文章主要为大家详细介绍了C语言非递归后序遍历二叉树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言单链表实现多项式相加

这篇文章主要为大家详细介绍了C语言单链表实现多项式相加,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言二叉排序(搜索)树实例

这篇文章主要为大家详细介绍了C语言二叉排序树实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

NDK 数据结构之队列与栈等的实现

这篇文章主要介绍了NDK 数据结构之队列与栈等的实现的相关资料,希望通过本文大家能理解掌握这部分内容,需要的朋友可以参考下
收藏 0 赞 0 分享

C/C++经典实例之模拟计算器示例代码

最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

C语言中的getchar和putchar的使用方法

这篇文章主要介绍了C语言中的getchar和putchar的使用方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现洗牌发牌排序功能的示例代码

本篇文章主要介绍了C++实现洗牌发牌排序功能的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

C++计算图任意两点间的所有路径

这篇文章主要为大家详细介绍了C++求图任意两点间的所有路径 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

zlib库压缩和解压字符串STL string的实例详解

这篇文章主要介绍了zlib库压缩和解压字符串STL string的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享

C/C++ 获取Windows系统的位数32位或64位的实现代码

这篇文章主要介绍了C/C++ 获取Windows系统的位数32位或64位的实现代码的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多