溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言動態與靜態分別實現通訊錄的方法

發布時間:2022-02-28 09:27:58 來源:億速云 閱讀:178 作者:iii 欄目:開發技術

C語言動態與靜態分別實現通訊錄的方法

目錄

  1. 引言
  2. 通訊錄的基本功能
  3. 靜態實現通訊錄
  4. 動態實現通訊錄
  5. 靜態與動態實現的對比
  6. 總結

引言

通訊錄是日常生活中常用的工具,用于存儲和管理聯系人信息。在C語言中,我們可以通過靜態和動態兩種方式來實現通訊錄。靜態實現通常使用數組來存儲聯系人信息,而動態實現則使用鏈表或動態數組等數據結構。本文將詳細介紹這兩種實現方法,并通過代碼示例展示其具體實現過程。

通訊錄的基本功能

一個基本的通訊錄通常包含以下功能: 1. 添加聯系人:向通訊錄中添加新的聯系人信息。 2. 刪除聯系人:從通訊錄中刪除指定的聯系人。 3. 查找聯系人:根據姓名或其他信息查找聯系人。 4. 修改聯系人:修改通訊錄中已有聯系人的信息。 5. 顯示所有聯系人:顯示通訊錄中所有聯系人的信息。 6. 保存通訊錄:將通訊錄保存到文件中。 7. 加載通訊錄:從文件中加載通訊錄。

靜態實現通訊錄

數據結構設計

在靜態實現中,我們通常使用數組來存儲聯系人信息。每個聯系人可以定義為一個結構體,包含姓名、電話號碼、電子郵件等信息。

#define MAX_CONTACTS 100

typedef struct {
    char name[50];
    char phone[20];
    char email[50];
} Contact;

Contact contacts[MAX_CONTACTS];
int contact_count = 0;

功能實現

  1. 添加聯系人
    • 檢查通訊錄是否已滿。
    • 將新聯系人信息添加到數組中。
void add_contact() {
    if (contact_count >= MAX_CONTACTS) {
        printf("通訊錄已滿,無法添加新聯系人。\n");
        return;
    }

    Contact new_contact;
    printf("請輸入姓名: ");
    scanf("%s", new_contact.name);
    printf("請輸入電話號碼: ");
    scanf("%s", new_contact.phone);
    printf("請輸入電子郵件: ");
    scanf("%s", new_contact.email);

    contacts[contact_count++] = new_contact;
    printf("聯系人添加成功。\n");
}
  1. 刪除聯系人
    • 根據姓名查找聯系人。
    • 將數組中的后續元素向前移動,覆蓋要刪除的聯系人。
void delete_contact() {
    char name[50];
    printf("請輸入要刪除的聯系人姓名: ");
    scanf("%s", name);

    int index = -1;
    for (int i = 0; i < contact_count; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            index = i;
            break;
        }
    }

    if (index == -1) {
        printf("未找到該聯系人。\n");
        return;
    }

    for (int i = index; i < contact_count - 1; i++) {
        contacts[i] = contacts[i + 1];
    }

    contact_count--;
    printf("聯系人刪除成功。\n");
}
  1. 查找聯系人
    • 根據姓名查找聯系人并顯示其信息。
void find_contact() {
    char name[50];
    printf("請輸入要查找的聯系人姓名: ");
    scanf("%s", name);

    for (int i = 0; i < contact_count; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            printf("姓名: %s\n", contacts[i].name);
            printf("電話號碼: %s\n", contacts[i].phone);
            printf("電子郵件: %s\n", contacts[i].email);
            return;
        }
    }

    printf("未找到該聯系人。\n");
}
  1. 修改聯系人
    • 根據姓名查找聯系人并修改其信息。
void modify_contact() {
    char name[50];
    printf("請輸入要修改的聯系人姓名: ");
    scanf("%s", name);

    for (int i = 0; i < contact_count; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            printf("請輸入新的電話號碼: ");
            scanf("%s", contacts[i].phone);
            printf("請輸入新的電子郵件: ");
            scanf("%s", contacts[i].email);
            printf("聯系人信息修改成功。\n");
            return;
        }
    }

    printf("未找到該聯系人。\n");
}
  1. 顯示所有聯系人
    • 遍歷數組并顯示所有聯系人的信息。
void display_contacts() {
    if (contact_count == 0) {
        printf("通訊錄為空。\n");
        return;
    }

    for (int i = 0; i < contact_count; i++) {
        printf("聯系人 %d:\n", i + 1);
        printf("姓名: %s\n", contacts[i].name);
        printf("電話號碼: %s\n", contacts[i].phone);
        printf("電子郵件: %s\n", contacts[i].email);
        printf("\n");
    }
}
  1. 保存通訊錄
    • 將通訊錄保存到文件中。
void save_contacts() {
    FILE *file = fopen("contacts.dat", "wb");
    if (file == NULL) {
        printf("無法打開文件。\n");
        return;
    }

    fwrite(&contact_count, sizeof(int), 1, file);
    fwrite(contacts, sizeof(Contact), contact_count, file);

    fclose(file);
    printf("通訊錄保存成功。\n");
}
  1. 加載通訊錄
    • 從文件中加載通訊錄。
