c语言编程笔录

您现在的位置是:首页 > C语言 > C#

C#

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

蔡依婷 2023-08-12C#
前言本文将使用C语言基于哈希表实现一个通讯录。通讯录是一个简单的联系人管理系统,用户可以添加、删除和搜索联系人的信息。哈希表是一种高效的数据结构,它可以快速存储和检索数据。设计思路首先,我们需要设计一

前言

本文将使用C语言基于哈希表实现一个通讯录。通讯录是一个简单的联系人管理系统,用户可以添加、删除和搜索联系人的信息。哈希表是一种高效的数据结构,它可以快速存储和检索数据。

设计思路

首先,我们需要设计一个哈希函数来将联系人的姓名转换为对应的哈希值。这个函数应该将每个字母转换为ASCII码,然后将所有ASCII码相加,最后取模得到哈希值。

int hashFunction(char* name) {
    int sum = 0;
    for(int i = 0; i < strlen(name); i++) {
        sum += name[i];
    }
    return sum % TABLE_SIZE;
}

接下来,我们需要定义一个存储联系人信息的结构体。这个结构体应该包含姓名、电话号码和邮箱等字段。我们还需要定义一个节点结构体,用于构建哈希表。每个节点将存储一个联系人的信息。

typedef struct {
    char name[MAX_NAME_LENGTH];
    char phone[MAX_PHONE_LENGTH];
    char email[MAX_EMAIL_LENGTH];
} Contact;

typedef struct {
    Contact contact;
    struct Node* next;
} Node;

然后,我们可以创建一个数组来存储哈希表。数组的每个元素都是一个指针,指向链表的头节点。每个链表代表一个哈希冲突的解决链,其中存储了具有相同哈希值的联系人。

#define TABLE_SIZE 100

Node* hashTable[TABLE_SIZE];

最后,我们需要实现通讯录的基本操作,包括添加联系人、删除联系人和搜索联系人。添加联系人和搜索联系人的过程都需要使用哈希函数来确定存储和查找的位置。删除联系人则需要从对应链表中删除节点。

void addContact(Contact contact) {
    int index = hashFunction(contact.name);
    Node* newNode = (Node*) malloc(sizeof(Node));
    newNode->contact = contact;
    newNode->next = NULL;
    
    if(hashTable[index] == NULL) {
        hashTable[index] = newNode;
    } else {
        Node* current = hashTable[index];
        while(current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

void deleteContact(char* name) {
    int index = hashFunction(name);
    Node* current = hashTable[index];
    Node* previous = NULL;
    
    while(current != NULL) {
        if(strcmp(current->contact.name, name) == 0) {
            if(previous == NULL) {
                hashTable[index] = current->next;
            } else {
                previous->next = current->next;
            }
            free(current);
            break;
        }
        previous = current;
        current = current->next;
    }
}

Node* searchContact(char* name) {
    int index = hashFunction(name);
    Node* current = hashTable[index];
    
    while(current != NULL) {
        if(strcmp(current->contact.name, name) == 0) {
            return current;
        }
        current = current->next;
    }
    
    return NULL;
}

总结

通过使用C语言中的哈希表,我们可以有效地实现一个通讯录。哈希表可以提供快速的数据存储和检索,尤其在大量数据的情况下效果更为明显。我们通过设计合适的哈希函数和使用链表来处理哈希冲突,实现了添加、删除和搜索联系人的功能。希望本文对您理解C语言中基于哈希表的通讯录实现有所帮助。

文章评论