现在的位置: 首页 > 综合 > 正文

CList 细节

2013年03月18日 ⁄ 综合 ⁄ 共 1239字 ⁄ 字号 评论关闭

Clist的用法网上已有很多,且附有简明示例,易学入手。可是今天在使用时却有基础细节不甚明了,通过代入数据一一试验中的证实,现分享如下。

首先定义              

CList<class TYPE, class ARG_TYPE>  MyList

POSITION  pos;

接下来主要讨论调用成员函数时,pos的变化:

1.  TYPETemp = MyList.GetNext(pos),这个在很多学习资料中有介绍,返回当前pos的值,pos位置后移一位,相当于a++,先运算后自增。

2.  TYPETemp = MyList.GetPtev(pos), 这和1中类似;但是当pos指向首位置,仍旧返回当前位置值,而此时pos的指向会发生错误。

3.  MyList.InsertBefore (pos,TYPE)

MyList.InsertAfter (pos,TYPE)

这两个成员函数调用时,pos的变化我们通过一个实例来说明:

列表:A→B→C→D→E→F→G→H,

当pos指向D时InsertBefore(pos,X),此时列表变为

A→B→C→X→D→E→F→G→H

Pos的指向位置依旧是D。InsertAfter依然。

4.  MyList.RemoveAt (pos)

        依旧以3中链表为例:A→B→C→D→E→F→G→H

当pos指向D时RemoveAt (pos),此时pos依旧指向D,可是D已经被移除列表,pos为何依旧指向D呢?!我们通过调用几个成员函数来揭示其中的位置指向关系。

假设此时pos指向D位置

MyList.RemoveAt (pos)

TYPETemp = MyList. GetAt (pos)                      //返回Temp值为D

以下①②是并列关系,承接以上代码

①   Temp = MyList. GetNext (pos)                  //pos为NULL

②   Temp = MyList. GetPrevt (pos)                 //返回Temp值为C

Temp = MyList. GetNext(pos)                            //返回Temp值为E

         由此我们便可以得出结论,CList 列表是与双链接列表行为相似的,可以用下图表示:

A<-->B<-->C<-->D<-->E<-->F<-->G<-->H

A<-->B<-->C<-->E<-->F<-->G<-->H

                 ^

                 |

D

5.  最后再说下自己编程时遇见的一个小问题:

         POSITION pos=MyList.Find((TYPE) Temp);

Find函数查找Temp时会对TYPE类型进行比较,当TEPY是结构体或者类时,就可能出现错误,需要对运算符“==”重构

TYPEoperator ==(TYPE &)const

当然TYPE是普通数据结构(int doublestring等)时不会出现此问题。

抱歉!评论已关闭.