本程式示範單向鏈結串列的動態建立、列印與選擇排序(Selection Sort)。包含節點定義、建立函式、排序函式與主程式測試。
typedef struct STRUCT {
int value;
struct STRUCT *next;
} TS;
CreateLinkTS *CreateLink(int *a, int n) {
TS *h = NULL, *p;
for (int i = n; i > 0; i--) { // 逆序插入,保持陣列順序
p = (TS *)malloc(sizeof(TS));
p->value = a[i-1];
p->next = h;
h = p;
}
return h;
}
sort(指標操作版)void sort(TS **h) {
TS *h1, *p, *q, *r, *s;
h1 = p = (TS *)malloc(sizeof(TS)); // 虛擬頭節點
p->next = *h;
while (p->next) { // 外層:已排序部分尾節點 p
q = p->next; // 當前待排序區首節點
r = p; // 記錄最小值前驅節點
while (q->next) { // 內層:尋找最小值節點
if (q->next->value < r->next->value)
r = q;
q = q->next;
}
if (r != p) { // 找到更小值,移動節點至 p 之後
s = r->next;
r->next = s->next;
s->next = p->next;
p->next = s;
}
p = p->next; // 推進已排序邊界
}
*h = h1->next; // 更新頭指標
free(h1); // 釋放虛擬頭節點
}
int main() {
#define N 9
int a[N], i;
TS *head, *p;
randomize();
for (i = 0; i < N; i++) a[i] = random(9); // 產生 0~8 隨機數
head = CreateLink(a, N);
for (p = head; p; p = p->next) printf("%-2d", p->value);
putchar('\n');
sort(&head);
for (p = head; p; p = p->next) printf("%-2d", p->value);
getchar();
return 0;
}
| 指標 | 角色 |
|---|---|
h1 | 虛擬頭節點,固定錨點 |
p | 已排序區尾節點,逐步後移 |
q | 掃描指標,遍歷未排序區 |
r | 最小值節點的前驅 |
s | 最小值節點本身(r->next) |