Re: [問題] double link list做swap
※ 引述《skyblue2021 (空虛的人生)》之銘言:
: 我想用double link list做2個node的swap
: 可是一直跑不出來@@
: trace了好幾遍還是不知道問題到底出在哪
: 以下是我的程式碼
: 感覺好像是node A那裡的link出了問題
: 可是想了很久還是不知道為什麼有問題@@"
: 麻煩請大大指點一下,感謝~~
那就來追追看吧
: void swap(void)
: {
<del>
: if(a != 0 && b != 0)
: {
已經找到兩個要換的node:
┐←┬─┐←┬ ┐←┬─┐←┬
│ │A│ │ │ │B│ │
┴→└─┴→└ ┴→└─┴→└
: ptr=B;
ptr
↓
┐←┬─┐←┬ ┐←┬─┐←┬
│ │A│ │ │ │B│ │
┴→└─┴→└ ┴→└─┴→└
: ptr->llink=B->llink;
ptr
↓
┐←┬─┐←┬ ┐←┬─┐←┬
│ │A│ │ │ │B│ │
┴→└─┴→└ ┴→└─┴→└
: ptr->rlink=B->rlink;
ptr
↓
┐←┬─┐←┬ ┐←┬─┐←┬
│ │A│ │ │ │B│ │
┴→└─┴→└ ┴→└─┴→└
(以上兩步都沒有作用,這間接造成你的問題,詳後述)
: (A->llink)->rlink=B;
ptr
↓
┐←┬─┐←┬ ┐←┬─┐←┬
│ │A│ │ │ │B│ │
┤ └─┴→└ ┴→└─┴→└
│ ↑
└──────────────┘
: B->llink=A->llink;
┌─────────────┐ptr
↓ │↓
┐←┬─┐←┬ ┐ ├─┐←┬
│ │A│ │ │ │B│ │
┤ └─┴→└ ┴→└─┴→└
│ ↑
└──────────────┘
: B->rlink=A->rlink;
┌─────────────┐ptr
↓ │↓
┐←┬─┐←┬ ┐ ├─┐←┬
│ │A│ │ │ │B│ │
┤ └─┴→└ ┴→└─┤ └
│ ↑ ↑│
└──────────────┘│
└─────────┘
: (A->rlink)->llink=B;
┌────────┐
┌─────────────┐│ptr
↓ │ │↓↓
┐←┬─┐ ├ ┐ ├─┐←┬
│ │A│ │ │ │B│ │
┤ └─┴→└ ┴→└─┤ └
│ ↑ ↑│
└──────────────┘│
└─────────┘
: (ptr->llink)->rlink=A;
: (ptr->rlink)->llink=A;
這兩行亂掉了
看上圖就知道 原來在B的左邊那個點已經沒人指它了
但你卻仍然想用ptr->llink來指到它
所以就出問題
而原因則是你前面的
B->llink=A->llink;
B->rlink=A->rlink;
這兩行就先指走了
以致於沒人指到B原先的鄰居
而你原先試著保留這兩個指標的嘗試 (即上面我說沒作用的那兩行)
會沒有作用的原因則是因為你直接ptr=B;
這造成當你想把指標留到 ptr->llink 和 ptr->rlink 時
寫入的卻是原本的 B->llink 和 B->rlink
因此它根本就沒有保留到
然後在你改了 B->llink 和 B->rlink 後 ptr->llink 和 ptr->rlink 就不見了
: }
: else printf("There is no such node number!!\n");
: system("PAUSE");
: }
另外附註一件事
即使你把這個問題修正了
當A和B相鄰時還是會錯
這要當成special case來處理
--
実琴:「河野!你真的就這樣被物質慾望給吸引過去了嗎?!」
亨:「只要穿著女裝擺出親切的樣子,所有必要花費就能全免,似乎一點都不壞啊。」
実琴:「難道你沒有男人的尊嚴了嗎?!」
亨:(斷然道)「沒有。在節衣縮食且生活吃緊的學生面前,沒有那種東西。」
--プリンセス・プリンセス 第二話
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 192.192.197.115
※ 編輯: LPH66 來自: 192.192.197.115 (04/12 12:53)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章