双链表和单链表其实
其实起来大同小异。
双联表其实就是每一个节点都有前驱和后继,可以说,整个双链表的具体实现起来比单链表更加灵活,但是增加了结构性开销(前驱)。
有以下几个异同点:
1、因为双链表中每一个节点都有前驱和后继,那么我们现在curr可以是真正的curr了!
2、还是关于tail节点,究竟tail结点是没有实际内涵还是指向最后一个实际节点呢?
在我看来,如果你的curr还是真正的curr之前的一位,那么我感觉tail指针就可以完全指代我们的实际的最后一个节点了。
但是如果你是真正的curr,那么你就需要最后一个没有实际内容的tail节点。
下面尝试用真正的curr来实现,实现过程中遇到了以下问题:
1、真正的curr,那么你就需要最后一个没有实际内容的tail节点。
2、remove操作中,谨慎操作!别随便删除curr!把curr定义为next
3、一开始,curr应该=tail,这是一个很容易犯错误的点!
4、遍历函数!你想一下,您不能遍历到NULL了!而是应该到无实际内涵的tail就应该停止了!!!
5、你的remove应该要判断一下当前位置curr是不是表头或者表尾,这两个位置不能删除的啊喂!(#`O′)!!!尤其是我们那一开始就把curr设定为tail
简单源代码:(没有实现全部基本操作,但可以运行)
头文件LList.h
//实现双链表
//curr指真实的当前位置
#include<iostream>
using namespace std;
template<typename E>
class node
{
public:
node<E>*prev;
node<E>*next;
E element;
node(E value, node<E>*p = NULL, node<E>*n = NULL)
{
prev = p;
next = n;
element = value;
}
node(node<E>*p = NULL, node<E>*n = NULL)
{
prev = p;
next = n;
}
};
template<typename E>
class LList
{
private:
node<E>*head;
node<E>*tail;
node<E>*curr;
int size;
void init()
{
head=new node<E>;
tail=new node<E>;
curr=new node<E>;
curr = tail;
head->next = tail;
tail->prev = head;
size = 0;
}
void removeall()
{
curr = head->next;
while (curr != NULL)
{
node<E>*p = curr;
curr = curr->next;
delete p;
p = NULL;
}
}
public:
LList()
{
init();
}
~LList()
{
removeall();
}
void clear()
{
removeall();
init();
}
void insert(E it)
{
node<E>*p = new node<E>(it, curr->prev, curr);
curr->prev->next = p;
curr->prev = p;
size++;
}
bool remove()
{
if(curr==head||curr==tail)
{
cout<<"表头表尾不能删除"<<endl;
return false;
}
else
{
node<E>*p = curr;
curr->prev->next = curr->next;
curr->next->prev = curr->prev;
curr = curr->prev;
delete p;
p = NULL;
size--;
return false;
}
}
bool setPos(int i)//第一个实际内涵节点为1,不是0
{
if(i<=0||i>size)
{
cout<<"非法"<<endl;
return false;
}
else
{
curr=head;
while(i--)
{
curr=curr->next;
}
}
}
void tran()
{
curr = head->next;
while (curr != tail)//注意点一!
{
cout << curr->element << endl;
curr = curr->next;
}
}
};
main.cpp
#include"LList.h"
int main()
{
LList <int>list;
list.insert(1);
list.insert(2);
list.insert(3);
list.remove();
list.setPos(1);
list.remove();
list.tran();
system("pause");
}