链表实现直接选择排序
来源:互联网 发布:淘宝怎么发布二手闲置 编辑:程序博客网 时间:2024/06/08 11:26
#include"stdio.h"#include"stdlib.h"/****************************************************copyright: self_chouFilename: directsort.cAUthour : self_chou Version: 1.0 Date: 2012.07Description: 用链表实现直接选择排序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;}