首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C/C++ 實現帶分組功能的通訊錄:文件存儲與增刪改查排序完整設計

     編輯:程式設計疑難解答

需求分析

要求實現通訊錄管理系統,支持聯系人分組、文件持久化、增刪改查、按姓名排序、按組顯示。

數據結構設計

struct Contact {
    char name[30];
    char work[30];
    char phone[30];
    char email[30];
    char address[30];
    int group; // 0=無分組, 1,2,3... 表示組別
    struct Contact *next;
};

採用單鏈表串聯所有聯系人,group 字段標識分組。

核心功能模塊

1. 文件持久化

  • 啟動時從 contacts.dat 讀取鏈表。
  • 每次修改後調用 saveToFile() 將鏈表寫入二進制文件。

2. 增刪改查

  • 增:輸入信息,創建節點插入鏈表尾部,設置分組。
  • 刪:按姓名查找並刪除節點,釋放內存。
  • 改:查找後修改對應字段。
  • 查:支持按姓名模糊查找、按分組篩選、顯示所有。

3. 排序

使用冒泡或歸併排序對鏈表按 name 字段升序排列,排序後重寫文件。

4. 分組顯示

遍歷鏈表,根據 group 字段分類輸出,或提供菜單選擇組別查看。

關鍵代碼片段

// 保存到文件
void saveToFile(Contact *head) {
    FILE *fp = fopen("contacts.dat", "wb");
    Contact *p = head;
    while (p) {
        fwrite(p, sizeof(Contact), 1, fp);
        p = p->next;
    }
    fclose(fp);
}

// 從文件加載
Contact* loadFromFile() {
    FILE *fp = fopen("contacts.dat", "rb");
    if (!fp) return NULL;
    Contact *head = NULL, *tail = NULL;
    Contact temp;
    while (fread(&temp, sizeof(Contact), 1, fp)) {
        Contact *node = (Contact*)malloc(sizeof(Contact));
        *node = temp;
        node->next = NULL;
        if (!head) head = tail = node;
        else { tail->next = node; tail = node; }
    }
    fclose(fp);
    return head;
}

擴展建議

  • 引入雙向鏈表便於反向遍歷。
  • 使用 SQLite 替代二進制文件,支持更複雜查詢。
  • 添加圖形界面(Qt/GTK)提升用戶體驗。

總結

通過結構體鏈表+文件存儲,可完整實現帶分組的通訊錄核心功能。代碼結構清晰,易於維護與擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved