线性表-双链表

双链表节点的实现

DLink.h

template <class Elem> 
class DLink
{
private:
	static DLink<Elem>* freelist;
public:
	Elem element;
	DLink *next;
	DLink *prev;
	DLink(const Elem& e, DLink* prevp = NULL, DLink* nextp = NULL)
	{
		element = e;
		prev = prevp;
		next = nextp;
	}
	DLink(DLink* prevp = NULL, DLink* nextp = NULL)
	{
		prev = prevp;
		next = nextp;
	}

	void* operator new(size_t);
	void operator delete(void *);
};

template <class Elem>
DLink<Elem>* DLink<Elem>::freelist = NULL;

template <class Elem>
void* DLink<Elem>::operator new(size_t)
{
	if(freelist = NULL) return ::new DLink;  // creat space
	DLink<Elem>* temp = freelist;
	freelist = freelist->next;
	return temp;
}

template <class Elem>
void DLink<Elem>::operator delete(void* ptr)
{
	((DLink<Elem>*)ptr)->next = freelist;   // put on freelist
	freelist = (Link<Elem>*)ptr;
}

双链表的实现声明 & 成员函数的是实现

#include "stdafx.h"
#include "List.h"
#include "dlink.h"

template <class Elem>
class DList: public List<Elem>
{
private:
	DLink<Elem>* head;
	DLink<Elem>* tail;
	DLink<Elem>* fence;           
	int leftcnt;
	int rightcnt;

	void init()
	{
		fence = tail = head = new DLink<Elem>;
		leftcnt = rightcnt = 0;
	}

	void removeall()
	{
		while(head != NULL)
		{
			fence = head;
			head = head->next;
			delete fence;
		}
	}

public:
	DList()
	{
		init();
	}

	~DList()
	{
		removeall();
	}

	void clear()
	{
		removeall();
		init();
	}
	bool insert(const Elem&);

	bool append(const Elem&);

	bool remove(Elem&);

	void setStart()
	{
		fence = head;
		rightcnt += leftcnt;
		leftcnt = 0;
	}

	void setEnd()
	{
		fence = tail;
		leftcnt += rightcnt;
		rightcnt = 0;
	}

	void prev();

	void next()
	{
		if(fence != tail)
		{
			fence = fence->next;
			rightcnt--;
			leftcnt++;
		}
	}

	int leftLength() const
	{
		return leftcnt;
	}

	int rightLength() const
	{
		return rightcnt;
	}

	bool setPos(int pos);

	bool getValue(Elem& it) const
	{
		if(rightLength() == 0)
		{
			return false;
		}
		it  = fence->next->element;
		
		return true;
	}

	void print() const;
};

template<class Elem>
bool DList<Elem>::insert(const Elem& item)
{
	fence->next = new DLink<Elem>(item, fence, fence->next);
	if(fence->next->next != NULL)
	{
		fence->next->next->prev = fence->next;
	}
	if(fence == tail)
	{
		tail = fence->next;
	}
	rightcnt++;
	leftcnt--;
}

template<class Elem>
bool DList<Elem>::append(const Elem& item)
{
	tail = tail->next = new DList<Elem>(item, tail, NULL);
	rightcnt++;
	return true;
}

template<class Elem>
bool DList<Elem>::remove(Elem& item)
{
	if(fence->next = NULL)	returen false;
	item = fence->next->element;
	DLink<Elem>* ltemp = fence->next;
	if(ltemp->next != NULL)
	{
		ltemp->next->prev = fence;
	}
	else
	{
		tail = fence;
	}
	fence->next = ltemp->next;
	delete ltemp;
	rightcnt--;
	return true;
}

template<class Elem>
void DList<Elem>::prev()
{
	if(fence != head)
	{
		fence = fence->prev;
		leftcnt--;
		rightcnt++;
	}

}

template<class Elem>
void DList<Elem>::print() const
{
	DLink<Elem>* temp = head;
	cout << "< ";
	while(temp != fence)
	{
		cout << temp->next->element << " ";
		temp = temp->next;
	}
	cout << "| ";
	while(temp->next != NULL)
	{
		cout << temp->next->element << " ";
		temp = temp->next;
	}
	cout << ">\n ";
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值