指標陣列(char *ptr[N])常用於儲存多條字串,每個元素指向動態分配的字串緩衝區。優點:字串長度可變、排序/插入時僅交換指標、不移動實際字串資料,效率高。
low=0, high=n-1, mid=(low+high)/2。ptr[mid] 與目標字串:high = mid-1low = mid+1low > high,未找到回傳 NULL。char *binary(char *ptr[], char *str, int n) {
int low = 0, high = n-1, mid;
while (low <= high) {
mid = (low + high) / 2;
int cmp = strcmp(str, ptr[mid]);
if (cmp < 0) high = mid - 1;
else if (cmp > 0) low = mid + 1;
else return str; // 找到
}
return NULL; // 未找到
}
主程式動態配置每字串 20 位元組緩衝區(malloc(20)),讀入 5 條字串後呼叫 binary() 搜尋。
i(0~n)。i 之後的指標向後搬移:for(j=n; j>i; j--) ptr[j] = ptr[j-1];ptr[i]。int binary(char *ptr[], char *str, int n) {
int low = 0, high = n-1, mid;
if (strcmp(str, ptr[0]) < 0) return 0; // 插入最前
if (strcmp(str, ptr[high]) > 0) return n; // 插入最後
while (low <= high) {
mid = (low + high) / 2;
int cmp = strcmp(str, ptr[mid]);
if (cmp < 0) high = mid - 1;
else if (cmp > 0) low = mid + 1;
else return mid; // 重複字串,插入該位置
}
return low; // 中間位置
}
void insert(char *ptr[], char *str, int n, int i) {
for (int j = n; j > i; j--)
strcpy(ptr[j], ptr[j-1]); // 向後搬移
strcpy(ptr[i], str); // 放入新字串
}
ptr[6],預留一個空位給插入。malloc(20) 配置緩衝區,確保搬移時不會越界。strcpy 溢位。binary() 取得插入索引 i。insert() 完成插入。此技巧廣泛應用於編輯器緩衝區、命令歷史、動態選單等需維持順序的字串集合管理。