不帶頭結點的單向鏈表排序——插入排序(C語言)

LinkList* LinkListInsertSort(LinkList* pHead)
{
    LinkList *pFirst = (LinkList *)NULL;      /* 原鏈表剩下未排序節點的頭指針 */
    LinkList *pCurrInsert = (LinkList *)NULL; /* 無序鏈表中當前待插入節點 */
    LinkList *pPrev = (LinkList *)NULL;      /* 有序鏈表中插入位置的前一個節點 */
    LinkList *pPost = (LinkList *)NULL;      /* 有序鏈表中插入位置的有一個節點 */

    pFirst = pHead->m_next; /* 原鏈表未排序鏈表的頭節點 */
    pHead->m_next = NULL;   /* 僅含有一個節點的有序鏈表 */

    while (NULL != pFirst)/* 遍歷剩下無序的鏈表 */
    {
        pCurrInsert = pFirst;
        pPost = pHead;
        while ((NULL != pPost) && (pPost->m_key < pCurrInsert->m_key))
        {
            pPrev = pPost;
            pPost = pPost->m_next;
        }
        pFirst = pFirst->m_next;

        if (pPost == pHead) /* 節點pCurr要插在第一個節點之前 */
        {
            pHead = pCurrInsert;
        }
        else /* pPrev是pPost的前驅 */
        {
            pPrev->m_next = pCurrInsert;
        }
        pCurrInsert->m_next = pPost; /* 插入節點pCurrInsert */
    }
    
    return pHead;
}

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