順序表是數據結構基礎,以數組為底層存儲,支持隨機訪問。本文提供完整的 C 語言實現,包含動態擴容、前插/後插、按值/位置刪除、查找等核心操作,並附帶測試用例。
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct SeqList {
DataType *element; // 動態數組
int n; // 當前長度
int MAXNUM; // 最大容量
} *PSeqList;
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;
}
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;
}
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;
}
// 後插(無擴容,調用者需保證空間)
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* + 函數指針)。