鏈表實現直接選擇排序

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


  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章