http://blog.csdn.net/fisherwan/article/details/25649271
?鏈表(四)實現雙向循環鏈表簡單操作,代碼如下:
[cpp]?view plain?copy
- <span?style="font-size:18px;"?deep="5">#include?<iostream>??
- #include?<stdlib.h>??
- using?namespace?std;??
- ??
- //結點類??
- class?Node?{??
- public:??
- ????int?data;??
- ????Node?*pPre,?*pNext;??
- };??
- ??
- //雙向循環鏈表類??
- class?DoubleCircularLinkList?{??
- public:??
- ????DoubleCircularLinkList()?{??
- ????????head?=?new?Node;??
- ????????head->data?=?0;??
- ????????head->pNext?=?head;??
- ????????head->pPre?=?head;??
- ????}??
- ????~DoubleCircularLinkList()?{delete?head;}??
- ????void?CreateLinkList(int?n);??
- ????void?InsertNode(int?position,?int?d);??
- ????void?TraverseLinkList();??
- ????bool?IsEmpty();??
- ????int?GetLength();??
- ????void?DeleteNode(int?posiiton);??
- ????void?DeleteLinkList();??
- private:??
- ????Node?*head;??
- };??
- ??
- void?DoubleCircularLinkList::CreateLinkList(int?n)?{??
- ????if?(n?<?0)?{??
- ????????cout?<<?"輸入結點個數錯誤!"?<<?endl;??
- ????????exit(EXIT_FAILURE);??
- ????}??
- ????else?{??
- ????????int?i?=?0;??
- ????????Node?*pnew,?*ptemp;??
- ????????ptemp?=?head;??
- ????????i?=?n;??
- ??
- ????????while?(n--?>?0)?{??
- ????????????pnew?=?new?Node;??
- ????????????cout?<<?"輸入第"?<<?i?-?n?<<?"個結點:";???
- ????????????cin?>>?pnew->data;??
- ????????????pnew->pNext?=?head;??
- ????????????pnew->pPre?=?ptemp;??
- ????????????ptemp->pNext?=?pnew;??
- ????????????ptemp?=?pnew;??
- ????????}??
- ????}??
- }??
- ??
- void?DoubleCircularLinkList::InsertNode(int?position,?int?d)?{??
- ????if?(position?<?0?||?position?>?GetLength()?+?1)?{??
- ????????cout?<<?"輸入位置錯誤!"?<<?endl;??
- ????????exit(EXIT_FAILURE);??
- ????}??
- ????else?{??
- ????????Node?*pnew,?*ptemp;??
- ????????pnew?=?new?Node;??
- ????????pnew->data?=?d;??
- ????????ptemp?=?head;??
- ????????while?(position--?>?1)??
- ????????????ptemp?=?ptemp->pNext;??
- ????????pnew->pNext?=?ptemp->pNext;??
- ????????pnew->pPre?=?ptemp;??
- ????????ptemp->pNext?=?pnew;??
- ????????ptemp?=?pnew;??
- ????}??
- }??
- ??
- void?DoubleCircularLinkList::TraverseLinkList()?{??
- ????Node?*ptemp?=?head->pNext;??
- ????while(ptemp?!=?head)?{??
- ????????cout?<<?ptemp->data?<<?"?";??
- ????????ptemp?=?ptemp->pNext;??
- ????}??
- ????cout?<<?endl;??
- }??
- ??
- bool?DoubleCircularLinkList::IsEmpty()?{??
- ????if?(head?==?head->pNext)??
- ????????return?true;??
- ????else??
- ????????return?false;??
- }??
- ??
- int?DoubleCircularLinkList::GetLength()?{??
- ????int?n?=?0;??
- ????Node?*ptemp?=?head->pNext;??
- ????while?(ptemp?!=?head)?{??
- ????????n++;??
- ????????ptemp?=?ptemp->pNext;??
- ????}??
- ????return?n;??
- }??
- ??
- void?DoubleCircularLinkList::DeleteNode(int?position)?{??
- ????if?(position?<?0?||?position?>?GetLength())?{??
- ????????cout?<<?"輸入位置錯誤!"?<<?endl;??
- ????????exit(EXIT_FAILURE);??
- ????}??
- ????else?{??
- ????????Node?*pdelete,?*ptemp;??
- ????????ptemp?=?head;??
- ????????while?(position--?>?1)??
- ????????????ptemp?=?ptemp->pNext;??
- ????????pdelete?=?ptemp->pNext;??
- ????????ptemp->pNext?=?pdelete->pNext;??
- ????????pdelete->pNext->pPre?=?ptemp;??
- ????????delete?pdelete;??
- ????????pdelete?=?NULL;??
- ????}??
- }??
- ??
- void?DoubleCircularLinkList::DeleteLinkList()?{??
- ????Node?*pdelete,?*ptemp;??
- ????pdelete?=?head->pNext;??
- ????while?(pdelete?!=?head)?{??
- ????????ptemp?=?pdelete->pNext;??
- ????????head->pNext?=?ptemp;??
- ????????ptemp->pPre?=?head;??
- ????????delete?pdelete;??
- ????????pdelete?=?ptemp;??
- ????}??
- }??
- ??
- //測試函數??
- int?main()?{??
- ????DoubleCircularLinkList?dcl;??
- ????int?position?=?0,?value?=?0,?n?=?0;??
- ????bool?flag?=?false;??
- ??
- ????cout?<<?"請輸入需要創建雙向循環鏈表的結點個數:";??
- ????cin?>>?n;??
- ????dcl.CreateLinkList(n);??
- ??
- ????cout?<<?"打印鏈表值如下:";??
- ????dcl.TraverseLinkList();??
- ??
- ????cout?<<?"請輸入插入結點的位置和值:";??
- ????cin?>>?position?>>?value;??
- ????dcl.InsertNode(position,?value);??
- ??????
- ????cout?<<?"打印鏈表值如下:";??
- ????dcl.TraverseLinkList();??
- ??
- ????cout?<<?"請輸入要刪除結點的位置:";??
- ????cin?>>?position;??
- ????dcl.DeleteNode(position);??
- ??
- ????cout?<<?"打印鏈表值如下:";??
- ????dcl.TraverseLinkList();??
- ??
- ????dcl.DeleteLinkList();??
- ????flag?=?dcl.IsEmpty();??
- ????if?(flag)??
- ????????cout?<<?"刪除鏈表成功!"?<<?endl;??
- ????else??
- ????????cout?<<?"刪除鏈表失敗!"?<<?endl;??
- ??
- ????return?0;??
- }</span>??