服务器之家

服务器之家 > 正文

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

时间:2021-06-21 14:01     来源/作者:cola??

本文为大家分享了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");
    }
  }
}

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

原文链接:http://blog.csdn.net/qq_38116774/article/details/78987152

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部