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等)时不会出现此问题。