I wrote a two-way linked list in the previous article. Today I reviewed the circular linked list and wrote a circular linked list with a header node. The specific implementation is as follows:
Node file (listnode. h ):
template
class
circularlist; template
class
listnode {
Public
: friend
class circularlist
; listnode (): m_pnext (null) {} listnode (
const T data, listnode
* pnext =
null): m_data (data ), m_pnext (pnext) {} ~
listnode () {m_pnext =
NULL ;}
private
: T m_data; listnode
*
m_pnext ;};
Circular linked list file (circularlist. h ):
# Include " Listnode. h " Template <Typename T> Class Circularlist { Public : Circularlist (): Head ( New Listnode <t> () {Head -> M_pnext = Head ;} ~Circularlist () {emptylist (); Delete head ;} Public : Void Emptylist (); // Clear linked list Int Length (); // Calculate the length of a linked list Bool Insert (T item, Int N = 0 ); // Insert element Listnode <t> * Find (Int N ); // Find the nth Element T Delete ( Int N ); // Delete nth Element T getdata ( Int N ); // Obtain the nth Element Void Print (); // Output linked list Private : Listnode <T> *Head ;}; Template <Typename T> Void Circularlist <t> : Emptylist (){ // Clear linked list Listnode <t> * P = head ,* Pdel; While (P-> m_pnext! = Head) {pdel = P-> M_pnext; P -> M_pnext = pdel-> M_pnext; Delete pdel;} Template <Typename T> Int Circularlist <t>: Length (){ // Calculate the length of a linked list Int Count = 0 ; Listnode <T> * P = Head; While (P-> m_pnext! = Head) {count ++ ; P = P-> M_pnext ;} Return Count;} Template <Typename T>Bool Circularlist <t >:: insert (T item, Int N = 0 ){ // Insert element If (N < 0 | N> Length ()) Return False ; // N outbound Listnode <t> * P = Head; listnode <T> * pnewnode =New Listnode <t> (Item ); If (Pnewnode = Null) Return False ; For ( Int I = 0 ; I <n; I ++ ) {P = P-> M_pnext; If (P = Head) Return False ; // N outbound } Pnewnode -> M_pnext = p-> M_pnext; P -> M_pnext = Pnewnode; Return True ;} Template <Typename T> Listnode <T> * circularlist <t>: Find ( Int N ){ // Find the nth Element If (N < 0 | N> Length ()) Return False ; Listnode <T> * P = Head; While (P! = Head) {P = P-> M_pnext ;} If (P = Head) Return NULL; Return P;} Template <Typename T> T circularlist <T>: delete ( Int N ){ // Delete nth Element If (N < 0 | N> Length ()) Return NULL; listnode <T> * P = head ,* Pdel; For ( Int I = 0 ; I <n; I ++ ) {P = P-> M_pnext;} pdel = P-> M_pnext; P -> M_pnext = pdel-> M_pnext; t data = Pdel-> M_data; Delete pdel; Return Data;} Template <Typename T> T circularlist <T>: getdata ( Int N ){ // Obtain the nth Element If (N < 0 | N> Length ()) Return NULL; listnode <T> * P = Head; For ( Int I = 0 ; I <n; I ++ ) {P = P-> M_pnext ;} Return P;} Template <Typename T> Void Circularlist <t> : Print () {listnode <T> * P = Head; cout < " Head " ; While (P-> m_pnext! = Head) {P = P-> M_pnext; cout < " --> " <P-> M_data;} cout < " --> " < Endl ;}
Test file (circularlist. h ):
// Circularlist. cpp: defines console applications.Program. // # Include " Stdafx. h " # Include " Circularlist. h " # Include <Iostream> Using Namespace STD; Int _ Tmain ( Int Argc, _ tchar * Argv []) {circularlist < Int > Circularlist; For ( Int I = 0 ; I < 15 ; I ++ ) Circularlist. insert (I * 3 , I); circularlist. Print (); cout < " The length of list is: " <Circularlist. Length () < Endl; Int Del = circularlist. Delete ( 3 ); Cout <Del < " Is deleted " < Endl; circularlist. Print (); cout < " The length of list is: " <Circularlist. Length () < Endl; cin. Get (); Return 0 ;}
Test: