#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; }
链表实现直接选择排序
最新推荐文章于 2021-12-07 09:13:28 发布