// 双向链表
#if 1
#include <iostream>
using namespace std;
typedef int DataType;
class Node
{
public:
DataType data;
Node* next;
Node* pri;
};
typedef Node* ListHead;
class DoubleList
{
public:
DoubleList()
{
m_pHead = nullptr;
//m_nLength = 0;
}
ListHead GetHead();
uint32_t GetListLength();
bool CreateList();
bool InsertToHead(DataType value);
bool InsertToTail(DataType value);
bool InsertToAny(DataType value, uint32_t pos);
bool DelFromHead();
bool DelFromTail();
bool DelFromAny(uint32_t pos);
void Print();
private:
//uint32_t m_nLength;
ListHead m_pHead;
};
ListHead DoubleList::GetHead()
{
return m_pHead;
}
void DoubleList::Print()
{
if (m_pHead == nullptr)
{
return;
}
Node* pHead = m_pHead->next;
while (pHead)
{
cout << pHead->data << ", ";
pHead = pHead->next;
}
cout << endl;
}
bool DoubleList::CreateList()
{
if (m_pHead == nullptr) // 创建头结点
{
Node* pNode = new Node;
if (pNode)
{
pNode->data = -1;
pNode->next = nullptr;
pNode->pri = nullptr;
m_pHead = pNode;
return true;
}
}
}
bool DoubleList::InsertToHead(DataType value)
{
if (m_pHead == nullptr)
{
return false;
}
else if (m_pHead->next == nullptr)
{
Node* pNode = new Node;
pNode->data = value;
pNode->next = nullptr;
pNode->pri = nullptr;
m_pHead->next = pNode;
pNode->pri = m_pHead;
}
else
{
Node* pNode = new Node;
pNode->data = value;
pNode->next = nullptr;
pNode->pri = nullptr;
Node* pTmp = m_pHead->next;
pNode->next = pTmp;
pTmp->pri = pNode;
m_pHead->next = pNode;
pNode->pri = m_pHead;
}
return true;
}
bool DoubleList::InsertToTail(DataType value)
{
if (m_pHead == nullptr)
{
return false;
}
else if (m_pHead->next == nullptr)
{
Node* pNode = new Node;
pNode->data = value;
pNode->next = nullptr;
pNode->pri = nullptr;
m_pHead->next = pNode;
pNode->pri = m_pHead;
}
else
{
Node* pHead = m_pHead->next;
while (pHead->next)
{
pHead = pHead->next;
}
Node* pNode = new Node;
pNode->data = value;
pNode->next = nullptr;
pNode->pri = nullptr;
pHead->next = pNode;
pNode->pri = pHead;
}
return true;
}
uint32_t DoubleList::GetListLength()
{
if (m_pHead == nullptr)
{
return -1;
}
uint32_t uNum = 0;
Node* pHead = m_pHead->next;
while (pHead)
{
pHead = pHead->next;
uNum++;
}
return uNum;
}
bool DoubleList::InsertToAny(DataType value, uint32_t pos) // pos指的是第几个节点插入, 默认从1开始
{
if (m_pHead == nullptr || pos <= 0 || pos > GetListLength())
{
return false;
}
else if (m_pHead->next == nullptr && pos == 1)
{
if (!InsertToHead(value))
{
return false;
}
}
else
{
if (m_pHead->next != nullptr)
{
Node* pHead = m_pHead->next;
while (pos > 0)
{
pos--;
pHead = pHead->next;
}
if (!pHead)
{
if (!InsertToTail(value))
{
return false;
}
}
else
{
Node* pNode = new Node;
pNode->data = value;
pNode->next = nullptr;
pNode->pri = nullptr;
pNode->pri = pHead->pri;
pNode->next = pHead;
pHead->pri->next = pNode;
pHead->pri = pNode;
}
}
}
return true;
}
bool DoubleList::DelFromHead()
{
if (m_pHead == nullptr || m_pHead->next == nullptr)
{
return false;
}
else
{
Node* pHead = m_pHead->next;
m_pHead->next = pHead->next;
pHead->next->pri = m_pHead;
pHead->next = nullptr;
pHead->pri = nullptr;
delete pHead;
pHead = nullptr;
}
return true;
}
bool DoubleList::DelFromTail()
{
if (m_pHead == nullptr || m_pHead->next == nullptr)
{
return false;
}
else
{
Node* pHead = m_pHead->next;
while (pHead->next)
{
pHead = pHead->next;
}
pHead->pri->next = nullptr;
pHead->next = nullptr;
pHead->pri = nullptr;
delete pHead;
pHead = nullptr;
}
return true;
}
bool DoubleList::DelFromAny(uint32_t pos)
{
if (m_pHead == nullptr || m_pHead->next == nullptr || pos <= 0 || pos >= GetListLength())
{
return false;
}
else if (pos = GetListLength() - 1)
{
if (!DelFromTail())
{
return false;
}
}
else
{
if (m_pHead->next != nullptr)
{
Node* pHead = m_pHead->next;
while (pos > 0)
{
pos--;
pHead = pHead->next;
}
pHead->pri->next = pHead->next;
pHead->next->pri = pHead->pri;
pHead->next = nullptr;
pHead->pri = nullptr;
delete pHead;
pHead = nullptr;
}
}
return true;
}
int main()
{
DoubleList d;
d.CreateList();
d.InsertToHead(1);
d.InsertToHead(2);
d.InsertToHead(3);
d.InsertToTail(4);
d.InsertToTail(5);
d.InsertToAny(6, 4);
d.Print();
//d.DelFromHead();
//d.DelFromTail();
d.DelFromAny(4);
d.Print();
return 0;
}
#endif