其实双向链表原理和单向链表原理差不多,只不过是多了一个反向指针,双向链表在操作可以从两个方向进行,即头指针和为指针,这样做得优点是操作就近原则,提高效率。此内容包括:
- 双向链表的初始化
- 创建双向链表
- 用头指针遍历双链表
- 用尾指针遍历双链表
- 按索引查找节点
- 按索引删除节点
- 按索引添加节点
(1)双向链表的初始化
void InitDoubleList(pDLinkList *pHead, pDLinkList *pTail)
{
*pHead = new DLinkList;
(*pHead)->font = NULL;
(*pHead)->next = NULL;
*pTail = new DLinkList;
(*pTail)->font = NULL;
(*pTail)->next = NULL;
}
(2)创建双向链表
void CreatLinkList(pDLinkList pHead,pDLinkList pLinkTail)
{
int date;
cout << "请输入节点得值:";
cin >> date;
pDLinkList pTail = pHead;
while (-1 != date)
{
pDLinkList pNew = new DLinkList;
pNew->date = date;
pNew->next = NULL;
pTail->next = pNew;
pNew->font = pTail;
pTail = pNew;
cout << "请输入节点得值:";
cin >> date;
}
pTail->next = pLinkTail;
pLinkTail->font = pTail;
}
(3)用头指针遍历双链表
void HeadShowList(pDLinkList pHead)
{
cout << "从头部输出为:";
pDLinkList p = pHead->next;
while (p->next)
{
cout << p->date << " ";
p = p->next;
}
cout << endl;
}
(4)用尾指针遍历双链表
void TailShowList(pDLinkList pTail)
{
cout << "从未不输出为:";
pDLinkList p = pTail->font;
while (p->font)
{
cout << p->date << " ";
p = p->font;
}
cout << endl;
}
(5)- 按索引查找节点
pDLinkList FindByIndex(pDLinkList pHead, int index)
{
pDLinkList p = pHead->next;
int i = 0;
while (p->next->next && i < index)
{
p = p->next;
i++;
}
if (i == index)
{
return p;
}
else
{
cout << "索引值不在范围内." << endl;
return 0;
}
}
(6) 按索引删除节点
void DeleteByIndex(pDLinkList pHead, int index)
{
pDLinkList p = FindByIndex(pHead, index);
if (!p)
{
return;
}
p->font->next = p->next;
p->next->font = p->font;
delete p;
}
(7)按索引添加节点
void InsertByIndex(pDLinkList pHead, int index, int date)
{
pDLinkList p = FindByIndex(pHead, index);
if (!p)
{
return;
}
pDLinkList pNew = new DLinkList;
pNew->date = date;
p->font->next = pNew;
pNew->font = p->font;
p->font = pNew;
pNew->next = p;
}