1. 程式人生 > >資料結構——有序連結串列合併(C語言版)

資料結構——有序連結串列合併(C語言版)

有序連結串列合併

兩個有序的連結串列,要求將其合併為一個連結串列,並且該連結串列保持有序!!

這裡所講的是連結串列升序

這裡我們的實驗資料,以及思路如圖所示!!
實驗資料:
連結串列1:1, 3, 5, 7
連結串列2:1, 2, 4 ,5
這裡寫圖片描述

關於合併的部分程式碼!

// 合併兩個有序單鏈表,合併後依然有序 (升序)
PNode MergeSList(PNode pHead1, PNode pHead2)
{
    if (pHead1 == NULL && pHead2 == NULL)
    {
        return NULL;
    }

PNode pNewHead = NULL;
PNode pCur1 = pHead1;
PNode pCur2 = pHead2;
PNode pCur = NULL;

if (pCur1->_data > pCur2->_data)             //選擇頭結點
{
    pNewHead = pCur2;
    pCur2 = pCur2->_pNext;
}
else
{
    pNewHead = pCur1;
    pCur1 = pCur1->_pNext;
}

pCur = pNewHead;
while (pCur1 && pCur2)                   //當pCur1 以及 pCur2 均不為空時  進入迴圈
{
    if (pCur1->_data < pCur2->_data)     //迴圈中選擇data較小的結點連結到pcur的後面
    {
        pCur->_pNext = pCur1;
        pCur1 = pCur1->_pNext;
        pCur = pCur->_pNext;
    }
    else
    {
        pCur->_pNext = pCur2;
        pCur2 = pCur2->_pNext;
        pCur = pCur->_pNext;
    }
}

if (pCur1 == NULL)                    //出迴圈之後,將非空的連結串列直接接到pcur的後面
    pCur->_pNext = pCur2;
else
    pCur->_pNext = pCur1;

return pNewHead;
}

該程式碼中有許多可以優化的地方!
譬如,可以將選擇頭結點或者迴圈連結的操作進行一個有效的封裝
大家可以試一試!!

關於資料結構的其他知識大家可以訪問我的主頁!

沒有敲不壞的鍵盤!!!!只要你敢敲!!!
謝謝!
這裡寫圖片描述