大二新开数据结构课了,我把我写的代码粘上来
// double.cpp
// main.cpp 测试
我的代码会参考网上很多大神的代码,但绝不是抄袭,还有..........起名字是个很大的问题,我英语水平不高啊,所以各位不要纠结于各个函数的名字啊
双链表多了一个前驱,应该可以再一些算法上改进,如查找上分别向两个方向查找
我写的这个只是在单链表的基础上改进,没有对双链表的特性对算法进行改进,偷懒了,啦啦
双链表,错误处请指正,谢谢
//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;
}