順序表是數據結構中最基礎的線性表實現方式之一,它利用一段連續的內存空間依次存儲數據元素。本文將通過完整的 C 語言代碼示例,詳細講解順序表的結構定義、初始化以及增、刪、改、查等核心操作的實現邏輯,幫助你從零構建一個功能完整的順序表管理程序。
首先,我們需要定義一個結構體來封裝順序表的屬性:數據存儲數組、最大容量以及當前長度。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 定義順序表的最大容量
typedef struct List {
int element[MAXSIZE]; // 存儲數據元素的數組
int len; // 當前順序表的有效長度
} List;
int IsEmpty(List *L) {
return (L->len == 0) ? 1 : 0; // 返回 1 表示空,0 表示非空
}
void GetElement(List *L, int i) {
if (i < 0 || i >= L->len) {
printf("索引越界!\n");
} else {
printf("第 %d 個元素為: %d\n", i, L->element[i]);
}
}
void Add(List *L) {
int count, i;
printf("請輸入要添加的元素個數: ");
scanf("%d", &count);
if (L->len + count > MAXSIZE) {
printf("剩餘空間不足,添加失敗!\n");
return;
}
printf("請依次輸入 %d 個整數:\n", count);
for (i = 0; i < count; i++) {
scanf("%d", &L->element[L->len + i]);
}
L->len += count;
printf("添加成功!當前長度: %d\n", L->len);
}
void Insert(List *L) {
int pos, val;
printf("請輸入插入位置 (0-%d) 和值: ", L->len);
scanf("%d %d", &pos, &val);
if (pos < 0 || pos > L->len || L->len == MAXSIZE) {
printf("插入失敗:位置非法或表已滿!\n");
return;
}
// 從末尾向前移動元素,騰出空位
for (int i = L->len; i > pos; i--) {
L->element[i] = L->element[i-1];
}
L->element[pos] = val;
L->len++;
printf("插入成功!\n");
}
void Delete(List *L, int pos) {
if (pos < 0 || pos >= L->len) {
printf("刪除失敗:索引越界!\n");
return;
}
// 從刪除位置開始,後續元素前移覆蓋
for (int i = pos; i < L->len - 1; i++) {
L->element[i] = L->element[i+1];
}
L->len--;
printf("刪除成功!\n");
}
void Modify(List *L, int pos) {
if (pos < 0 || pos >= L->len) {
printf("修改失敗:索引越界!\n");
return;
}
int newVal;
printf("請輸入新值: ");
scanf("%d", &newVal);
L->element[pos] = newVal;
printf("修改成功!\n");
}
void Show(List *L) {
if (L->len == 0) {
printf("順序表為空。\n");
return;
}
printf("當前順序表元素: ");
for (int i = 0; i < L->len; i++) {
printf("%d ", L->element[i]);
}
printf("\n");
}
void Clear(List *L) {
L->len = 0;
printf("順序表已清空。\n");
}
通過 switch-case 構建命令行交互界面,實現功能的動態調用。
int main() {
List *L = (List *)malloc(sizeof(List));
L->len = 0;
int choice, index;
// 初始添加一些數據
printf("=== 順序表管理系統 ===\n");
Add(L);
while (1) {
printf("\n******************************************************\n");
printf(" 1.判斷是否為空 2.查詢元素 3.尾部添加 4.刪除元素\n");
printf(" 5.指定位置插入 6.顯示所有 7.修改元素 8.清空表 0.退出\n");
printf("******************************************************\n");
printf("請輸入選項: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf(IsEmpty(L) ? "順序表為空\n" : "順序表非空\n");
break;
case 2:
printf("輸入查詢索引: "); scanf("%d", &index); GetElement(L, index); break;
case 3: Add(L); break;
case 4:
printf("輸入刪除索引: "); scanf("%d", &index); Delete(L, index); break;
case 5: Insert(L); break;
case 6: Show(L); break;
case 7:
printf("輸入修改索引: "); scanf("%d", &index); Modify(L, index); break;
case 8: Clear(L); break;
case 0:
free(L);
printf("感謝使用,再見!\n");
exit(0);
default: printf("輸入錯誤,請重新輸入!\n");
}
}
return 0;
}
0 <= i < len)及容量上限(len < MAXSIZE)。realloc 實現動態擴容。掌握順序表的實現,是理解鏈表、棧、隊列等高級數據結構的基石。建議動手敲碼,並在調試中體會指針與數組操作的細節差異。