链表实现直接选择排序

来源:互联网 发布:淘宝怎么发布二手闲置 编辑:程序博客网 时间: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;}