服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言基于哈希表实现通讯录

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

2021-06-21 14:01cola?? C/C++

这篇文章主要为大家详细介绍了C语言基于哈希表实现通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

延伸 · 阅读

精彩推荐