C++自己实现list (一)

2014-11-24 12:55:08 · 作者: · 浏览: 3

  前两个博客发表了自己写的stack(栈)和queue(队列),感觉比较简单,今天想试着实现list,结果发现,不是那么容易,感觉自己对STL的底层不是很了解,

真要自己实现还真的很难,看STL的源代码,那个晕啊...那代码也写得太难理解了,当然跟我不了解有关,但我相信,在将来的某一天我会懂的,你看我的代码也会懂的。

  话说:STL中的list的内部结构就是一个双向链表,这个东东以前还真没有玩过,就凭他用的是双向链表我就不想用他,指针太多,耗资源,当然存在就有他的价值,

他能快速访问其中的元素。废话总该少说,代码就该多些。

  有那么一点高兴的是实现双向链表的翻转,其他的没什么了,list还没有实现,由于现在能力有限,新的版本一定会发布的,你就将就着看吧!

源码

#include

using namespace std;

template

class list {

public : list()

{

initialize();

}

list(int count)

{

initialize();

if(count>0)

{

for(int i=0;i

{

push_front(0);

}

}

}

list(int count,T data)

{

initialize();

if(count>0)

{

for(int i=0;i

{

push_front(data);

}

}

}

//显示最后一个节点

T& back()

{

checkEmpty();

return cur->data;

}

T& back() const

{

return back();

}

//显示第一个节点

T& front()

{

checkEmpty();

return head->next->data;

}

T& front() const

{

return front();

}

//弹出最后一个节点

void pop_back()

{

checkEmpty();

cur=cur->prev;

delete cur->next;

cur->next=NULL;

--len;

}

//弹出第一个节点

void pop_front()

{

checkEmpty();

node* tmp=head->next;

head->next=tmp->next;

tmp->prev=head;

delete tmp;

--len;

}

//前插节点

void push_front(const T& t)

{

node* newNode=new node(t);

head->next=newNode;

newNode->prev=head;

++len;

}

//后插节点

void push_back(const T& t)

{

node* newNode=new node(t);

newNode->prev=cur;

cur->next=newNode;

cur=newNode;

++len;

}

//删除所有值为t的节点

void remove(const T& t)

{

checkEmpty();

node* tmp=head->next;

for(int i=0;i

{

if(tmp->data!=t)

{

tmp=tmp->next;

continue;

}

if(tmp->next==NULL)//删除最后一个节点

{

cur=tmp->prev;

//将当前节点指向最后一个节点的前一个节点

cur->next=NULL;

//由于保持当前节点指向最后一个节点,他的下一个节点当然为空 }else //删除中间节点

{

tmp->prev->next=tmp->next;

//要删除节点的前一个节点的next指针指向要删除节点的下一个节点 tmp->next->prev=tmp->prev;

//要删除节点的下一个节点的prev指针指向要删除节点的前一个节点 }

--len;

node* t=tmp->next;

delete tmp;

tmp=t;

}

}

//反转链表

//每次都修改当前节点的前后节点指针

//最后一个节点的下一个指针指向前一个节点

void reverse()

{

checkEmpty();

node* prev = head;// 上一个节点

node* pcur = hea