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

C 語言通訊錄實現:結構體 + 動態陣列支援一人多號碼

     編輯:程式設計綜合問答

需求:設計通訊錄結構,支援單一聯繫人儲存多個電話號碼(最多 10 個),提供初始化、新增、顯示功能。

資料結構設計

#define MAX_PHONES 10
#define NAME_LEN 30

typedef struct {
    char name[NAME_LEN];
    char *phones[MAX_PHONES];  // 指標陣列,指向動態分配的字串
    int count;                 // 當前號碼數量
} Contact;

核心函式實現

初始化

void contact_init(Contact *c, const char *name) {
    strncpy(c->name, name, NAME_LEN - 1);
    c->name[NAME_LEN - 1] = '\0';
    c->count = 0;
    for (int i = 0; i < MAX_PHONES; i++) c->phones[i] = NULL;
}

新增號碼(動態分配記憶體)

bool contact_add_phone(Contact *c, const char *phone) {
    if (c->count >= MAX_PHONES) return false;
    size_t len = strlen(phone) + 1;
    c->phones[c->count] = malloc(len);
    if (!c->phones[c->count]) return false;
    memcpy(c->phones[c->count], phone, len);
    c->count++;
    return true;
}

顯示

void contact_display(const Contact *c) {
    printf("Name: %s\n", c->name);
    for (int i = 0; i < c->count; i++) {
        printf("  Phone %d: %s\n", i + 1, c->phones[i]);
    }
}

釋放記憶體(防洩漏)

void contact_destroy(Contact *c) {
    for (int i = 0; i < c->count; i++) {
        free(c->phones[i]);
        c->phones[i] = NULL;
    }
    c->count = 0;
}

主程式測試

int main(void) {
    Contact c;
    contact_init(&c, "王小二");
    contact_add_phone(&c, "13123454435");
    contact_add_phone(&c, "13123454123");
    contact_add_phone(&c, "13123454356");
    contact_display(&c);
    contact_destroy(&c);
    return 0;
}

進階擴充方向

  • 動態擴容:`phones` 改為 `char **`,滿時 `realloc` 擴大容量。
  • 檔案持久化:序列化為 JSON/CSV/二進制,支援載入/儲存。
  • 查找優化:姓名 Hash 表或 Trie 樹,實現 O(1)/O(k) 查找。
  • 執行緒安全:加入 `pthread_mutex_t` 保護共享通訊錄。

掌握「結構體 + 指標陣列 + 動態記憶體」模式,是 C 語言實現變長資料集合的基礎範式。

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