数据结构c++实现----双链表

大二新开数据结构课了,我把我写的代码粘上来

我的代码会参考网上很多大神的代码,但绝不是抄袭,还有..........起名字是个很大的问题,我英语水平不高啊,所以各位不要纠结于各个函数的名字啊

双链表多了一个前驱,应该可以再一些算法上改进,如查找上分别向两个方向查找

我写的这个只是在单链表的基础上改进,没有对双链表的特性对算法进行改进,偷懒了,啦啦

双链表,错误处请指正,谢谢

//head.h

/***************************************
*这个node节点可以反复使用
*本来,我想用继承,但无法实现。又在类里定义node,但操作麻烦,前后指针操作都要使用函数
*最后确定用 友员
*修改时间: 2013 09 25 23:50
****************************************/

#ifndef HEAD

#define HEAD
#include<iostream>
using namespace std;
template<typename T> class DoubleList;

template <typename T>
class LinkNode
{
	public:
		friend class DoubleList<T>;
		LinkNode();
		LinkNode( const T &elem);
		//~LinkNode();用不到
    private:
		T data;
		LinkNode<T> *pPre;
		LinkNode<T> *pNext;
};

template <typename T>
LinkNode<T>::LinkNode():pPre(NULL),pNext(NULL)
{
	//用于初始化头结点,data用不到。
}
template <typename T>
LinkNode<T>::LinkNode( const T &elem):data(elem),pPre(NULL),pNext(NULL)
{
	//初始化其余元素
}


#endif

// double.cpp

/*****************************************************
* 我根据上次写的单链表的类改编的,头结点的前指针是NULL,没有循环
* 感觉没有写出双链表的特点,只是多了一个前驱指针
* 改进:或者,再加一个尾指针,查找时首尾同事查找。
*
* 时间: 2013-9-26 20:55
******************************************************/
#include"head.h"

template<typename T> 
class DoubleList
{
	public:
		DoubleList();
		~DoubleList();

		int Length();
		bool IsEmpty();
		bool Insert( const T &elem , int index);
		bool InsertEnd( const T &elem);
		bool Delete( const T &elem);
		bool Updata( const T &elem, int index);
		int Select( const T &elem);     //查找失败返回零
		bool Get( int index ,T &elem);   // 若成功 有elem 带回索引值
		void Clear();
    private:
		LinkNode<T> *pHead;
		int Size;
};

template <typename T>
DoubleList<T>::DoubleList():Size(0)
{
	pHead = new LinkNode<T>;
}

template <typename T>
DoubleList<T>::~DoubleList()
{
	if( IsEmpty()){
		delete pHead;
	}
	else{
		Clear();
		delete pHead;
	}
}

template <typename T>
int DoubleList<T>::Length()
{
	return Size;
}
template <typename T>
bool DoubleList<T>::IsEmpty()
{
	if( 0 == Length()){
		return true;
	}
	else{
		return false;
	}
}
template <typename T>
bool DoubleList<T>::Insert(const T &elem, int index)
{
	if( Length() < index ){
		return false;
	}
	int i;
	LinkNode<T> *q,*p = pHead;
	for(i=1;i<index;i++){
		p = p->pNext; 
	}
	q  = p->pNext;
	p->pNext = new LinkNode<T>( elem );
	p->pNext->pNext = q;
	q->pPre = p->pNext;
	p->pNext->pPre = p;
	Size++;     //尺寸增加 勿忘

	return true;
}

template <typename T>
bool DoubleList<T>::InsertEnd(const T &elem)
{
	LinkNode<T> *p = pHead;
	while( p->pNext ){
		p = p->pNext;
	}
	p->pNext = new LinkNode<T>( elem );
	p->pNext->pPre = p;
	Size++;
	return true;
}

template <typename T>
bool DoubleList<T>::Delete(const T &elem)
{
	LinkNode<T> *q,*p = pHead->pNext;
	while( p && p->data != elem){   //防止访问超界,顺序判断顺序注意
		q = p;
		p = p->pNext;
	}
	if(!p){
		return false;
	}
	q->pNext = p->pNext;
	p->pNext->pPre =q;
	delete p;
	Size--;
	return true;
}

template <typename T>
bool DoubleList<T>::Updata(const T &elem, int index)
{
	if( Length() < index ){
		return false;
	}
	int i;
	LinkNode<T> *q,*p = pHead;
	for( i=0;i<index;i++){
		p = p->pNext; 
	}
	p->data = elem;
}

template <typename T>
int DoubleList<T>::Select(const T &elem)  //查找到返回位置,查找不到返回零
{
	LinkNode<T> *p = pHead->pNext;
	int i=1;
	while( p && p->data != elem){   
		i++;
		p = p->pNext;
	}
	if(!p){
		return 0;
	}
	return i;
}

template <typename T>
bool DoubleList<T>::Get( int index ,T &elem )
{
	if( Length() < index ){
		return false;
	}
	int i;
	LinkNode<T> *p = pHead;
	for(i=0;i<index;i++){
		p = p->pNext; 
	}
	elem = p->data;
	return true;
}
template <typename T>
void DoubleList<T>::Clear()
{
	LinkNode<T> *q,*p = pHead->pNext;
	pHead->pNext = NULL;
	while( p ){
		q = p;
		p = p->pNext;
		delete q;
	}
	Size = 0;
}

// main.cpp 测试

#include"head.h"
#include"DoubleList.cpp"

int main()
{
	DoubleList<int> slist;
	slist.InsertEnd(44);
	slist.InsertEnd(88);
	slist.InsertEnd(11);
	slist.InsertEnd(33);
	slist.InsertEnd(22);
	slist.Insert( 66,1);
	cout<<slist.Select(66)<<endl;
	cout<<slist.Select(44)<<endl;
	int t;
	slist.Get(1,t);
	cout<<t<<endl;
	cout<<slist.Length()<<endl;
	//cout<<slist.Delete(99)<<endl;
	//cout<<slist.Select(22)<<endl;
	//cout<<slist.Select(44)<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值