2022年模板链表类 .pdf
《2022年模板链表类 .pdf》由会员分享,可在线阅读,更多相关《2022年模板链表类 .pdf(25页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、/*/#include#include#include#include student.h/*/*类模板名称:ListNode 功能描述:定义类模板ListNode 修改记录:*/template class ListNode public:ListNode()ListNode(const T&nItem,ListNode*ptrNext=NULL);T&ShowDate()return Date;void InsertAfter(ListNode*ptr);/插入新结点,作为本结点的后续结点ListNode*DeleteAfter(void);/删除本结点的后续结点ListNode*Next
2、ListNode()const;/获得本结点后续结点的指针void SetNext(ListNode*ptr)ptrNext=ptr;private:T Date;/本结点的数据ListNode*ptrNext;/指向本结点的后续结点的指针;/*/*类模板名称:LinkedList 功能描述:定义类模板LinkedList 修改记录:*/template class LinkedList/链表类的声明 public:LinkedList(void);名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 25 页 -LinkedList(const LinkedList&list);Li
3、nkedList(void)DeleteAll();LinkedList&operator=(const LinkedList&list);/号运算符的重载void Next();/指向链表的下一结点int EndOfList()const/判断链表的当前位置是否是表尾 return(!PtrCurr);int CurrPosition()const/获得当前位置指针在链表中的位置 return(nPosition);void InsertFront(const T&nItem);/将数据为 nItem 的结点插入到链表头void InsertTail(const T&nItem);/将数据为
4、 nItem 的结点插入到链表尾void InsertAt(const T&nItem);/将数据为 nItem 的结点插入到当前位置void InsertAfter(const T&nItem);/将数据为 nItem 的结点插入到当前位置之后void InsertOrder(T nItem);/将数据为nItem 的结点插入到排序链表中,并构成新的排序链表int DeleteHead();/删除链表头结点void DeleteCurr();/删除链表当前结点void Delete(T Key);/删除链表中数据为Key 的结点void DeleteAll();/删除链表中的所有结点T&Ge
5、tDate();/得到链表中当前结点数据void DisplayList();/显示链表中所有结点的数据int Find(T&nItem);/在链表中找到数据为nItem 的结点int ListLength()const/求链表的长度 return nListLength;int ListEmpty()const/判断链表是否为空 return nListLength;void Reset(int nPos=0);/重新设置链表的当前的指针的位置private:ListNode*ptrFront,/链表的头结点指针*ptrTail,/链表的尾结点指针*ptrPrev,/链表的当前结点的前一个结
6、点指针*ptrCurr;/链表的当前结点指针int nListLength;/链表的长度;名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 25 页 -int nPosition;/链表的当前结点指针位置ListNode*GetListNode(const T&nItem,ListNode*ptrNext=NULL);/获 得 链 表的下一个结点指针void FreeListNode(ListNode*ptr)/释放结点资源 delete ptr;void CopyList(const LinkedList&list);/逐项拷贝链表;/*/listnode.cpp/#includ
7、e /#include listnode.h template ListNode:ListNode(const T&nItem,ListNode*ptrNext):Date(nItem),ptrNext(ptrNext)/*/*函数名称:NextListNode()功能描述:返回指向后续结点的指针修改记录:*/template ListNode*ListNode:NextListNode()const return ptrNext;/*/*函数名称:InsertAfter(ListNode*ptr)功能描述:插入新结点,作为本结点的后续结点修改记录:*/template void ListNo
8、de:InsertAfter(ListNode*ptr)ptr-ptrNext=ptrNext;ptrNext=ptr;/*/*函数名称:DeleteAfter()功能描述:删除本结点的后续结点名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 25 页 -修改记录:*/template ListNode*ListNode:DeleteAfter()ListNode*ptrTemp=ptrNext;if(ptrNext=NULL)/处理本结点为尾结点的情况return NULL;ptrNext=ptrTemp-ptrNext;/一般情况return ptrTemp;/链表类构造函数,
9、4 个私有指针设置为空,链表的初始长度设置为0/初始当前结点的位置为1 template LinkedList:LinkedList(void):ptrFront(NULL),ptrTail(NULL),ptrPrev(NULL),ptrCurr(NULL),nListLength(),nPosition(-1)template LinkedList&LinkedList:operator=(const LinkedList&list)if(this!=&list)DeleteAll();CopyList(list);return*this;/*/*函数名称:LinkedList(const
10、LinkedLIst&list)功能描述:拷贝构造函数修改记录:*/template LinkedList:LinkedList(const LinkedList&list)CopyList(list);/*/*函数名称:Reset(int nPos)功能描述:重新设置当前指针的位置名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 25 页 -修改记录:*/template void LinkedList:Reset(int nPos)int nStartPos;if(!ptrFront)/如果当前指针为空,链表为空直接返回 return;if(nPos=nListLength|n
11、Pos0)/位置越界检查 coutInvalid position!NextListNode();ptrPrev=ptrFront;nStartPos=1;for(nPosition=nStartPos;nPosition!=nPos;nPosition+)ptrPrev=ptrCurr;ptrCurr=ptrCurr-NextListNode();/*/*函数名称:Next()功能描述:当前指针指向当前结点的后续结点修改记录:*/template void LinkedList:Next()if(ptrCurr)名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 25 页 -ptr
12、Prev=ptrCurr;ptrCurr=ptrCurr-NextListNode();nPosition+;/*/*函数名称:InsertFront(const T nItem)功能描述:将数据为nItem 的结点插入到链表头修改记录:*/template void LinkedList:InsertFront(const T&nItem)ListNode*newListNode=GetListNode(nItem);/获得一个封装有该数据的结点newListNode-SetNext(ptrFront);ptrFront=newListNode;nListLength+;/*/*函数名称:I
13、nsertTail(const T&nItem)功能描述:将数据为nItem 的结点插入到链表尾修改记录:*/template void LinkedList:InsertTail(const T&nItem)ListNode*newListNode;if(ptrCurr=NULL)InsertFront(nItem);else while(ptrCurr-NextListNode()ptrCurr=ptrCurr-NextListNode();newListNode=GetListNode(nItem);ptrCurr-InsertAfter(newListNode);/*/*函数名称:In
14、sertAt(const T&nItem)功能描述:将数据为nItem 的结点插入到链表的当前位置之前修改记录:名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 25 页 -*/template void LinkedList:InsertAt(const T&nItem)ListNode*newListNode;if(!ptrPrev)/插入到头结点 newListNode=GetListNode(nItem,ptrFront);newListNode-SetNext(ptrFront);ptrFront=newListNode;nListLength+;else/一般情况 ne
15、wListNode=GetListNode(nItem);ptrPrev-InsertAfter(newListNode);if(ptrPrev=ptrTail)ptrPrev=newListNode;nPosition=nListLength;ptrCurr=newListNode;/*/*函数名称:InsertAfter()功能描述:将数据为nItem 的结点插入到链表的当前位置之后修改记录:*/template void LinkedList:InsertAfter(const T&nItem)ListNode*newListNode;if(!ptrCurr)/处理空链表的情况 newL
16、istNode=GetListNode(nItem);ptrCurr=newListNode;ptrFront=ptrCurr;else/一般情况 newListNode=GetListNode(nItem);ptrCurr-InsertAfter(newListNode);名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 25 页 -if(ptrPrev=ptrTail)ptrTail=newListNode;nPosition=nListLength;ptrCurr=newListNode;nListLength+;/*/*函数名称:DeleteCurr()功能描述:删除链表中
17、的当前结点修改记录:*/template void LinkedList:DeleteCurr()ListNode*ptr;if(!ptrCurr)/处理空链表情况 coutThis list is a empty!NextListNode();ptr=ptrPrev-DeleteAfter();if(ptr=ptrTail)ptrTail=ptrPrev;nPosition-;ptrCurr=ptr-NextListNode();FreeListNode(ptr);nListLength-;/*/*函数名称:DeleteAll()功能描述:删除链表中所有资源并释放资源修改记录:名师资料总结-
18、精品资料欢迎下载-名师精心整理-第 8 页,共 25 页 -*/template void LinkedList:DeleteAll()ListNode*ptrCurrPos,*ptrNextPos;ptrCurrPos=ptrFront;while(ptrCurrPos)ptrNextPos=ptrCurrPos-NextListNode();FreeListNode(ptrCurrPos);ptrCurrPos=ptrNextPos;ptrFront=NULL;ptrTail=NULL;ptrPrev=NULL;ptrCurr=NULL;nListLength=0;nPosition=-1
19、;/*/*函数名称:DeleteHead()功能描述:删除链表的头结点修改记录:*/template int LinkedList:DeleteHead()ListNode*ptr=ptrFront;if(ptrFront)ptrFront=ptrFront-NextListNode();delete ptr;nListLength-;return 1;else coutThis list is empty!endl;return 0;/*/*名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 25 页 -函数名称:GetDate()功能描述:获得链表中当前结点的数据修改记录:*/t
20、emplate T&LinkedList:GetDate()if(nListLength=0|!ptrCurr)coutInvalid!ShowDate();/*/*函数名称:CopyList(const LinkedList&list)功能描述:逐项拷贝链表中的各个结点修改记录:*/template void LinkedList:CopyList(const LinkedList&list)ListNode*ptr=list.ptrFront;ptrCurr=NULL;while(ptr)/遍历 list 并创建新表 InsertAfter(ptr-ShowDate();ptr=ptr-N
21、extListNode();if(nPosition=-1)return;ptrPrev=NULL;preCurr=preFront;for(int nPos=0;nPos!=List.CurrPosition();nPos+)ptrPrev=ptrCurr;ptrCurr=ptrCurr-NextListNode();nPosition=nPos;nListLength=list.ListLength();/*/*名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 25 页 -函数名称:GetListNode(const T&nItem,ListNode*ptrNext)功能描述
22、:获得下一个新节结点,返回新结点地址p 修改记录:*/template ListNode*LinkedList:GetListNode(const T&nItem,ListNode*ptrNext)ListNode*newListNode;newListNode=new ListNode(nItem,ptrNext);if(!newListNode)cout 内存分配失败!endl;exit(1);return newListNode;/*/*函数名称:DisplayList()功能描述:输出链表中的各个结点数据修改记录:*/template void LinkedList:DisplayLi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年模板链表类 2022 模板 链表类
限制150内