C++顺序表的实现(采用模板)

(数组描述)采用模板

#ifndef CLinearList_
#define CLinearList_
#include<iostream.h>
template<class T>
 class CLinearList  
{
public:
	CLinearList(int MaxListSize=10); //构造函数
	virtual ~CLinearList();
	bool IsEmpty() const {return length== 0;}
    int Length() const {return length;} //返回当前元素个数
    bool Find(int k, T& x) const; //返回第k个元素保存至x中
    int Search(const T& x) const; // 返回x所在位置
	CLinearList<T>& Insert(int k, const T& x); // 在第k个位置插入x,从零开始算
	CLinearList<T>& Delete(int k, T& x);
   void Output(ostream& out) const;
private:
	int length;
    int MaxSize;
    T *element; // 一维动态数组

};

 template<class T> 
CLinearList<T>::CLinearList(int MaxListSize)// 基于公式的线性表的构造函数
{
  MaxSize = MaxListSize;
  element = new T[MaxSize];
  length =0;
}
template<class T>
bool CLinearList<T>::Find(int k, T& x) const
{ //把第k个元素取至x中
//如果不存在第k个元素则返回false,否则返回true
if (k<0 || k>length-1)  // 不存在第k个元素
return false;
x=element[k];
return true;
}

template<class T>
int CLinearList<T>::Search(const T& x) const  // 查找x,如果找到,则返回x所在的位置
{
// 如果x不在表中,则返回0
for (int i = 0; i < length; i++)
if (element[i] == x) return i;
return 0;
}
template<class T>
CLinearList<T>& CLinearList<T>::Delete(int k, T& x)
{// 把第k个元素放入x中,然后删除第k个元素
if (Find(k, x))
{
for (int i=k; i <length; i++)
element[i] = element[i+1];    // 把元素k+l, ...向前移动一个位置
length-- ;
return *this;
}
}

template<class T>
CLinearList<T>& CLinearList<T>::Insert(int k, const T& x)
{// 在第k个位置插入x

	if (k < 0 || k >MaxSize-1) 
		cout<<"位置不对!"<<endl;
	else if (length == MaxSize) 
		cout<<"超出数组最大长度!"<<endl;
	else
	{
	if(length!=0)
	{
    for (int i=length-1;i>=k; i--)
         element[i] = element[i-1];
	}
    element[k] = x;
    length++ ;
    
	}
	return *this;
}

template<class T>
void CLinearList<T>::Output(ostream& out) const   //把表输送至输出流 辅助函数,只要是为了重载<<,也可以用友元函数重载
{ 
for (int i = 0; i <length; i++)
out <<element[i] << " ";
}
// 重载<<
template <class T>
ostream& operator<<(ostream& out, const CLinearList<T>& x)
{
	x.Output(out);
	return out;
}
template<class T> 
CLinearList<T>::~CLinearList()
{
delete [] element;
}
#endif 


在主函数下调用:

#include "LinearList.h"
void main(void)
{
CLinearList<int> myList(5);
cout<<"线性表长度为:"<<myList.Length()<<endl;
cout << "IsEmpty =" << myList.IsEmpty()<<endl;
cout << "Length = " << myList.Length() << endl;
myList.Insert(0,2).Insert(1,10).Insert(2,49);

cout << "IsEmpty =" << myList.IsEmpty() << endl;
cout << "List is" <<myList<<endl;
cout << "Length = " << myList.Length() << endl;

int z;
myList.Find(1,z);
cout << "位置为1的元素为:" << z << endl;
myList.Delete(2,z);
cout << "Deleted element is"<< z << endl;
cout << "List is " << myList << endl;
cout << "Length = " << myList.Length() << endl;
}

运行结果:

注:在VC6.0中,模板类不支持分离编译,需要把模板类的定义与声明放同一个文件中才可以。


采用链表描述:


/* *******************************链表描述**************************************/

template<class T> class Chain; //加上Chain模板声明,不加出错
template <class T>
class ChainNode{
friend class Chain<T>;//保证了Chain<T>可以访问ChainNode<T>的所有成员,尤其是私有成员。
private:
T data;
ChainNode<T> *link;
};