void load_contacts() {
    FILE *file = fopen("contacts.dat", "rb");
    if (file == NULL) {
        printf("無法打開文件。\n");
        return;
    }

    fread(&contact_count, sizeof(int), 1, file);
    fread(contacts, sizeof(Contact), contact_count, file);

    fclose(file);
    printf("通訊錄加載成功。\n");
}

代碼示例

#include <stdio.h>
#include <string.h>

#define MAX_CONTACTS 100

typedef struct {
    char name[50];
    char phone[20];
    char email[50];
} Contact;

Contact contacts[MAX_CONTACTS];
int contact_count = 0;

void add_contact() {
    if (contact_count >= MAX_CONTACTS) {
        printf("通訊錄已滿,無法添加新聯系人。\n");
        return;
    }

    Contact new_contact;
    printf("請輸入姓名: ");
    scanf("%s", new_contact.name);
    printf("請輸入電話號碼: ");
    scanf("%s", new_contact.phone);
    printf("請輸入電子郵件: ");
    scanf("%s", new_contact.email);

    contacts[contact_count++] = new_contact;
    printf("聯系人添加成功。\n");
}

void delete_contact() {
    char name[50];
    printf("請輸入要刪除的聯系人姓名: ");
    scanf("%s", name);

    int index = -1;
    for (int i = 0; i < contact_count; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            index = i;
            break;
        }
    }

    if (index == -1) {
        printf("未找到該聯系人。\n");
        return;
    }

    for (int i = index; i < contact_count - 1; i++) {
        contacts[i] = contacts[i + 1];
    }

    contact_count--;
    printf("聯系人刪除成功。\n");
}

void find_contact() {
    char name[50];
    printf("請輸入要查找的聯系人姓名: ");
    scanf("%s", name);

    for (int i = 0; i < contact_count; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            printf("姓名: %s\n", contacts[i].name);
            printf("電話號碼: %s\n", contacts[i].phone);
            printf("電子郵件: %s\n", contacts[i].email);
            return;
        }
    }

    printf("未找到該聯系人。\n");
}

void modify_contact() {
    char name[50];
    printf("請輸入要修改的聯系人姓名: ");
    scanf("%s", name);

    for (int i = 0; i < contact_count; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            printf("請輸入新的電話號碼: ");
            scanf("%s", contacts[i].phone);
            printf("請輸入新的電子郵件: ");
            scanf("%s", contacts[i].email);
            printf("聯系人信息修改成功。\n");
            return;
        }
    }

    printf("未找到該聯系人。\n");
}

void display_contacts() {
    if (contact_count == 0) {
        printf("通訊錄為空。\n");
        return;
    }

    for (int i = 0; i < contact_count; i++) {
        printf("聯系人 %d:\n", i + 1);
        printf("姓名: %s\n", contacts[i].name);
        printf("電話號碼: %s\n", contacts[i].phone);
        printf("電子郵件: %s\n", contacts[i].email);
        printf("\n");
    }
}

void save_contacts() {
    FILE *file = fopen("contacts.dat", "wb");
    if (file == NULL) {
        printf("無法打開文件。\n");
        return;
    }

    fwrite(&contact_count, sizeof(int), 1, file);
    fwrite(contacts, sizeof(Contact), contact_count, file);

    fclose(file);
    printf("通訊錄保存成功。\n");
}

void load_contacts() {
    FILE *file = fopen("contacts.dat", "rb");
    if (file == NULL) {
        printf("無法打開文件。\n");
        return;
    }

    fread(&contact_count, sizeof(int), 1, file);
    fread(contacts, sizeof(Contact), contact_count, file);

    fclose(file);
    printf("通訊錄加載成功。\n");
}

int main() {
    int choice;
    while (1) {
        printf("\n通訊錄管理系統\n");
        printf("1. 添加聯系人\n");
        printf("2. 刪除聯系人\n");
        printf("3. 查找聯系人\n");
        printf("4. 修改聯系人\n");
        printf("5. 顯示所有聯系人\n");
        printf("6. 保存通訊錄\n");
        printf("7. 加載通訊錄\n");
        printf("8. 退出\n");
        printf("請選擇操作: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                add_contact();
                break;
            case 2:
                delete_contact();
                break;
            case 3:
                find_contact();
                break;
            case 4:
                modify_contact();
                break;
            case 5:
                display_contacts();
                break;
            case 6:
                save_contacts();
                break;
            case 7:
                load_contacts();
                break;
            case 8:
                return 0;
            default:
                printf("無效的選擇,請重新輸入。\n");
        }
    }

    return 0;
}

動態實現通訊錄

數據結構設計

在動態實現中,我們通常使用鏈表來存儲聯系人信息。每個聯系人可以定義為一個結構體,包含姓名、電話號碼、電子郵件等信息,以及指向下一個聯系人的指針。

typedef struct ContactNode {
    char name[50];
    char phone[20];
    char email[50];
    struct ContactNode *next;
} ContactNode;

ContactNode *head = NULL;

功能實現

  1. 添加聯系人
    • 創建新節點并插入到鏈表中。
void add_contact() {
    ContactNode *new_contact = (ContactNode *)malloc(sizeof(ContactNode));
    if (new_contact == NULL) {
        printf("內存分配失敗。\n");
        return;
    }

    printf("請輸入姓名: ");
    scanf("%s", new_contact->name);
    printf("請輸入電話號碼: ");
    scanf("%s", new_contact->phone);
    printf("請輸入電子郵件: ");
    scanf("%s", new_contact->email);

    new_contact->next = head;
    head = new_contact;
    printf("聯系人添加成功。\n");
}
  1. 刪除聯系人
    • 根據姓名查找聯系人并刪除節點。
void delete_contact() {
    char name[50];
    printf("請輸入要刪除的聯系人姓名: ");
    scanf("%s", name);

    ContactNode *current = head;
    ContactNode *previous = NULL;

    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            if (previous == NULL) {
                head = current->next;
            } else {
                previous->next = current->next;
            }
            free(current);
            printf("聯系人刪除成功。\n");
            return;
        }
        previous = current;
        current = current->next;
    }

    printf("未找到該聯系人。\n");
}
  1. 查找聯系人
    • 根據姓名查找聯系人并顯示其信息。
void find_contact() {
    char name[50];
    printf("請輸入要查找的聯系人姓名: ");
    scanf("%s", name);

    ContactNode *current = head;
    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            printf("姓名: %s\n", current->name);
            printf("電話號碼: %s\n", current->phone);
            printf("電子郵件: %s\n", current->email);
            return;
        }
        current = current->next;
    }

    printf("未找到該聯系人。\n");
}
  1. 修改聯系人
    • 根據姓名查找聯系人并修改其信息。
void modify_contact() {
    char name[50];
    printf("請輸入要修改的聯系人姓名: ");
    scanf("%s", name);

    ContactNode *current = head;
    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            printf("請輸入新的電話號碼: ");
            scanf("%s", current->phone);
            printf("請輸入新的電子郵件: ");
            scanf("%s", current->email);
            printf("聯系人信息修改成功。\n");
            return;
        }
        current = current->next;
    }

    printf("未找到該聯系人。\n");
}
  1. 顯示所有聯系人
    • 遍歷鏈表并顯示所有聯系人的信息。
void display_contacts() {
    if (head == NULL) {
        printf("通訊錄為空。\n");
        return;
    }

    ContactNode *current = head;
    int count = 1;
    while (current != NULL) {
        printf("聯系人 %d:\n", count++);
        printf("姓名: %s\n", current->name);
        printf("電話號碼: %s\n", current->phone);
        printf("電子郵件: %s\n", current->email);
        printf("\n");
        current = current->next;
    }
}
  1. 保存通訊錄
    • 將通訊錄保存到文件中。
void save_contacts() {
    FILE *file = fopen("contacts.dat", "wb");
    if (file == NULL) {
        printf("無法打開文件。\n");
        return;
    }

    ContactNode *current = head;
    while (current != NULL) {
        fwrite(current, sizeof(ContactNode), 1, file);
        current = current->next;
    }

    fclose(file);
    printf("通訊錄保存成功。\n");
}
  1. 加載通訊錄
    • 從文件中加載通訊錄。
void load_contacts() {
    FILE *file = fopen("contacts.dat", "rb");
    if (file == NULL) {
        printf("無法打開文件。\n");
        return;
    }

    ContactNode *current = NULL;
    ContactNode *previous = NULL;
    while (1) {
        ContactNode *new_contact = (ContactNode *)malloc(sizeof(ContactNode));
        if (fread(new_contact, sizeof(ContactNode), 1, file) != 1) {
            free(new_contact);
            break;
        }
        new_contact->next = NULL;

        if (head == NULL) {
            head = new_contact;
        } else {
            previous->next = new_contact;
        }
        previous = new_contact;
    }

    fclose(file);
    printf("通訊錄加載成功。\n");
}

代碼示例

”`c #include #include #include

typedef struct ContactNode { char name[50]; char phone[20]; char email[50]; struct ContactNode *next; } ContactNode;

ContactNode *head = NULL;

void add_contact() { ContactNode *new_contact = (ContactNode *)malloc(sizeof(ContactNode)); if (new_contact == NULL) { printf(“內存分配失敗。\n”); return; }

printf("請輸入姓名: ");
scanf("%s", new_contact->name);
printf("請輸入電話號碼: ");
scanf("%s", new_contact->phone);
printf("請輸入電子郵件: ");
scanf("%s", new_contact->email);

new_contact->next = head;
head = new_contact;
printf("聯系人添加成功。\n");

}

void delete_contact() { char name[50]; printf(“請輸入要刪除的聯系人姓名: “); scanf(”%s”, name);

ContactNode *current = head;
ContactNode *previous = NULL;

while (current != NULL) {
    if (strcmp(current->name, name) == 0) {
        if (previous == NULL) {
            head = current->next;
        } else {
            previous->next = current->next;
        }
        free(current);
        printf("聯系人刪除成功。\n");
        return;
    }
    previous = current;
    current = current->next;
}

printf
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女