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

C語言通訊錄數據結構實戰:順序表與鏈表完整實現指南

     編輯:程式設計綜合問答

項目需求拆解

實現通訊錄管理系統,核心功能:

  1. 定義結構體:姓名、電話
  2. 順序表:創建、遍歷、插入、刪除、查找
  3. 鏈表:實現相同功能

順序表實現框架

#define MAX_SIZE 100

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

typedef struct {
    Contact data[MAX_SIZE];
    int length;
} SeqList;

// 初始化
void InitList(SeqList *L) { L->length = 0; }

// 插入(第i位置前插入x)
bool ListInsert(SeqList *L, int i, Contact x) {
    if (i < 1 || i > L->length + 1) return false;
    for (int j = L->length; j >= i; j--) 
        L->data[j] = L->data[j-1];
    L->data[i-1] = x;
    L->length++;
    return true;
}

// 刪除第i個
bool ListDelete(SeqList *L, int i, Contact *e) {
    if (i < 1 || i > L->length) return false;
    *e = L->data[i-1];
    for (int j = i; j < L->length; j++)
        L->data[j-1] = L->data[j];
    L->length--;
    return true;
}

鏈表實現框架

typedef struct Node {
    Contact data;
    struct Node *next;
} Node, *LinkList;

// 創建節點
Node* CreateNode(Contact x) {
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = NULL;
    return p;
}

// 插入(在第i個節點前)
bool ListInsert(LinkList *L, int i, Contact x) {
    Node *p = *L, *s = CreateNode(x);
    int j = 0;
    while (p && j < i-1) { p = p->next; j++; }
    if (!p) return false;
    s->next = p->next;
    p->next = s;
    return true;
}

核心對比

操作順序表鏈表
查找O(1)下標 / O(n)值O(n)
插入/刪除O(n)移動元素O(1)修改指針(找到位置後)
空間靜態分配/預分配動態分配
適合場景查多改少、數據量固定增刪頻繁、數據量不定

學習建議

  1. 先手寫順序表版本,理解數組操作邏輯
  2. 再實現鏈表版本,掌握指針操作技巧
  3. 重點調試:邊界條件(i=1, i=length+1)、空表、滿表
  4. 添加文件持久化(fread/fwrite)加分項

數據結構學習核心:理解抽象數據類型(ADT),熟練基本操作實現。通訊錄是完美的入門項目。

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