高防服务器

C语言中如何利用哈希表实现通讯录


C语言中如何利用哈希表实现通讯录

发布时间:2022-04-01 17:50:43 来源:高防服务器网 阅读:50 作者:iii 栏目:编程语言

这篇“C语言中如何利用哈希表实现通讯录”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“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]!='';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,再次输入请按0n");      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:%st name:%st address:%st city:%st etp:%st 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("okn");   }   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:%sn",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语言中如何利用哈希表实现通讯录”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注高防服务器网行业资讯频道。

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[