在數據結構中,線性表的順序存儲是指用一組地址連續的存儲單元依次存儲線性表的數據元素。本文實現了一個基於動態數組的順序表,支持增、刪、改、查、插入、追加等操作,並提供菜單交互界面。
// 順序表結構
typedef struct {
int *data; // 動態分配的數組指針
int length; // 當前長度
int capacity; // 容量
} SeqList;
SeqList* createList(int capacity) {
SeqList *L = (SeqList*)malloc(sizeof(SeqList));
L->data = (int*)malloc(capacity * sizeof(int));
L->length = 0;
L->capacity = capacity;
return L;
}
void destroyList(SeqList *L) {
free(L->data);
free(L);
}
int append(SeqList *L, int val) {
if (L->length == L->capacity) return 0; // 滿
L->data[L->length++] = val;
return 1;
}
int insert(SeqList *L, int pos, int val) {
if (pos < 1 || pos > L->length + 1) return 0; // 位置非法
if (L->length == L->capacity) return 0; // 滿
for (int i = L->length; i >= pos; i--)
L->data[i] = L->data[i-1];
L->data[pos-1] = val;
L->length++;
return 1;
}
int deletePos(SeqList *L, int pos) {
if (pos < 1 || pos > L->length) return 0;
for (int i = pos; i < L->length; i++)
L->data[i-1] = L->data[i];
L->length--;
return 1;
}
int modify(SeqList *L, int pos, int val) {
if (pos < 1 || pos > L->length) return 0;
L->data[pos-1] = val;
return 1;
}
int find(SeqList *L, int val) {
for (int i = 0; i < L->length; i++)
if (L->data[i] == val) return i+1; // 返回1-based位置
return -1;
}
void printList(SeqList *L) {
for (int i = 0; i < L->length; i++)
printf("%d ", L->data[i]);
printf("\n");
}
#include <stdio.h>
#include <stdlib.h>
typedef struct { int *data; int length, capacity; } SeqList;
SeqList* init(int cap) {
SeqList *L = malloc(sizeof(SeqList));
L->data = malloc(cap * sizeof(int));
L->capacity = cap; L->length = 0;
return L;
}
void menu() {
puts("\n1. Append 2. Insert 3. Delete 4. Modify 5. Find 6. Show 0. Exit");
}
int main() {
int cap; printf("Capacity: "); scanf("%d", &cap);
SeqList *L = init(cap);
int op, pos, val;
while (1) {
menu(); printf("Choice: "); scanf("%d", &op);
if (op == 0) break;
switch (op) {
case 1: printf("Value: "); scanf("%d", &val);
append(L, val) ? puts("OK") : puts("Full"); break;
case 2: printf("Pos Value: "); scanf("%d%d", &pos, &val);
insert(L, pos, val) ? puts("OK") : puts("Invalid"); break;
case 3: printf("Pos: "); scanf("%d", &pos);
deletePos(L, pos) ? puts("OK") : puts("Invalid"); break;
case 4: printf("Pos Value: "); scanf("%d%d", &pos, &val);
modify(L, pos, val) ? puts("OK") : puts("Invalid"); break;
case 5: printf("Value: "); scanf("%d", &val);
pos = find(L, val);
pos > 0 ? printf("Found at %d\n", pos) : puts("Not found"); break;
case 6: printList(L); break;
}
}
destroyList(L);
return 0;
}
malloc 分配數組,靈活指定容量。free 釋放內存,防止洩漏。malloc 返回值,可能導致空指針解引用。realloc),支持不限長度。void* 存儲任意類型數據。