C+双链表
来源:互联网 发布:eplan软件价格 编辑:程序博客网 时间:2024/06/02 20:56
#include "iostream"using namespace std;template <class Elem> class Link {private: static Link<Elem>* freelist; // Headpublic: Elem element; // Value for this node Link *next; // Pointer to next node Link *prev; // Pointer to previous Link(const Elem& e, Link* prevp =NULL, Link* nextp =NULL) { element=e; prev=prevp; next=nextp; } Link(Link* prevp =NULL, Link* nextp =NULL) { prev = prevp; next = nextp; } void* operator new(size_t); // Overload void operator delete(void*); // Overload};template <class Elem>Link<Elem>* Link<Elem>::freelist = NULL;template <class Elem> // Overload for newvoid* Link<Elem>::operator new(size_t) { if (freelist == NULL) return ::new Link; Link<Elem>* temp = freelist; // Reuse freelist = freelist->next; return temp; // Return the link}template <class Elem> // Overload deletevoid Link<Elem>::operator delete(void* ptr){ ((Link<Elem>*)ptr)->next = freelist; freelist = (Link<Elem>*)ptr;}template<class Elem> class LList : public Link<Elem> { // Linked list classprivate:Link<Elem>* head; // Pointer to list headerLink<Elem>* tail; // Pointer to last Elem in list Link<Elem>* fence; // last elements on left sideint leftcnt; //size of left partitionint rightcnt; //size of right partitionprivate:void init(){ //initialization routinefence = tail = head = new Link<Elem>;leftcnt = rightcnt = 0;}void removeall(){//return link nodes to free storewhile(head != NULL){fence = head;head = head->next;delete fence;}}public:// LList() // Constructor// { init(); } // Initialize// ~LList(){ removeall();}// void clear() { removeall(); init();}bool insert(const Elem& item) {fence->next = new Link<Elem>(item, fence, fence->next); if (fence->next->next != NULL) fence->next->next->prev = fence->next; if (tail == fence) // Appending new Elem tail = fence->next; // so set tail rightcnt++; // Added to right return true;}bool append(const Elem& item) // Insert Elem at tail of list{tail=tail->next=new Link<Elem>(item,tail,NULL);rightcnt++;return true;}bool remove(Elem& it) { // Remove and return current Elemif (fence->next == NULL) return false; it = fence->next->element; Link<Elem>* ltemp = fence->next; if (ltemp->next != NULL)ltemp->next->prev = fence;else tail = fence; // Reset tailfence->next = ltemp->next; // Remove delete ltemp; // Reclaim spacerightcnt--; // Removed from rightreturn true;}void setStart() // Set fence to first position{ fence = head; rightcnt += leftcnt; leftcnt = 0; }void setEnd() // Set fence to end position{ fence = tail; leftcnt += rightcnt; rightcnt = 0; }void prev() { Link<Elem>* temp = head;if(fence == head) return; //no previous elemwhile(temp->next != fence) temp = temp->next;fence = temp;leftcnt--;rightcnt++;}void next() // Move curr to next position{ if(fence != tail)//don't move fence if right empty{fence = fence->next; rightcnt--; leftcnt++;}} // Return length of left and right partition, respectivelyint leftLength() const { // Return current length of listreturn leftcnt;}int rightLength() const { // Return current length of listreturn rightcnt;}bool setPos(int pos) { // Set curr to specified positionif((pos < 0) || (pos > rightcnt + leftcnt)) return false;fence = head;for(int i = 0; i < pos; i++) fence = fence->next;return true;}bool getValue(Elem& it) const // Return value of current Elem{ if(rightLength() == 0) return false;it = fence->next->element;return true;}void print() const{Link<Elem>* temp = head;cout << "<";while(temp != fence){cout << temp->next->element<<" ";temp = temp->next;}cout << "|";while(temp->next != NULL){cout << temp->next->element << " ";temp = temp->next;}cout << ">\n";}};int main(int argc, char* argv[]){LList<int> lList;lList.insert(8);lList.insert(9);lList.insert(3);lList.insert(4);lList.append(1);lList.print();return 0;}
0 0
- C+双链表
- 双链表(java c/c++)
- C语言实现双链表
- C实现双链表
- C实现循环双链表
- c语言实现双链表
- c语言实现双链表
- c 双链表的实现
- C语言实现双链表
- 双链表 C语言实现
- 【数据结构】双链表(c++)
- C语言实现双链表
- C语言之双链表
- 数据结构--双链表(C语言)
- C语言数据结构-双链表
- 双链表(C实现)
- C语言实现双链表
- C 循环双链表
- php 截取字符串 解决html实体的问题
- Java中equal和==的区别
- 【COCOS2D-X学习】 Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本
- Java中的StringBuilder类功能详解
- instanceof的理解
- C+双链表
- linux系统挂载光盘镜像ISO的方法
- poj 2676 数独 ---dfs
- javascript 解 一笔画游戏
- Java中单态设计模式
- 有关DBN的一点小心得
- SlidingMenu和ActionBarSherlock结合使用案例
- unity实现可编辑网格
- clang 与 libc++