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

C語言順序表完整實現:動態擴容、增刪查操作與測試驗證

     編輯:關於C

順序表是數據結構基礎,以數組為底層存儲,支持隨機訪問。本文提供完整的 C 語言實現,包含動態擴容、前插/後插、按值/位置刪除、查找等核心操作,並附帶測試用例。

數據結構定義

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;

typedef struct SeqList {
    DataType *element;  // 動態數組
    int n;              // 當前長度
    int MAXNUM;         // 最大容量
} *PSeqList;

核心操作實現

1. 創建空表(帶容量檢查)

PSeqList createNullList_seq(int m) {
    PSeqList palist = (PSeqList)malloc(sizeof(struct SeqList));
    if (!palist) return NULL;
    
    palist->element = (DataType*)malloc(sizeof(DataType) * m);
    if (!palist->element) {
        free(palist);
        return NULL;
    }
    
    palist->MAXNUM = m;
    palist->n = 0;
    return palist;
}

2. 判空與查找

int isNullList_Seq(PSeqList palist) {
    return (palist->n == 0);
}

int locate_seq(PSeqList palist, DataType x) {
    for (int q = 0; q < palist->n; q++)
        if (palist->element[q] == x) return q;
    return -1;
}

3. 前插操作(含動態擴容)

int insertPre_seq(PSeqList palist, int p, DataType x) {
    // 滿容時擴容 2倍
    if (palist->n >= palist->MAXNUM) {
        DataType *pos1 = (DataType*)malloc(sizeof(DataType) * palist->MAXNUM * 2);
        if (!pos1) return 0;
        for (int q = 0; q < palist->MAXNUM; q++) pos1[q] = palist->element[q];
        free(palist->element);
        palist->element = pos1;
        palist->MAXNUM *= 2;
    }
    
    if (p < 0 || p > palist->n) return 0;  // 位置非法
    
    // 後移元素騰出位置
    for (int q = palist->n - 1; q >= p; q--)
        palist->element[q+1] = palist->element[q];
    
    palist->element[p] = x;
    palist->n++;
    return 1;
}

4. 後插、刪除、按值刪除

// 後插(無擴容,調用者需保證空間)
int insertPost_seq(PSeqList palist, int p, DataType x) {
    if (p < 0 || p > palist->n) return 0;
    for (int q = palist->n - 1; q >= p+1; q--)
        palist->element[q+1] = palist->element[q];
    palist->element[p+1] = x;
    palist->n++;
    return 1;
}

// 按位置刪除
int deleteP_seq(PSeqList palist, int p) {
    if (p < 0 || p > palist->n - 1) return 0;
    for (int q = p; q < palist->n - 1; q++)
        palist->element[q] = palist->element[q+1];
    palist->n--;
    return 1;
}

// 按值刪除(首次出現)
int deleteV_seq(PSeqList palist, DataType x) {
    int q = locate_seq(palist, x);
    return (q != -1) ? deleteP_seq(palist, q) : 0;
}

測試驗證

int main() {
    PSeqList list1 = createNullList_seq(50);
    
    insertPre_seq(list1, 0, 12);
    insertPre_seq(list1, 1, 22);
    insertPre_seq(list1, 2, 32);
    insertPost_seq(list1, 3, 43);
    insertPost_seq(list1, 3, 53);
    insertPost_seq(list1, 4, 63);
    insertPost_seq(list1, 1, 73);
    
    int i = locate_seq(list1, 73);
    printf("%d", i);  // 輸出位置
    return 0;
}

複雜度與改進方向

操作時間複雜度空間複雜度
查找/按值刪除O(n)O(1)
按位置插入/刪除O(n)O(1)
動態擴容O(n) 均攤 O(1)O(n)

改進建議:引入縮容策略、實現迭代器模式、添加邊界檢查斷言、支持泛型(void* + 函數指針)。

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