|
链表是一种十分常用的数据结构,就我个人的实际工作经验而言,经常为了存储不同的数据而总要重写相关的代码,浪费了许多的时间。虽然MFC、STL均有解决方案,但它们都有体积大,结构复杂,不便移植的缺点,最要命的是它们对其它的库有一些依赖性,在某些情况下,不得不放弃对它们的使用。最近终于有了点时间,下决心争取一劳永逸地解决这个问题。于是这个CCommonList模板类就诞生了。
总的思路是借鉴了STL的“容器+迭代器”的结构,再加上引入模板特性,使之真正成为一个通用的链表处理类。
使用方法:
1、声明链表对象
a) CCommonList<int> IntList;//用于存放整数的链表
b) CCommonList<SYSTEMTIME> TimeList;//用于存放时间结构体的链表
c) CCommonList<MyStruct*> MyStructPtrList;//指针对象的链表
2、添加新节点
a) IntList.AddHead(10);
b) SYSTEMTIME tm;
GetSystemTime(&tm);
TimeList.AddTail(tm);
c) MyStruct Obj;
MyStruct *pObj=&Obj;
MyStructPtrList.AddTail(pObj);
3、遍历链表
首先要声明一个迭代器:
CCommonList<int>::Iterator it1(IntList);
CCommonList<SYSTEMTIME>::Iterator it2(TimeList);
CCommonList<MyStruct*>::Iterator it3(MyStructPtrList);
接下来使用迭代器的“++”“--”运算符,或GetNext、GetPrev函数来遍历整个链表。使用IsEnd方法来判断是否遍历完毕。
对迭代器使用“*”运算符来获取存储于链表中的数据,得到的结果是当前数据的引用。
例:
it2.ToBegin();//从首节点开始
while(!it2.IsEnd())//判断是否结束
{
SYSTEMTIME &tm=*it2++;//取得数据的引用后,指向下一个节点
printf("%d年",tm.wYear);
tm.wMonth=10;//因为是数据的引用,所以可以直接修改它的值
}
需要注意的是:所有的数据都是完全复制了一份到链表中,所以原来的数据均无需保存。对于自定义的结构体,如有特殊需求,请重载“=”运算符以实现预期功能(因为复制数据时,只是简单地使用了“=”运算符)。
另外,也可以从Iterator类派生出一个子类以丰富和完善迭代器的功能,实现更加强大和专业化的功能。
完整源代码地址:查看代码
欢迎大家试用 :)
【 撰写时间: 2006/9/12 0:13:00 By GhostEx 】 |