2015-02-06 37 views
0

我想問你一個建議。我必須創建一個函數,在雙重linked list中交換兩個項目範圍的位置(不創建新節點)。將項目的範圍移動到雙鏈表中? [C]

,如:

ABCDEFG 

'B', 'C' 互換 'E', 'F'

這樣:

AEFDBCG 

我在想什麼做的,是改變 -

指針prec(上一個)的'B'=指針prec'E'和指針succ(下一個)'C'=指針succ'F'

最後指針prec'E'=指針prec'B'succ指針'F'=指針succ'C'

我試着應用我所說的但我認爲我在代碼上犯了很多錯誤。

另一種方法是創建一個函數,該函數將單個項目移動到想要的位置。

有人可以幫我創建一個類似的功能嗎?我的頭是怎麼回事段故障:P

的結構是這樣的:

struct nodo { 
char info; 
struct nodo *succ; 
struct nodo *prec; 
}; 
typedef struct nodo nodo; 

更新:

繼阿克塞爾的建議,我做了這樣的事情。現在我只需交換一個項目,之後我將迭代此函數。 我無法設法使調試器工作,但我試圖解決這個問題。

nodo *ScambiaSottoliste(nodo *lista,int i,int j){ //I first position, J second position 

    nodo *firstRange1, *range1, *metaInf, *metaSup, *range2, *last; 

    range1=RicercaPosizione(lista, i); //Reserch position I 
    firstRange1=range1->prec; 
    metaInf=range1->succ; 
    range2=RicercaPosizione(lista, j); //research position J 
    metaSup=range2->prec; 
    last=range2->succ; 

    range1->prec=metaSup; 
    range1->succ=last; 
    range2->prec=firstRange1; 
    range2->succ=metaInf; 

return lista; 
} 
+2

製作兩張圖紙,一張在交換之前,另一張在交換之後。突出顯示需要改變的指針(有多少?)。然後將圖紙帶到您的終端並輸入代碼。之後:照顧角落案件(當一個或兩個交換片段都在列表的末尾)時,如果片段接觸或重疊,Als會決定你想要發生什麼。 – joop 2015-02-06 13:40:59

+2

使用調試器,並逐步執行您的功能並檢查變量的中間值。 – 2015-02-06 13:46:33

+1

嗯,如果你沒有顯示任何代碼,很難猜出錯誤在哪裏......常見的一種:如果你在擦除之前沒有保存'B'的指針prec(前)它與'指針prec'E''它會丟失,當你嘗試使用它來設置'指針prec'E'' – 2015-02-06 14:27:53

回答

1

你可以通過你的列表進行迭代,並把它分割成五個(可能爲空)子列表:

  1. 前第一範圍列表
  2. 一是範圍
  3. 後第一範圍和第二前範圍
  4. 第二範圍列表
  5. 第二個範圍後的列表

在此分割期間,您可以檢測重疊和給定範圍的順序。 整數類型狀態變量有助於跟蹤迭代期間要附加到的子列表。

一旦你有了子列表,你就可以將它們以所需的順序連接在一起。最後,不要忘記保持你的列表開始和結束變量。

+0

感謝您的回答,我在OP上畫了一張草圖,您能否檢查一下?謝謝 – xunga 2015-02-06 15:01:29

0

讓我們假設我們想從& B之間交換的一組元素與d &Ë 現在之間的元素, 設置一個等於d &的右指針設置左指針的右指針b等於e的左指針。&反之亦然 設置2個最後一個元素點的右指針到b 同樣做休息

1

當您使用雙鏈表時,您必須更改所有涉及項目的指針。

所以用於交換隻是2項(所提供的代碼),你應該有:

range1->prec=metaSup; 
metaSup->succ= range1; 
range1->succ=last; 
last->prec = range1; 
range2->prec=firstRange1; 
firstRange1->succ = range2; 
range2->succ=metaInf; 
metaInf->prec=range2; 

但交換到節點的範圍,則必須僅交換每個範圍的初始和終端節點,具有相似的技術。