数据结构--循环双向链表

双向链表的节点定义如下:

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;
}

执行结构如图:


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值