/*
创建空的整型线性表Chain<int> L;

*/
template<class T>
class Chain {
  public:  
Chain() {first = 0;}
~Chain() ;
bool IsEmpty() const {return first == 0;}
int Length() const;
bool Find(int k, T& x) const;
int Search(const T& x) const;
Chain<T>& Delete(int k, T& x);
Chain<T>& Insert(int k, const T& x);
void Output(ostream& out) const;
void Erase();
Chain<T> & Append(const T& x);
private:
ChainNode<T> *first; // 指向第一个节点的指针
ChainNode<T> *last;
};


template<class T>
Chain<T>::~Chain()  //删除链表中的所有节点
{
	// 链表的析构函数,用于删除链表中的所有节点
ChainNode<T> *next; // 下一个节点
while (first) 
{
next = first->link;
 delete first;
 first = next;
}
}
template<class T>
int Chain<T>::Length() const    //返回链表中的元素总数 
{

ChainNode<T> *current = first;
int len = 0;
while (current) {
len++;
current = current->link;
}
return len;
}


template<class T>
bool Chain<T>::Find(int k, T& x) const
{// 寻找链表中的第k个元素,并将其传送至x
//如果不存在第k个元素,则返回f a l s e,否则返回t r u e
if (k < 1) return false;
ChainNode<T> *current = first;
int index = 1; // current的索引
while (index<k && current)
 {
current = current->link;
index++;
}
if (current) {x=current->data; return true;}
return false; //不存在第k个元素
}



template<class T>
int Chain<T>::Search(const T& x) const
{// 寻找x,如果发现x,则返回x的地址
//如果x不在链表中,则返回0
ChainNode<T> *current = first;
int index = 1; // current的索引
while (current && current->data!= x) {
current=current->link;
index++ ;
}
if (current) return index;
return 0;
}


template<class T>
void Chain<T>::Output(ostream& out) const
{// 将链表元素送至输出流
ChainNode<T> *current;
for (current=first; current; current = current->link)
out<<current->data<<" ";
}
//重载<<
template <class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{
	x.Output(out); 
	return out;
}

/*从链表中删除一个元素*/
template<class T>
Chain<T>& Chain<T>::Delete(int k, T& x) 
{// 把第k个元素取至x,然后从链表中删除第k个元素
//如果不存在第k个元素,则引发异常OutOfBounds
if (k < 1 || !first)
cout<<"不存在第K个元素"<<endl;  // 不存在第k个元素
// p最终将指向第k个节点
ChainNode<T> *p = first;
// 将p移动至第k个元素,并从链表中删除该元素
if (k == 1) // p已经指向第k个元素
first = first->link; // 删除之
else ( // 用q指向第k - 1个元素
ChainNode<T> *q = first;
for (int index = 1; index<k-1&&q; index++)
q = q->link;
if (!q || !q->link)
 cout<<"不存在第K个元素!"<<endl; //不存在第k个元素
p = q->link; // 存在第k个元素
if (p == last)
 last =q ;
q->link = p->link;) // 从链表中删除该元素
//保存第k个元素并释放节点p
x = p->data;
delete p;
return *this;
}

/*在链表中插入元素*/
template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{//在第k个元素之后插入x

if (k < 0)  cout<<"超出范围";
// p最终将指向第k个节点
ChainNode<T> *p = first;
//将p移动至第k个元素
for (int index = 1; index < k && p; index++)
p = p->link;
if (k > 0 && !p) tcout<<"不存在第K个元素"; //不存在第k个元素
// 插入
ChainNode<T> *y=new ChainNode<T>;
y->data = x;
if (k) {// 在p之后插入
y->link = p->link;
p->link = y;}
else {// 作为第一个元素插入
y->link = first;
first = y;}
if (!y->link)
last = y;
return *this;
}

template<class T>
void Chain<T>::Erase()
{ //删除链表中的所有节点
ChainNode<T> *next;
while (first) 
{
next = first->link;
delete first;
first = next;
}
}
template <class T>
Chain<T> & Chain<T>::Append(const T& x)
{ //在链表尾部添加x
ChainNode<T> *y;
y = new ChainNode<T>;
y->data = x; y->link = 0;
if (first)
 {//链表非空
last->link = y;
last= y;
}
else // 链表为空
first = last = y;
return *this;
}


 在主函数中调用如下:

#include "LinearList.h"
void main(void)
{
    cout<<"采用链表描述:"<<endl;
	Chain<int> myChain;
	myChain.Append(3).Append(10);
	cout<<"链表元素为:"<<myChain<<endl;
}


使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值