用C语言散列表实现电话薄
发布日期:2021-05-07 13:02:57 浏览次数:12 分类:精选文章

本文共 3824 字,大约阅读时间需要 12 分钟。

用C语言实现电话薄

结构体定义

定义了一个struct node结构体,用于存储电话薄中的联系人信息。包括电话号码、姓名、地址、城市和企业名称等字段,结构体还包含指向下一个节点的指针。电话薄的数据存储在一个大小为19的数组num_list中,每个位置对应一个哈希表的键值。

typedef struct node {    char num[11], name[15], address[20], city[15], etp[20];    struct node *next;} NUM;

哈希函数

使用了除法法则(即余数法)来计算哈希值。将电话号码的每一位数字转换为整数,并根据公式 k = 10*k + (num[i] - '0') 计算哈希值。最后取模19得到最终的哈希值。

int hash(char num[]) {    int i, k = 0;    for(i = 0; num[i] != '\0'; i++) {        k = 10 * k + num[i] - '0';    }    k = k % 19;    return k;}

创建通讯录

通过create()函数可以添加新的联系人信息。程序会循环提示用户输入电话号码、姓名、地址、城市和企业名称。然后调用哈希函数计算键值,将节点插入到哈希表中的相应位置。

void create() {    struct node *p1;    int 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);        int k1 = hash(p1->num);        p1->next = num_list[k1];        num_list[k1] = p1;        printf("结束请按1,再次输入请按0\n");        scanf("%d", &m);    }    printf("通讯表已经创建\n");}

删除联系人

dlter()函数用于删除指定电话号码的联系人信息。程序首先调用哈希函数找到对应的节点,然后释放该节点的内存。

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%s%s", f->num, f->name, f->address, f->city, f->etp);            find = 1;        }        f = f->next;    }    if(find == 0) {        printf("没有找到要删除的节点!");    }}

列表显示

list()函数用于打印通讯录中的所有联系人信息。程序遍历哈希表中的每一个节点,逐个打印联系人的电话号码、姓名、地址、城市和企业名称。

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;        }    }}

添加联系人

add()函数用于添加新的联系人信息。程序提示用户输入电话号码、姓名、地址、城市和企业名称,然后将节点插入到哈希表中的相应位置。

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%s%s", num, name, address, city, etp);    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");}

查询联系人

search()函数用于查询指定电话号码的联系人信息。程序调用哈希函数找到对应的节点,并打印联系人详情。

void search() {    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("所要查找的联系人信息 : 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("此联系人没有找到!");    }}

主程序

main()函数作为程序的入口,初始化num_list数组为NULL,并提供菜单选项让用户进行操作。

void main() {    int i;    for(i = 0; i < 19; i++) {        num_list[i] = NULL;    }    while(1) {        printf("\n");        printf("通讯录\n");        printf(" ------------------------------------------\n");        printf(" ---- 1. 建立 2. 查找 3. 添加 4. 修改 5. 打印 6. 结束\n");        printf(" ------------------------------------------\n");        char x;        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");        }    }}
上一篇:回文判断
下一篇:[4G&5G专题-94]:流程 - 4G LTE 同频切换与异频切换的案例分析

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年03月31日 03时44分47秒