順序表是線性表的一種鏈式存儲結構,通過一組地址連續的存儲單元依次存儲數據元素,邏輯上相鄰的元素在物理位置上也相鄰。本質上是動態數組,支持隨機訪問,插入刪除需移動元素。
#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;
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;
}
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;
}
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;
}
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;
}
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++ 風格引用參數,邏輯相似但更通用。
第三個示例簡化為整數類型,包含初始化、創建、輸出、銷毀、插入等完整操作,適合初學者理解基本原理。
std::vector 或 C 動態數組封裝庫。malloc/realloc 後必須檢查返回值,用完需 free。