1. 头文件 #ifndef LIST_H #define LIST_H typedef int Item; struct node { Item item; struct node *next; }; // 单链表节点 // 链表函数 int ListInit(struct node **list); int ListAddItem(Item item,struct node *list); int ListPopItem(Item *pitem,struct node *list); void ListInsertSort(struct node *list); // 桶排序 int bucket_sort(Item A[],Item B[],int length); #endif 2.源文件 #include "list.h" #include <stdlib.h> #include <stdio.h> // ================================================== // 初始化,创建哨兵元素 // 注意,传入参数应该是链表头指针的地址,即指针的指针 // ================================================== int ListInit(struct node **list) { struct node *pnew; pnew = (struct node *)malloc(sizeof(struct node)); if(pnew == NULL) return 0; pnew->next = pnew; *list = pnew; return 1; } // ================================================== // 向链表头部添加元素 // ================================================== int ListAddItem(Item item,struct node *list) { struct node *pnew; pnew = (struct node *)malloc(sizeof(struct node)); if(pnew == NULL) return 0; pnew->item = item; pnew->next = list->next; // 添加到链表头部 list->next = pnew; return 1; } // ================================================== // 弹出链表第一个元素 // 若只有一个哨兵元素(即空链表),则返回0,但不删除哨兵元素 // 若链表中有元素,则弹出第一个元素的item,并将其所占内存收回 // ================================================== int ListPopItem(Item *pitem,struct node *list) { struct node *pnew; if(list->next == list) // 只有一个哨兵元素,返回0 return 0; pnew = list->next; *pitem = pnew->item; list->next = list->next->next; free(pnew); return 1; } // ================================================== // 对链表中的元素进行插入排序 // ================================================== void ListInsertSort(struct node *list) { struct node *pscan1, *pscan2; struct node *ptemp; int change_status = 0; // 初始化,没有节点交换 pscan1 = list->next; // 外层循环,从第2个有效元素开始 while(pscan1->next != list) // 到链表头,则遍历结束 { pscan2 = list; change_status = 0; while(pscan2 != pscan1) { if(pscan2->next->item > pscan1->next->item) // 大于,插入到psacn2和pscan2->next之前 { ptemp = pscan1->next; pscan1->next = ptemp->next; // 注意,此处改动了pscan1的next节点 ptemp->next = pscan2->next; pscan2->next = ptemp; change_status = 1; break; } else pscan2 = pscan2->next; } if(!change_status) // 未发生交换,则change_status下移 pscan1 = pscan1->next; } } // ================================================== // 桶排序 // A:要排序数组 B:存放结果数组,length:A元素个数 // ================================================== int bucket_sort(Item A[],Item B[],int length) { static struct node *pbucket[10]; int i,j = 0; // 桶初始化 for(i = 0; i < 10; i++) ListInit(&(pbucket[i])); // 将A分到各桶中 for(i = 0; i < length; i++) { if(!ListAddItem(A[i],pbucket[(A[i]/10)])) break; } if(i != length) return 0; // 排序 for(i = 0; i < 10; i++) ListInsertSort(pbucket[i]); // 取出数据 for(i = 0; i < 10; i++) { while(ListPopItem(&B[j],pbucket[i])) { j++; } free(pbucket[i]); } return 1; }