c語言鏈表冒泡排序 C語言問題:怎樣實現對鏈表中兩個結點的交換?
C語言問題:怎樣實現對鏈表中兩個結點的交換?鏈表交換節(jié)點有兩種方式:交換節(jié)點內容交換節(jié)點位置,如定義如下結構,分為數據部分和鏈表指針部分structdata{int num float score}s
C語言問題:怎樣實現對鏈表中兩個結點的交換?
鏈表交換節(jié)點有兩種方式:交換節(jié)點內容交換節(jié)點位置,如定義如下結構,分為數據部分和鏈表指針部分structdata{int num float score}struct stu{structdata struct stu*next}*head,*P1,*P2,*P3,*p4head->p1->p2->p3->p4交換節(jié)點的內容。節(jié)點的順序保持不變。交換兩個節(jié)點時,只交換數據部分,下一個指針不移動。例如,交換P1和P3(data)的內容:structudata t=P1->datap1->data=P3->datap3->data=t//這是可以的。為了保持鏈表的正常連接,需要重置next的值。這個過程有點復雜,例如:交換P1和P3的位置:最后更改為:head->p3->p2->p1->p4。首先,找到P1的頭和P3的P2,然后開始重新分配鏈表的排列:1。(head)的新繼承節(jié)點P1的頭應成為P3(P4)3的原繼承節(jié)點,P3(P2)的新繼承節(jié)點應成為p14、P3的新繼承節(jié)點,P1(P2)結構的原繼承節(jié)點stu*p1p,*P3P,*pfor(P=headp!=nullp=P->next){如果(P->next==P1)p1p=P//找到P1的前向頭如果(P->next==P3)P3P=P//找到P3的前體}p1p->next=P3//P3的前體節(jié)點的新后繼節(jié)點成為P3的前體節(jié)點head->p3 struct stu*tnext=P1->next//保存P1(P2)的前體節(jié)點p1->next=P3->next//p1的新后繼節(jié)點成為P3(P4)的前體節(jié)點p1->p4p3p->next=p1//P3當新后繼節(jié)點成為p1 P2->p1p3->next=tnext//P3時,新后繼節(jié)點成為原始后繼節(jié)點P3->p2
p1的交換列表節(jié)點,通常是exchange節(jié)點結構的內容,下一個指針除外。傳統(tǒng)的、真實有效的方法是在不交換其他成員的情況下交換節(jié)點的關系指針。一個節(jié)點有自己的指針和指向下一個節(jié)點的指針?!八约旱闹羔槨笔巧弦粋€節(jié)點的下一個指針,所以我們需要交換上一個節(jié)點的下一個指針和當前級別的下一個指針。而且,由于頭節(jié)點和尾節(jié)點的關系與中間節(jié)點的關系不同,在與頭節(jié)點和尾節(jié)點交換時,需要處理的上、中間節(jié)點有細微的區(qū)別。所以操作起來比較麻煩,如果關系處理不好,就會出錯。另一種方法是交換除下一個指針以外的所有成員。思路非常清晰,就是代碼比較長,節(jié)點成員多的時候比較明顯,編寫比較麻煩。有一種確保思路清晰、書寫方便的方法是“將需要交換的兩個節(jié)點作為一個整體交換,然后將下一個指針交換回來”。我工作時經常用這種方法。然而,盡管代碼讀起來流暢、短視,但你不能指望它能提高效率——因為在切換結構變量時,雖然寫得很短,但實際上是一個成員一個成員地交換,更不用說“將下一個指針交換回來”的操作了。個人經驗,供參考。