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

線性表順序存儲結構 C 語言實現:初始化、增刪改查完整代碼

     編輯:關於C語言

線性表順序存儲結構 C 語言實現:初始化、增刪改查完整代碼

順序表(動態數組)是線性表最基礎的存儲結構。本文提供一個完整、可編譯運行的 C 實現,包含初始化、尾插、指定位置插入/刪除、查找、遍歷、判空、銷毀等核心操作,並附帶測試主函數與運行結果。

數據結構定義

#define MAXSIZE 100
typedef int ElemType;

typedef struct {
    ElemType data[MAXSIZE];
    int length;
} SqList;

核心操作實現

1. 初始化

SqList* InitList() {
    SqList *L = malloc(sizeof(SqList));
    if (!L) return NULL;
    L->length = 0;
    return L;
}

2. 尾插入

int InsertRear(SqList *L, ElemType e) {
    if (L->length >= MAXSIZE) return -1; // 滿
    L->data[L->length++] = e;
    return 0;
}

3. 指定位置插入 (0-based 索引)

int InsertAt(SqList *L, int pos, ElemType e) {
    if (L->length >= MAXSIZE || pos < 0 || pos > L->length) return -1;
    for (int i = L->length; i > pos; i--) L->data[i] = L->data[i-1]; // 後移
    L->data[pos] = e;
    L->length++;
    return 0;
}

4. 指定位置刪除

int DeleteAt(SqList *L, int pos, ElemType *e) {
    if (L->length == 0 || pos < 0 || pos >= L->length) return -1;
    *e = L->data[pos];
    for (int i = pos; i < L->length - 1; i++) L->data[i] = L->data[i+1]; // 前移
    L->length--;
    return 0;
}

5. 按值查找 (返回索引,-1 表未找到)

int FindByValue(SqList *L, ElemType e) {
    for (int i = 0; i < L->length; i++)
        if (L->data[i] == e) return i;
    return -1;
}

6. 按位查找 (返回元素值,錯誤返回 -1)

int GetElem(SqList *L, int pos) {
    if (pos < 0 || pos >= L->length) return -1;
    return L->data[pos];
}

7. 遍歷打印

void PrintList(SqList *L) {
    if (L->length == 0) { puts("List is empty"); return; }
    for (int i = 0; i < L->length; i++) printf("%5d", L->data[i]);
    putchar('\n');
}

8. 判空與銷毀


int IsEmpty(SqList *L) { return L->length == 0; }
void DestroyList(SqList *L) { free(L); }

測試主程序

int main() {
    SqList *L = InitList();
    int vals[] = {1,2,3,4,5};
    for (int v : vals) InsertAt(L, 0, v); // 頭插建表:5 4 3 2 1
    PrintList(L);

    int tmp;
    while (!IsEmpty(L)) {
        DeleteAt(L, 0, &tmp);
        printf("Deleted: %d\n", tmp);
    }
    PrintList(L);
    DestroyList(L);
    return 0;
}

運行結果

    5    4    3    2    1
Deleted: 5
Deleted: 4
Deleted: 3
Deleted: 2
Deleted: 1
List is empty

複雜度分析

操作平均時間最壞時間空間
尾插O(1)O(1)O(1)
指定位置插入/刪除O(n)O(n)O(1)
按值查找O(n)O(n)O(1)
按位查找O(1)O(1)O(1)

避坑指南

  • 邊界檢查:插入位置允許 pos == length(尾後),刪除位置 pos < length;
  • 動態擴容:生產代碼中滿時應 realloc 擴容(倍增策略),而非固定 MAXSIZE;
  • 內存洩漏:銷毀時務必 free;
  • 類型泛化:實際項目用 void* + size_t 實現泛型順序表。

這個順序表實現雖簡單,卻是動態數組、Vector、ArrayList 等高級容器的內核原型。徹底理解它,是掌握數據結構的第一步。

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