這個演算法有兩個迴圈,我們姑且稱其為外迴圈和內迴圈,誠如其他樓的一位網友所言,其內迴圈在第一次判斷時進不去是正常的,但後面會進去。為什麼呢?首先我們來理一下這個演算法的大體思路:這是一個針對單鏈表的排序演算法,就是說給定一個單鏈表,我們要把按照結點(這裡不對頭結點進行排序,即這裡討論的結點不包括頭結點)的資料域中的data值的大小從小到大進行排序,得到新的排序後的有序連結串列。我們先把連結串列的頭結點之後的部分連結串列拆下來,即p=L->next,L->next=NULL,這樣我們就拆分原來的連結串列變成了現在的兩個連結串列(我們稱只有一個頭結點的連結串列為L1,另一個全為資料項結點的連結串列為L2)。接下來我們一個一個從L2剝下單獨的結點,放到L1中,其中如果L1中已經有資料項結點,則要先進行data項比較再找到合適的地方插入。直到最後L2中的結點全部拆下來並裝到了L1上,於是排序完畢,此時的L1擁有與原來的單鏈表相同的頭結點,但是排列有序的資料項結點。
理完了整個演算法的思路後再回去看程式碼就很明顯,外迴圈判斷“p!=NULL”的意義在於判斷L2連結串列中是否還有沒有剝完的結點,而內迴圈中要先判斷“q!=NULL”的第一層意義在於判斷L1連結串列是不是一個只有頭結點的空表(即無資料項結點),如果是,則直接插入,如果不是,則判斷目前L1頭結點的下一個結點q的data值是否小於等於剛從L2剝下來的結點p的data值,如果是,則說明這個p結點應該安放的位置還在q結點之後,我們還要繼續往下找,直到找到q->data > p->data的結點q或者已經到了連結串列的末尾(這也是q!=NULL的第二層意義),則停止尋找,並將p結點就放在這個位置。
說了半天忘了回答樓主的疑問,為什麼內迴圈永遠不會進去嗎?不是,只是第一次不會進去(當然,如果原單鏈表本身就是一個只有頭結點的連結串列時那麼後面也不會再進去了,因為空表根本不需要排序),而後面就會進去,具體原因見我上述分析即可知。
這個演算法有兩個迴圈,我們姑且稱其為外迴圈和內迴圈,誠如其他樓的一位網友所言,其內迴圈在第一次判斷時進不去是正常的,但後面會進去。為什麼呢?首先我們來理一下這個演算法的大體思路:這是一個針對單鏈表的排序演算法,就是說給定一個單鏈表,我們要把按照結點(這裡不對頭結點進行排序,即這裡討論的結點不包括頭結點)的資料域中的data值的大小從小到大進行排序,得到新的排序後的有序連結串列。我們先把連結串列的頭結點之後的部分連結串列拆下來,即p=L->next,L->next=NULL,這樣我們就拆分原來的連結串列變成了現在的兩個連結串列(我們稱只有一個頭結點的連結串列為L1,另一個全為資料項結點的連結串列為L2)。接下來我們一個一個從L2剝下單獨的結點,放到L1中,其中如果L1中已經有資料項結點,則要先進行data項比較再找到合適的地方插入。直到最後L2中的結點全部拆下來並裝到了L1上,於是排序完畢,此時的L1擁有與原來的單鏈表相同的頭結點,但是排列有序的資料項結點。
理完了整個演算法的思路後再回去看程式碼就很明顯,外迴圈判斷“p!=NULL”的意義在於判斷L2連結串列中是否還有沒有剝完的結點,而內迴圈中要先判斷“q!=NULL”的第一層意義在於判斷L1連結串列是不是一個只有頭結點的空表(即無資料項結點),如果是,則直接插入,如果不是,則判斷目前L1頭結點的下一個結點q的data值是否小於等於剛從L2剝下來的結點p的data值,如果是,則說明這個p結點應該安放的位置還在q結點之後,我們還要繼續往下找,直到找到q->data > p->data的結點q或者已經到了連結串列的末尾(這也是q!=NULL的第二層意義),則停止尋找,並將p結點就放在這個位置。
說了半天忘了回答樓主的疑問,為什麼內迴圈永遠不會進去嗎?不是,只是第一次不會進去(當然,如果原單鏈表本身就是一個只有頭結點的連結串列時那麼後面也不會再進去了,因為空表根本不需要排序),而後面就會進去,具體原因見我上述分析即可知。