原代碼存在三大邏輯錯誤:輸入先於初始化、刪除位置判斷錯誤、主函數調用順序顛倒。以下為修正後完整代碼(C++ 風格,兼容 C):
InitList 分配內存並設置 length=0,隨後循環讀取數據並賦值 elem[i]、遞增 length。i 為 0 基索引,合法範圍 0 <= i < length;刪除 k 個元素需 i+k <= length;元素前移循環 for(j=i+k; j。 #include
#include
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *elem;
int length;
int listsize;
} SeqList;
Status InitList(SeqList &L, int n = MAXSIZE) {
if (n <= 0) n = MAXSIZE;
L.elem = (ElemType*)malloc(n * sizeof(ElemType));
if (!L.elem) exit(ERROR);
L.length = 0;
L.listsize = n;
return OK;
}
Status DeleteK(SeqList &L, int i, int k) { // 刪除第 i 個起的 k 個元素 (0-based)
if (i < 0 || i >= L.length || k < 0 || i + k > L.length) return ERROR;
for (int j = i + k; j < L.length; j++)
L.elem[j - k] = L.elem[j];
L.length -= k;
return OK;
}
int main() {
SeqList La;
InitList(La, 10);
cout << "請輸入 10 個整數:" << endl;
for (int i = 0; i < 10; i++) {
cin >> La.elem[i];
La.length++;
}
cout << "刪除前: ";
for (int i = 0; i < La.length; i++) cout << La.elem[i] << ' ';
cout << endl;
DeleteK(La, 3, 5); // 刪除索引 3 起的 5 個元素
cout << "刪除後: ";
for (int i = 0; i < La.length; i++) cout << La.elem[i] << ' ';
cout << endl;
free(La.elem);
return 0;
}
輸入: 1 2 3 4 5 6 7 8 9 10
刪除前: 1 2 3 4 5 6 7 8 9 10
刪除後: 1 2 3 9 10
掌握順序表「先分配、再賦值、後移刪除」的標準流程,是數據結構考試與實戰的基礎。