本實例展示單鏈表的完整操作:節點創建、選擇排序、節點刪除、鏈表拼接。
create_list:根據數組動態創建鏈表,返回頭指針。selection_sort:選擇排序,每輪找最小節點輸出並從鏈表中刪除(破壞性排序)。delete_node:支持刪除首節點、尾節點、中間節點。concatenate:將第二個鏈表接在第一個鏈表尾部。// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鳥教程. All rights reserved.
//
#include <stdlib.h>
#include <stdio.h>
struct list {
int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
link delete_node(link pointer, link tmp) {
if (tmp == NULL) return pointer->next;
else {
if (tmp->next->next == NULL) tmp->next = NULL;
else tmp->next = tmp->next->next;
return pointer;
}
}
void selection_sort(link pointer, int num) {
link tmp, btmp;
int i, min;
for (i = 0; i < num; i++) {
tmp = pointer;
min = tmp->data;
btmp = NULL;
while (tmp->next) {
if (min > tmp->next->data) {
min = tmp->next->data;
btmp = tmp;
}
tmp = tmp->next;
}
printf("%d\n", min);
pointer = delete_node(pointer, btmp);
}
}
link create_list(int array[], int num) {
link tmp1, tmp2, pointer;
int i;
pointer = (link)malloc(sizeof(node));
pointer->data = array[0];
tmp1 = pointer;
for (i = 1; i < num; i++) {
tmp2 = (link)malloc(sizeof(node));
tmp2->next = NULL;
tmp2->data = array[i];
tmp1->next = tmp2;
tmp1 = tmp1->next;
}
return pointer;
}
link concatenate(link pointer1, link pointer2) {
link tmp = pointer1;
while (tmp->next) tmp = tmp->next;
tmp->next = pointer2;
return pointer1;
}
void main(void) {
int arr1[] = {3, 12, 8, 9, 11};
link ptr;
ptr = create_list(arr1, 5);
selection_sort(ptr, 5);
}
3
8
9
11
12
selection_sort 會破壞原鏈表結構(刪除節點),排序後原鏈表不可用。malloc 返回值。concatenate 未在主函數中調用,僅作為演示函數存在。