小白上手写的第一个双向链表(C++)

Posted c-w-l-110120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白上手写的第一个双向链表(C++)相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;

//节点
struct Node
{
int data;
Node* next;
Node* prev;
};

//链表类

class LinkList

{
private:
Node * head;
public:
void AddToHead(int x);//头部插入新元素
void AddToTail(int x);//尾部插入新元素
void DeleteFromHead();//删除头部一个元素
void DeleteFromTail();//删除尾部一个元素
void display();//打印链表
int GetNum(int x);//获得指定位置的元素
void Insert(int pos, int Num);//在指定位置插入新元素
int Num();//返回链表的长度
bool IsEmpty();//判断链表是否为空
~LinkList();//析构函数,释放空间。
};
void LinkList::Insert(int pos, int N)
{
if (pos == Num())
{
AddToTail(N);
return;
}
Node *p = head;
for (int i = 0; i < pos - 2; ++i, p = p->next)
{
;
}
Node *cur = new Node;
cur->data = N;
p->next->prev = cur;
cur->next = p->next;
p->next = cur;
cur->prev = p;
}

LinkList::~LinkList()
{
while (head)
{
Node*p = head;
head = head->next;
delete p;
}
}
int LinkList::GetNum(int x)
{
Node *p = head;
for (int i = 0 ; i < x-1; ++i, p = p->next)
{
;
}
return p->data;
}
bool LinkList::IsEmpty()
{
return head == NULL ? true : false;
}
void LinkList::AddToHead(int x)
{
Node* p = new Node;
p->data = x;
p->prev = NULL;
p->next = NULL;
if (IsEmpty())
{
p->prev = head;
head = p;
}
else
{
p->next = head;
head->prev = p;
head = p;
}
}

void LinkList::AddToTail(int x)
{
Node* p = new Node;
p->data = x;
p->prev = NULL;
p->next = NULL;
if (IsEmpty())
{
p->prev = head;
head = p;
}
else
{
Node * cur = NULL;
cur = head;
while (cur->next)
{
cur = cur->next;
}
cur->next = p;
p->prev = cur;

}
}

void LinkList::DeleteFromHead()
{
if (IsEmpty())
{
return;
}
else
{
Node* cur = head;
head = head->next;
delete cur;
}
}

void LinkList::DeleteFromTail()
{
if (IsEmpty())
{
return;
}
else
{
Node* cur = head;
while (cur->next)
{
cur = cur->next;
}
cur->prev->next = NULL;
delete cur;
}
}

void LinkList::display()
{
for (Node *p = head; p != NULL; p = p->next)
{
cout << p->data << endl;
}
}

int LinkList::Num()
{
int count = 0;
Node*cur = NULL;
cur = head;
while (cur)
{
count++;
cur = cur->next;
}
return count;
}

int main()
{

//测试用例
LinkList L;
L.AddToHead(20);
L.AddToHead(10);
L.AddToTail(30);
L.AddToTail(40);

L.display();

cout << "---------------" << endl;
L.Insert(2, 0);
L.display();
cout << "---------------" << endl;
cout << L.GetNum(1) << endl;

return 0;
}

 打印结果如下:

技术分享图片

 































































































































































以上是关于小白上手写的第一个双向链表(C++)的主要内容,如果未能解决你的问题,请参考以下文章

HashMap+双向链表手写LRU缓存算法/页面置换算法

如何在双向链表 C++ 上使用插入排序?

手写经典双向循环链表

双向链表(c++实现)

C++基于双向链表的List

7L-双线链表实现