簡體   English   中英

在C中的雙鏈表中交換節點

[英]Swapping nodes in double linked list in C

我正在嘗試在C中的雙鏈表中交換節點。

我的列表如下:M4,M3,M2,M1。 我有一個計算列表尺寸的函數,它可以正確讀取為4。

當我嘗試用M2交換M3時,一切都崩潰了(希望遍歷它后得到:M4,M2,M3,M1。)

我在main中使用以下行:(primary是第一個節點,M4)

swap_nodes1(prim->pNext, prim->pNext->pNext);

以下代碼用作我的交換功能。 (注意:當切換頭節點到另一個節點或尾節點到另一個節點時,我仍然需要解決這些情況,但我想先交換一些隨機的中間位置的節點。)

void swap_nodes1(pNODE object1, pNODE object2)
{
pNODE temp1,temp2;
temp1->pPrec=object1->pPrec;
temp1->pNext=object1->pNext;

object1->pPrec=object2->pPrec;
object1->pNext=object2->pNext;
object2->pPrec=temp1->pPrec;
object2->pNext=temp1->pNext;

free(temp1);
}

當我第二次遍歷列表時,我得到:M4,M3,M1。 而且,列表的暗淡現在是3,而不是4,M2消失了。

誰能為我提供解釋為什么我得到了這個消息以及我做錯了什么?

先感謝您。

如果您將其繪制在紙上並以這種方式進行研究,這會容易得多。

假設object1和object2不為NULL。

您需要考慮要交換的兩個節點之前和之后的節點。 兩個交換節點之前的節點現在需要指向object2而不是object1(假設該節點存在)。 現在,您需要使object2的前面指向兩個交換節點之前的節點。

if ( object1->pPrec != NULL )
   object1->pPrec->pNext = object2;
object2->pPrec = object1->pPrec;

並且,您需要兩個交換節點之后使object1的下一個指向該節點,並且該節點需要指向object1(如果存在)。

object1->pNext = object2->pNext;
if ( object2->pNext != NULL ) 
    object2->pNext->pPrec = object1;

然后,object1需要指向對象2,而object2需要指向對象1。

object1->pPrec = object2;
object2->pNext = object1;

問題語句未指定指向列表的第一個節點(M4)的指針,也沒有指定指向列表的最后一個節點(M1)的指針。 它沒有說明列表是否是循環的,所以我認為它不是循環的。

交換列表中的節點時,如果要交換的節點是相鄰的(在本例中為M3和M2),則指針需要“旋轉”。 如果要交換的節點不相鄰,則需要交換指針。 通過首先交換指向兩個節點的指針,然后交換兩個節點的指針,可以在兩種情況下使用相同的邏輯。

使用指向節點的指針將簡化邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM