首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言實現順序表(動態數組)完整指南與代碼詳解

     編輯:關於C語言

什麼是順序表?

順序表是線性表的一種鏈式存儲結構,通過一組地址連續的存儲單元依次存儲數據元素,邏輯上相鄰的元素在物理位置上也相鄰。本質上是動態數組,支持隨機訪問,插入刪除需移動元素。

核心數據結構定義

#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10

typedef struct Point {
    int x;
    int y;
} Point;

typedef Point ElemType;

typedef struct {
    ElemType *elem;   // 數據基址
    int length;       // 當前長度
    int listsize;     // 最大容量
} Sqlist;

關鍵操作實現

1. 初始化

int list_init(Sqlist *mylist) {
    mylist->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!mylist->elem) return 1; // 分配失敗
    mylist->length = 0;
    mylist->listsize = LIST_INIT_SIZE;
    return 0;
}

2. 插入元素(支持動態擴容)

int list_insert(Sqlist *mylist, ElemType data) {
    if (mylist->length >= mylist->listsize) {
        ElemType *newbase = (ElemType *)realloc(mylist->elem,
            (mylist->listsize + LIST_INCREMENT) * sizeof(ElemType));
        if (!newbase) return 1;
        mylist->elem = newbase;
        mylist->listsize += LIST_INCREMENT;
    }
    mylist->elem[mylist->length++] = data; // 結構體直接賦值
    return 0;
}

3. 查找元素

int elem_cmp(ElemType d1, ElemType d2) {
    return (d1.x == d2.x && d1.y == d2.y);
}

int list_find(Sqlist *mylist, ElemType data) {
    for (int i = 0; i < mylist->length; i++)
        if (elem_cmp(mylist->elem[i], data)) return i + 1; // 返回 1-based 位置
    return 0;
}

4. 刪除元素

int list_delete(Sqlist *mylist, ElemType data) {
    int pos = list_find(mylist, data);
    if (!pos) return 1; // 未找到
    for (int i = pos - 1; i < mylist->length - 1; i++)
        mylist->elem[i] = mylist->elem[i + 1];
    mylist->length--;
    return 0;
}

5. 遍歷顯示

int list_disp(Sqlist mylist) {
    system("clear"); // Linux/Unix; Windows 用 system("cls")
    for (int i = 0; i < mylist.length; i++)
        printf("{%d,%d}\t", mylist.elem[i].x, mylist.elem[i].y);
    printf("\n");
    return 0;
}

完整測試主程序

int main() {
    Sqlist mylist;
    list_init(&mylist);
    
    Point p1 = {11, 12};
    list_insert(&mylist, p1);
    list_disp(mylist);
    
    Point p2 = {21, 22};
    list_insert(&mylist, p2);
    list_disp(mylist);
    
    list_delete(&mylist, p2);
    list_disp(mylist);
    
    free(mylist.elem); // 記得釋放內存
    return 0;
}

進階版:帶鍵值的順序表

第二個示例展示了帶關鍵字的順序表,支持指定位置插入/刪除,採用 C++ 風格引用參數,邏輯相似但更通用。

第三種實現:純整數順序表

第三個示例簡化為整數類型,包含初始化、創建、輸出、銷毀、插入等完整操作,適合初學者理解基本原理。

總結與最佳實踐

  • 順序表優點:隨機訪問 O(1),內存連續,緩存友好。
  • 缺點:插入刪除平均 O(n),需預分配或動態擴容。
  • 實際開發建議使用 C++ std::vector 或 C 動態數組封裝庫。
  • 注意內存管理:malloc/realloc 後必須檢查返回值,用完需 free。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved