C++实现双向链表

今天同学在coding的时候遇到点小麻烦,然后晚上回来的时候敲好有时间,顺便实现了一番,指针,指针,听大佬说是C语言的精髓(悄悄话)
是女装就直接上代码,少啰嗦

代码略带点注释,具体指针是怎么指向,仔细琢磨基本可以搞定,一天不行,盘他一个星期

#ifndef _DOUBLE_LIST_HPP_

#include <iostream>
using namespace std;

//结点
typedef struct node
{
struct node* next;
struct node* pre;
int data;
}Node;


class DoubleList
{
private:
//双向链表的第一个节点(是有数据的,就是课本上的无头结点链表)
Node* head;

//表长
int _size;


public:

//无头结点的链表
DoubleList(int headData)
{
head = new Node;
head->pre = NULL;
head->next = NULL;
head->data = headData;

_size = 1;
}

~DoubleList()
{
delete head;
head = NULL;
}

//从头部开始打印输出
void print()
{
if (!empty())
{
Node* tmp = head;
while (tmp)
{
cout << tmp->data << endl;
tmp = tmp->next;
}
}
}

//从尾部开始打印输出
void rprint()
{
if (!empty())
{
//遍历到表尾
Node* tmp = head;
while (tmp->next)
{
tmp = tmp->next;
}

//反向遍历
while (tmp)
{
cout << tmp->data << endl;
tmp = tmp->pre;
}
}
}

//尾插法
bool insertEnd(int data)
{
Node* tmp = head;
while (tmp->next)
{
tmp = tmp->next;
}

//insert
Node* _node = new Node;
_node->data = data;
_node->next = NULL;
tmp->next = _node;
_node->pre = tmp;

++_size;
return false;
}

//头插法
bool insertBegin(int data)
{
Node* tmp = head;
//insert
Node* _node = new Node;
_node->data = data;
_node->pre = NULL;
_node->next = tmp;
head = _node;

++_size;
return false;
}

//删除某个元素
bool Delete(int data)
{
Node* tmp = findElement(data);
if (!tmp)
{
cout << data << "不存在" << endl;
return false;
}

if (tmp->next == NULL)
{
deleteEnd();
}
else if (tmp->pre == NULL)
{
deleteBegin();
}
else
{
Node* tmpNext = tmp->next;
tmp->pre->next = tmpNext;
tmpNext->pre = tmp->pre;

}

--_size;
close(tmp);
return true;
}

//删除头元素
bool deleteBegin()
{
Node* tmp = head;
Node* t = tmp->next;
t->pre = NULL;
head = t;

--_size;
close(tmp);
return false;
}

//删除尾元素
bool deleteEnd()
{
Node* tmp = head;
while (tmp->next)
{
tmp = tmp->next;
}

Node* t = tmp;
t->pre->next = NULL;

--_size;
close(tmp);
return false;
}

//查找某元素是否在里面
bool find(int data)
{
Node tmp = *head;

while (tmp.next)
{
if (tmp.data == data)
{
return true;
}
tmp = *tmp.next;
}

return false;
}

//直接获取表长
int size()
{
return _size;
}

//清空链表
void clear()
{
Node* tmp = head->next;

while (tmp)
{
--_size;
close(head);
head = tmp;
tmp = tmp->next;
}

--_size;
head->next = NULL;
head->pre = NULL;
head->data = 0;
//close(head);
//close(head);
}

//判断是否为空
bool empty()
{
return _size >= 0 ? false: true;
}

//取头元素
int font()
{
return head->data;
}

//取尾元素
int back()
{
Node tmp = *head;
while (tmp.next)
{
tmp = *tmp.next;
}

return tmp.data;
}

private:

//查找元素结点
Node* findElement(int data)
{
Node* tmp = head;

while (tmp)
{
if (tmp->data == data)
{
return tmp;
}
tmp = tmp->next;
}

return NULL;
}

//释放某结点内存
void close(Node* node)
{
delete node;
node = NULL;
}

};


int main()
{
cout << "双向链表" << endl;
DoubleList* dlist = new DoubleList(1);
for (int i = 2; i <= 5; i++)
{
//表头插入
dlist->insertEnd(i);
}


///
//测试


cout << "-------------------" << endl;
dlist->print();

/*if (dlist->find(4))
{
cout << "yes" << endl;
}
else {
cout << "no" << endl;
}*/

cout<<dlist->font()<<endl;
cout << dlist->back() << endl;


//打印输出
/*cout << "-------------------" << endl;
dlist->print();
cout << "-------------------" << endl;
dlist->rprint();
cout << "size=" << dlist->size()<<" "<<dlist->length() << endl;
*/
//表尾
//dlist->insertEnd(5);

//删除中间、开头、结尾都可以
//dlist->Delete(3);

//删除开头
/*dlist->deleteBegin();
dlist->deleteBegin();
dlist->deleteBegin();*/

//删除结尾
/*dlist->deleteEnd();
dlist->deleteEnd();
dlist->deleteEnd();
*/

/*cout << "-------------------" << endl;
dlist->print();
cout << "size=" << dlist->size() << " " << endl;
dlist->clear();
cout << "size=" << dlist->size() << " " << endl;
cout << "-------------------" << endl;
dlist->print();*/


cin.get();
return 0;
}


#endif // !_DOUBLE_LIST_HPP_