www.gusucode.com > VC++双链表数据结构源代码源码程序 > VC++双链表数据结构源代码源码程序/code/LinkList.cpp
//Download by http://www.NewXing.com // LinkList.cc // author: Ke Song based C source from pp Sister XiuJie Chen ;) // http://kesongemini.diy.163.com #include "stdafx.h" #include <iostream.h> #include <stdlib.h> // exit #include "LinkList.h" void LinkList_T:: init( void ) { _top = (LinkListNode_T *)this; _bottom = (LinkListNode_T *)this; _current= (LinkListNode_T *)this; } void LinkList_T:: prepend( CONTENTS contents ) { LinkListNode_T *pNode = new LinkListNode_T; if (pNode == NULL) { panic("prepend: new failed"); } else { pNode->prev = (LinkListNode_T *)this; pNode->next = _top; if( _bottom == (LinkListNode_T *) this ) _bottom = pNode; _top->prev = pNode; _top = pNode; // I don't want bearing operands' order in mind // So don't use " A = B = C " pNode->contents = contents; } } void LinkList_T:: append( CONTENTS contents ) { LinkListNode_T *pNode = new LinkListNode_T; if (pNode == NULL) { panic("append: new failed"); } else { pNode->prev = _bottom; pNode->next = (LinkListNode_T *)this; if (_top == (LinkListNode_T *)this) _top = pNode ; _bottom->next = pNode; _bottom = pNode; pNode->contents = contents; } } CONTENTS LinkList_T:: deleteFirst( void ) { LinkListNode_T *pNode = _top; CONTENTS contents; if (pNode == (LinkListNode_T *)this) return ((CONTENTS)NULL); _top = pNode->next; _top->prev = (LinkListNode_T *)this; if (_current == pNode) _current = pNode->next; contents = pNode->contents; delete pNode; pNode = NULL; return contents; } CONTENTS LinkList_T:: deleteLast( void ) { LinkListNode_T *pNode = _bottom; CONTENTS contents; if (pNode == (LinkListNode_T *)this) return ((CONTENTS)NULL); _bottom = pNode->prev; _bottom->next = (LinkListNode_T *)this; if (_current == pNode) _current = pNode->prev; contents = pNode->contents; delete pNode; pNode = NULL; return contents; } CONTENTS LinkList_T:: deleteCurrent( void ) { LinkListNode_T *pNode = _current; CONTENTS contents; if (pNode == (LinkListNode_T *)this) return ((CONTENTS)NULL); _current = pNode->next; pNode->prev->next = pNode->next; pNode->next->prev = pNode->prev; contents = pNode->contents; delete pNode; pNode = NULL; return contents; } void LinkList_T:: append2current( CONTENTS contents ) { LinkListNode_T *pNode = new LinkListNode_T; if (pNode == NULL) { panic("append2Current: new failed"); } else { pNode->prev = _current; pNode->next = _current->next; pNode->contents = contents; _current->next->prev = pNode; _current->next = pNode; } } void LinkList_T:: prepend2current( CONTENTS contents ) { LinkListNode_T *pNode = new LinkListNode_T; if (pNode == NULL) { panic("prepend2Current: new failed"); } else { pNode->prev = _current->prev; pNode->next = _current; pNode->contents = contents; _current->prev->next = pNode; _current->prev = pNode; } } void LinkList_T:: deleteAll( void ) { while (!isEmpty()) deleteFirst(); } void LinkList_T:: freeAll( void ) { while (!isEmpty()) delete deleteFirst(); } void LinkList_T:: freeCurrent( void ) { delete deleteCurrent(); } bool LinkList_T:: freeMatch ( CONTENTS contents ) { LinkListNode_T *pNode; for(pNode = _top; pNode != (LinkListNode_T *)this; pNode = pNode->next) { if (pNode->contents == contents) { freeNode(pNode); return true; } } return false; } LinkListNode_T* LinkList_T:: findMatch(CONTENTS contents) { LinkListNode_T *pNode; for(pNode = _top; pNode != (LinkListNode_T *)this; pNode = pNode->next) { if (pNode->contents == contents) return pNode; } return (LinkListNode_T *)NULL; } int LinkList_T:: index ( CONTENTS contents ) { LinkListNode_T *pNode; int index = 0; for(pNode = _top; pNode != (LinkListNode_T *)this; pNode = pNode->next, index++) { if (pNode->contents == contents) return index; } return -1; } CONTENTS LinkList_T:: contents( int index ) { LinkListNode_T *pNode; int count = 0; for(pNode = _top; pNode != (LinkListNode_T *)this; pNode = pNode->next, count++) { if (count == index) return pNode->contents; } return (CONTENTS)NULL; // (CONTENTS)-1 //old } void LinkList_T:: freeNode(LinkListNode_T *pNode) { delete deleteNode(pNode); } CONTENTS LinkList_T:: deleteNode(LinkListNode_T *pNode) { CONTENTS contents; if (pNode == (LinkListNode_T *)this) { return ((CONTENTS)NULL); } else if (pNode == _current) { return deleteCurrent(); } else { pNode->prev->next = pNode->next; pNode->next->prev = pNode->prev; contents = pNode->contents; delete pNode; return contents; } } void LinkList_T:: panic ( char *s ) //static { cout<<s<<endl; exit(1); }