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

2025-05-27 0 51

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C语言基于哈希表实现通讯录 https://www.kuaiidc.com/72821.html

相关文章

发表评论
暂无评论