1. 程式人生 > >迴圈單鏈表簡單選擇排序

迴圈單鏈表簡單選擇排序

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode{
    int data ;
    struct LNode *next ;
}LNode , *LinkList;

LinkList Createlist( LinkList L){
    int num ;
    LNode *p , *r = L ;
    printf("請輸入資料:\n");
    scanf("%d",&num) ;
    while( num!= -1 ){
        p = (LNode *)malloc(sizeof(LNode));
        p->data = num ;
        r->next = p ;
        r = p ;
        scanf("%d",&num) ;
    }
    r->next = L ;                     //將尾指標指向頭結點
    return L ;
}

void ViewLinklist( LinkList L ){
    LNode *p = (LNode *)malloc(sizeof(LNode));
    p = L->next ;
    printf("迴圈單鏈表為:");
    while( p!=L ){
        printf("%d ->",p->data);
        p = p->next ;
    }
    printf("%d",p->data);
}

void SelectSort ( LinkList L  ){
    LNode *p = (LNode *)malloc(sizeof(LNode)) ;
    LNode *pre = (LNode *)malloc(sizeof(LNode)) ;
    LNode *minp = (LNode *)malloc(sizeof(LNode)) ;
    LNode *minpre = (LNode *)malloc(sizeof(LNode)) ;
    while(L->next!=L){                 //表不空,迴圈
        p = L->next ; pre = L ;
        minp = p ; minpre = pre ;
        while(p!=L){                   //注意迴圈單鏈表進行一次排序的條件
            if(p->data < minp->data){
                minp = p ;
                minpre = pre;
            }
            pre = p ;
            p = p->next ;
        }
        printf("%d ",minp->data);
        minpre->next = minp ->next ;
        free(minp);
    }
    free(L);
}

int main()
{
    LinkList L = (LinkList )malloc(sizeof(LNode));
    Createlist( L) ;
    ViewLinklist(L);
    printf("\n");
    printf("簡單選擇排序:");
    SelectSort(L);
    return 0;
}