链表实现直接选择排序

#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;
}


  



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值