2015-10-20 98 views
-1

我正在嘗試不同的排序技術,用於C中的單鏈表。但是我堅持使用指針重排方法進行選擇排序。 這是到目前爲止我的代碼c中的鏈表的選擇排序

typedef struct node { 
    int data; 
    struct node *next; 
} Node; 



    void llselectionsort(Node *head) { 
    Node *marker, *cur = NULL, *min; 

    for(marker = head; marker != NULL; marker = marker->next){ 
     min = marker; 
     for(cur = marker->next; cur != NULL; cur = cur->next){ 
      if(cur->data < min->data) { 
       min = cur; 
      } 
    } 
    Node *tmp = marker; 
    marker = min; 
    tmp->next = marker->next; 
    min->next = tmp; 

}

}

我想我可能會使用一個比需要更少的指針,但我仍然不確定。任何幫助將不勝感激謝謝。

(注:我知道選擇排序被認爲是低效的,但是我想了解如何實現它無論對於較小的列表排序)

+1

你真正的問題是什麼?請解釋預期行爲,實際行爲以及與此相關的具體問題。 – kaylum

回答

0

這是更容易實現,如果你使用雙指針:

NODE * SortList(NODE * pList) 
{ 
NODE **ppNew = &pList;       /* used to traverse sorted list */ 
NODE **ppSml;         /* ptr to ptr to smallest node */ 
NODE **ppCur;         /* head or previous node */ 
NODE *pCur;          /* current node */ 
NODE *pTmp; 

    if(pList == NULL)       /* check for NULL list */ 
     return(pList); 
    while((*ppNew)->next != NULL){    /* while not at end list */ 
     ppSml = ppNew;       /* find smallest node */ 
     ppCur = &((*ppNew)->next); 
     while(NULL != (pCur = *ppCur)){ 
      if(pCur->data < (*ppSml)->data) 
       ppSml = ppCur; 
      ppCur = &((*ppCur)->next); 
     } 
/* for adjacent nodes, 3 pointers are rotated and the order of swaps matters */ 
     if(*ppNew != *ppSml){     /* if not the same node */ 
      pTmp = *ppNew;      /*  swap node ptrs */ 
      *ppNew = *ppSml; 
      *ppSml = pTmp; 
      pTmp = (*ppNew)->next;    /*  swap next ptrs */ 
      (*ppNew)->next = (*ppSml)->next; 
      (*ppSml)->next = pTmp; 
     } 
     ppNew = &((*ppNew)->next);    /* advance ppNew */ 
    }  
    return(pList); 
} 
0

您代碼的最後四行可以更改爲:
int tmp = marker-> data;
marker-data = min-> data;
min-> data = tmp;
希望它有幫助。