作者LPH66 (ha(ruhi|yate)ism)
看板C_and_CPP
标题Re: [问题] double link list做swap
时间Thu Apr 12 12:53:14 2007
※ 引述《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)