#include"stdio.h" #include"stdlib.h" /**************************************************** copyright: self_chou Filename: directsort.c AUthour : self_chou Version: 1.0 Date: 2012.07 Description: 用鏈表實現直接選擇排序 Function List: find(); 尋找鏈表中最小的結點並返回 change();交換鏈表中指定結點的位置 sort(); 調用前兩個函數實現功能 *******************************************************/ typedef struct node { int num; struct node *next; }node; node *head = NULL; node *last = NULL; node *flag = NULL; //用來記錄結點交換的位置,從鏈表頭開始 print() { node *p = head; while(p != NULL) { printf("%d ",p->num); p = p->next; } printf("\n"); } node * find(node *head) { node *min = head; while(head != NULL) { if(head->num < min->num) //找指定頭結點鏈表中最小的結點 { min = head; } head = head->next; } return min; } void change(node *q,node *p) { node *pfront = NULL; node *qfront = NULL; node *find = head; node *temp = NULL; if( p == q) //交換分,是不是頭結點,和結點相不相鄰,四種情況 { flag = p; return; } while( find != q) { qfront = find; find = find->next; } find = head; while( find != p) { pfront = find; find = find->next; } if( pfront == NULL) { if( qfront == head) { p->next = q->next; q->next = p; head = q; flag = q; } else { temp = p->next; //注意temp指向next,這兒犯錯了。。。 qfront->next = p; p->next = q->next; q->next = temp; head = q; flag = q; } } else { if( qfront == p) { pfront->next = q; p->next = q->next; q->next = p; flag = q; } else { temp = q->next; pfront->next = q; q->next =p->next; qfront->next = p; p->next = temp; flag = q; } } } void sort() { node *p = head; node *min = NULL; //實現程序的主要功能 int n = 4; while(p != NULL) { min = find(p); change(min,p); p = flag; p = p->next; } } int main() { int i ; int get; printf("please input the six num:\n"); for(i = 1;i <= 6;i++) { scanf("%d",&get); node *p = (node *)malloc(sizeof(node)); p->num = get; if(head == NULL) { head = p; last = p; } else { last->next =p; last = p; } last->next = NULL; } printf("排序前\n"); print(); flag = head; sort(); printf("排序後\n"); print(); return 0; }