数据结构--循环双向链表
2014-03-02 20:20
323 查看
双向链表的节点定义如下:
链表的最后一个节点的next指向头结点,头结点的prev指针指向链表的最后一个元素。
实现代码如下:
执行结构如图:
struct DuListNode{ int val; DuListNode *prev,*next; DuListNode(int x):val(x),prev(NULL),next(NULL){} };
链表的最后一个节点的next指向头结点,头结点的prev指针指向链表的最后一个元素。
实现代码如下:
#include<iostream>
#include<cstdlib>
#include<assert.h>
using namespace std;
struct DuListNode{ int val; DuListNode *prev,*next; DuListNode(int x):val(x),prev(NULL),next(NULL){} };
typedef DuListNode * DuListHead;
class DuList{
private:
//DuListNode *prev;
//DuListNode *next;
int val;
DuListHead head;<span style="white-space:pre"> </span>// 该链表只需要头节点即可。
public:
DuList();
~DuList();
//void Init();
bool IsEmpty();
void Clear();
int Length();
DuListNode *GetElem(int);
void Insert(int, int);
void Delete(int);
void Traverse();
void RevTraverse();
};
DuList::DuList()
{
cout << "Construst..." << endl;
head = new DuListNode(0);
head->prev = head;
head->next = head;
}
DuList::~DuList()
{
if(head == NULL)return;
DuListNode* q, *p = head->next;
while(p != head)
{
q = p->next;
delete p;
p = q;
}
free(head); //head node
head = NULL;
}
bool DuList::IsEmpty()
{
if(head->next == head && head->prev== head)
return true;
else
return false;
}
void DuList::Clear()
{
DuListNode *q, *p = head->next;
while(p != head)
{
q = p->next;
delete p;
p = q;
}
head->next = head;
head->prev = head;
}
int DuList::Length()
{
int i = 0;
DuListNode *p = head->next;
while(p != head)
{
i++;
p = p->next;
}
return i;
}
DuListNode * DuList::GetElem(int i)//返回第i个链表节点
{
int j = 1;
DuListNode *p = head->next;
while( p != head && j < i)
{
j++;
p = p->next;
}
if (p == head || j < i)
return NULL;
else
return p;
}
void DuList::Insert(int i, int x)//在链表的第i个位置插入值为x的节点
{
if(i<0)
return;
cout << "Insert..." << i << x << endl;
DuListNode *node = new DuListNode(x);
DuListNode *curPrev;
if(i == 0)
curPrev = head;
else
curPrev = GetElem(i-1);
DuListNode *tNext = curPrev->next;
node->next = tNext;
tNext->prev = node;
node->prev = curPrev;
curPrev->next = node;
return;
}
//delete node which number is value
void DuList::Delete(int x)//删除第一个值为x的节点
{
DuListNode *q = head ,*p = head->next;
while(p != head && p->val != x)
{
q = p;
p = p->next;
}
if(p == head)
cout << "elem not exist.." << endl;
else
{
assert(p->val == x);
assert(q->next == p);
q->next = p->next;
p->next->prev = q;
delete p;
p = NULL;
}
return;
}
void DuList::Traverse()//遍历链表中的节点
{
DuListNode *q, *p = head->next;
while(p != head)
{
cout << p->val << " ";
p = p ->next;
}
cout << endl;
}
void DuList::RevTraverse()//反序遍历链表中的节点
{
DuListNode *p = head->prev;
while( p != head)
{
cout << p->val << " ";
p = p->prev;
}
cout << endl;
}
int main()
{
DuList L1;
if(L1.IsEmpty())
cout << "L1 is empty..." << endl;
L1.Insert(0,5);
L1.Insert(0,3);
L1.Insert(0,2);
L1.Insert(0,1);
L1.Insert(4,4);
L1.Traverse();
L1.RevTraverse();
DuListNode *node(NULL);
if(node = L1.GetElem(2))
cout << node->val << endl;
L1.Delete(2);
L1.Traverse();
L1.RevTraverse();
return EXIT_SUCCESS;
}
执行结构如图:
相关文章推荐
- C++实现数据结构三 双向循环链表
- 数据结构学习之链表(单向、单循环以及双向)(递归实现)
- 数据结构:带头结点的双向循环链表
- 初学数据结构——单向循环链表和双向循环链表。
- 数据结构--双向带哨兵的循环链表
- 数据结构示例之带头节点的双向循环链表
- 数据结构编程笔记六:第二章 线性表 双向循环链表的实现
- 数据结构-内核的双向循环链表-简单实现
- 数据结构JavaScript——双向链表、双向循环链表
- 【C++数据结构】循环双向链表
- 数据结构高分笔记 算法2-18~2-19:双向循环链表
- 数据结构-有头双向循环链表
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 数据结构 循环链表、双向链表、一元多项式
- 数据结构--双向循环链表C实现
- 小猪的数据结构辅助教程——2.7 线性表中的双向循环链表
- 数据结构也不是那么没意思之后序二叉树+二叉树转伪双向循环链表
- 【数据结构】单向链表,单向循环链表,双向循环链表
- 数据结构_线性表_链式存储_双向循环链表的基本操作
- C/C++、JAVA 数据结构 :双向循环链表