线性表--链式存储

基类:

#ifndef LINEARLIST_H
#define LINEARLIST_H

/*
* FileName: LinearList.h
*Creater:QianChenglong
*Date:2011/10/18
*Comments: 线性表的抽象基类
*/

template<typename T>
class LinearList{
public:
LinearList()//默认构造函数
{}
~LinearList()//析构函数
{}
virtual int Length() const=0;//求表长;
virtual int Search(const T& x)const=0;//根据值搜索位序;
virtual T getData(int i) =0;//取值;
virtual void setData(int i,const T x) =0;//赋值;
virtual bool Insert(int i,T& x) =0;//插入;
virtual bool Remove(int i,T& x) =0;//删除;
virtual bool IsEmpty() const=0;//判断表空;
virtual void output() const=0;//输出;
};

#endif


类定义:

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

#include"LinearList.h"

template<typename T>
class LinkedList:public LinearList<T>
{
private:
struct ListNode;
ListNode *head,*tail;
int length;
public:
LinkedList();//构造函数
~LinkedList();//析构函数
ListNode* Locate(int i);//返回指向第i-1个节点的指针;
int Length() const;//求表长
int Search(const T& x) const;
T getData(int i);
void setData(int i,const T x);
bool PushBack(const T& x);//从链表后端插入;
bool PushFront(T& x);//从链表前端插入;

bool Insert(int i,T& x);//将数据x插入指定位置;
bool Remove(int i,T& x);//删除指定位置数据;
bool IsEmpty() const;
void output() const;
};

template<typename T>
struct LinkedList<T>::ListNode{
T data;
ListNode* next;

ListNode(T const& _data);
ListNode();
};

#include"LinkedList.cpp"

#endif


类实现:

#ifndef LINKEDLIST_CPP
#define LINKEDLIST_CPP

#include"LinkedList.h"
#include<iostream>

//////////////////////////////////////////////////////////////////////
template<typename T>
LinkedList<T>::ListNode::ListNode(const T& _data)//嵌套类的构造函数
:data(_data),next(0)
{}

////////////////////////////////////////////////////////////////////
template<typename T>
LinkedList<T>::ListNode::ListNode()
:next(0)
{}

//////////////////////////////////////////////////////////////////
template<typename T>
LinkedList<T>::LinkedList()
{
tail=head=new ListNode;
length=0;
}

template<typename T>
LinkedList<T>::~LinkedList()
{
ListNode *work=head->next;//work指向第一个节点
while(work!=0)
{
head->next=work->next;
delete work;
work=head->next;
}
}

template<typename T>
bool LinkedList<T>::PushBack(const T& x)
{
ListNode *work=new ListNode(x);
if(!work) return 0;
tail->next=work;
tail=work;
++length;
return 1;
}

template<typename T>
bool LinkedList<T>::PushFront(T& x)
{
ListNode<T> *work=new ListNode<T>(x);
if(!work) return 0;
work->next=head->next;
head->next=work;
++length;
return 1;
}

template<typename T>
int LinkedList<T>::Length() const
{
return length;
}

//////////////////////////////////////////////////////////////////
template<typename T>
typename LinkedList<T>::ListNode *LinkedList<T>::Locate(int i){//嵌套依赖类型名要加上typename
ListNode* work=head;
if(i>length)
return 0;
for(int n=1;n!=i;++n)//找到第i-1个节点的指针
work=work->next;
return work;
}

template<typename T>
bool LinkedList<T>::Insert(int i,T& x)
{
ListNode* newNode=new ListNode(x);
if(!newNode) return 0;
ListNode* work=Locate(i);
newNode->next=work->next;
work->next=newNode;
++length;
return 1;
}

template<typename T>
bool LinkedList<T>::Remove(int i,T& x)
{
ListNode* work=Locate(i);
ListNode* removedNode=work->next;
x=removedNode->data;
work->next=work->next->next;
delete removedNode;
--length;
return 1;
}

template<typename T>
int LinkedList<T>::Search(const T& x) const
{
ListNode* work=head->next;
int i=1;
while(work->data!=x)
{
work=work->next;
++i;
}
if(work->data!=x)
return 0;
else
return i;
}

template<typename T>
T LinkedList<T>::getData(int i)
{
ListNode* work=Locate(i+1);//为什么加了const后就不行?
return work->data;
}

template<typename T>
void LinkedList<T>::setData(int i,const T x)
{
ListNode* work=Locate(i+1);
work->data=x;
}

template<typename T>
bool LinkedList<T>::IsEmpty() const
{
return length==0;
}

template<typename T>
void LinkedList<T>::output() const
{
ListNode* work=head->next;
while(work)
{
std::cout<<work->data<<' ';
work=work->next;
}
std::cout<<std::endl;
}

#endif


功能测试:

#include<iostream>
#include"LinkedList.h"

int main()
{
LinkedList<int> list;
for(int i=0;i!=10;++i)
list.PushBack(i);
list.output();
std::cout<<list.Length()<<std::endl
<<list.IsEmpty()<<std::endl
<<list.Search(5)<<std::endl;
int x;
list.Remove(3,x);
list.output();
std::cout<<x<<std::endl;
std::cout<<list.getData(3)<<std::endl;
list.setData(3,4);
list.output();
std::cout<<list.getData(3)<<std::endl;

return 0;

}


你可能感兴趣的:(线性表)