顺序表----数组结构c++
2015-01-30 10:04
288 查看
#include <iostream>
using namespace std;
#define MaxSize 100
template <class T>
class SqListClass
{
public:
SqListClass();
virtual ~SqListClass();
void CreateList(T a[],int n);//有a数组中的元素建立顺序表
void DispList();//输出顺序表L中的所有元素
int ListLength();//求顺序表的长度
bool GetElem(int i ,T& e);//求顺序表中某个序号的元素值
int LocateElem(T e);//按元素查找了其序号
bool ListInsert(int i, T e);//插入数据元素
bool ListDelete(int i);//删除数据元素
template <typename TT>
friend void Reverse(SqListClass<TT>& L);//所有的元素逆置
//对于含有n个元素的顺序表L,设计一个算法删除其中一个值为x的元素,分析算法的时间
// 复杂度O(n)和空间复杂度O(1)
template <typename TT>
friend bool Delaelem(SqListClass<TT>& L,TT x);
//假设两个递增有序顺序表L1和L2,分别含有n个和m个元素,设计一个算法将
// 他们的所有元素归并为一个递增有序顺序表L3,称为有序表的二路归并,分析
// 算法的时间复杂度O(m+n)和空间复杂度O(1)。
template <typename TT>
friend void Merge2(SqListClass<TT>& L1,SqListClass<TT>& L2,SqListClass<TT>& L3);
private:
T * data;
int length;
};
template <typename TT>
void Merge2(SqListClass<TT>& L1,SqListClass<TT>& L2,SqListClass<TT>& L3)
{
int i=0,j=0,k=0;
while(i<L1.length && j<L2.length)//两个表都没有遍历完
{
if(L1.data[i]<L2.data[j])
L3.data[k++] = L1.data[i++];
else
L3.data[k++] = L2.data[j++];
}
while(i<L1.length)//L1没有遍历完
{
L3.data[k++] = L1.data[i++];
}
while(j< L2.length) L3.data[k++]=L2.data[j++];//L2没有遍历完
L3.length=k;
}
template <typename TT>
bool Delaelem(SqListClass<TT> &L,TT x){
int i =0 ;
while(i<L.length&&L.data[i]!=x) i++;
if(i>= L.length) return false;
for(int j=i;j<L.length-1;j++)
{
L.data[j]=L.data[j+1];
}
L.length--;
return true;
}
template <class T>
SqListClass<T>::SqListClass()
{
data = new T[MaxSize];
length = 0;
}
template <class T>
SqListClass<T>::~SqListClass()
{
delete[] data;
length = 0;
}
//完成了初始化
template <class T>
void SqListClass<T>::CreateList(T a[],int n)
{
int i;
for( i =0;i<n ;i++)
{
data[i]=a[i];
}
length = i;
}
template <class T>
void SqListClass<T>::DispList()
{
int i;
if(length>0)
{
for(i=0;i<length;i++)
cout<<data[i]<<" ";
cout<<endl;
}
}
//取序号为i的元素
template <class T>
bool SqListClass<T>::GetElem(int i,T& e)
{
if(i<1 || i>length) return false;
e = data[i-1];
return true;
}
//删除逻辑序号为i的元素
template <class T>
bool SqListClass<T>::ListDelete(int i)
{
if(i<0||i>length) return false;
for(int j=i;j<length;j++)
data[j-1]=data[j];
length--;
return true;
}
template <class T>
bool SqListClass<T>::ListInsert(int i,T e)
{
if(i<0||i>length) return false;
for(int j=length;j>=i;j--)
data[j]=data[j-1];
data[i-1]=e;
length++;
return true;
}
template <class T>
int SqListClass<T>::ListLength()
{
return length;
}
template <class T>
int SqListClass<T>::LocateElem(T e)
{
int i =0;
for( i=0;i<length;i++)
{
if(e == data[i])
return i+1;
}
if(i>=length) return 0;
// while(i<length && e!=data[i] ) i++;
// if(i>=length) return 0;
// else return i+1;
}
template <class TT>
void Reverse(SqListClass<TT> &L)
{
TT temp;
int i;
for(i =0 ;i<L.length/2;i++)
{
temp = L.data[i];
L.data[i]=L.data[L.length-i-1];
L.data[L.length-i-1]= temp;
}
}
int main()
{
SqListClass<int> sql;
int a[MaxSize];
//初始化
for(int i=0;i<MaxSize;i++)
a[i]=i;
sql.CreateList(a,10);
sql.DispList();
SqListClass<int> sql_two;
sql_two.CreateList(a,20);
cout<<"sql_two display:"<<endl;
sql_two.DispList();
SqListClass<int> sql_three;
Merge2(sql,sql_two,sql_three);
sql_three.DispList();
int temp;
// sql.GetElem(3,temp);
// cout<<"sql.GetElem(3,temp):"<<temp<<endl;
// sql.ListDelete(3);
// cout<<" sql.ListDelete(3):"<<endl;
// sql.DispList();
//
// sql.ListInsert(5,temp);
// sql.DispList();
// cout<<"sql.LocateElem(5)"<<sql.LocateElem(5)<<endl;
// sql.DispList();
// Reverse(sql);//逆置
// temp = 5;
// Delaelem(sql,5);
// sql.DispList();
// cout << "Hello world!" << endl;
return 0;
}
using namespace std;
#define MaxSize 100
template <class T>
class SqListClass
{
public:
SqListClass();
virtual ~SqListClass();
void CreateList(T a[],int n);//有a数组中的元素建立顺序表
void DispList();//输出顺序表L中的所有元素
int ListLength();//求顺序表的长度
bool GetElem(int i ,T& e);//求顺序表中某个序号的元素值
int LocateElem(T e);//按元素查找了其序号
bool ListInsert(int i, T e);//插入数据元素
bool ListDelete(int i);//删除数据元素
template <typename TT>
friend void Reverse(SqListClass<TT>& L);//所有的元素逆置
//对于含有n个元素的顺序表L,设计一个算法删除其中一个值为x的元素,分析算法的时间
// 复杂度O(n)和空间复杂度O(1)
template <typename TT>
friend bool Delaelem(SqListClass<TT>& L,TT x);
//假设两个递增有序顺序表L1和L2,分别含有n个和m个元素,设计一个算法将
// 他们的所有元素归并为一个递增有序顺序表L3,称为有序表的二路归并,分析
// 算法的时间复杂度O(m+n)和空间复杂度O(1)。
template <typename TT>
friend void Merge2(SqListClass<TT>& L1,SqListClass<TT>& L2,SqListClass<TT>& L3);
private:
T * data;
int length;
};
template <typename TT>
void Merge2(SqListClass<TT>& L1,SqListClass<TT>& L2,SqListClass<TT>& L3)
{
int i=0,j=0,k=0;
while(i<L1.length && j<L2.length)//两个表都没有遍历完
{
if(L1.data[i]<L2.data[j])
L3.data[k++] = L1.data[i++];
else
L3.data[k++] = L2.data[j++];
}
while(i<L1.length)//L1没有遍历完
{
L3.data[k++] = L1.data[i++];
}
while(j< L2.length) L3.data[k++]=L2.data[j++];//L2没有遍历完
L3.length=k;
}
template <typename TT>
bool Delaelem(SqListClass<TT> &L,TT x){
int i =0 ;
while(i<L.length&&L.data[i]!=x) i++;
if(i>= L.length) return false;
for(int j=i;j<L.length-1;j++)
{
L.data[j]=L.data[j+1];
}
L.length--;
return true;
}
template <class T>
SqListClass<T>::SqListClass()
{
data = new T[MaxSize];
length = 0;
}
template <class T>
SqListClass<T>::~SqListClass()
{
delete[] data;
length = 0;
}
//完成了初始化
template <class T>
void SqListClass<T>::CreateList(T a[],int n)
{
int i;
for( i =0;i<n ;i++)
{
data[i]=a[i];
}
length = i;
}
template <class T>
void SqListClass<T>::DispList()
{
int i;
if(length>0)
{
for(i=0;i<length;i++)
cout<<data[i]<<" ";
cout<<endl;
}
}
//取序号为i的元素
template <class T>
bool SqListClass<T>::GetElem(int i,T& e)
{
if(i<1 || i>length) return false;
e = data[i-1];
return true;
}
//删除逻辑序号为i的元素
template <class T>
bool SqListClass<T>::ListDelete(int i)
{
if(i<0||i>length) return false;
for(int j=i;j<length;j++)
data[j-1]=data[j];
length--;
return true;
}
template <class T>
bool SqListClass<T>::ListInsert(int i,T e)
{
if(i<0||i>length) return false;
for(int j=length;j>=i;j--)
data[j]=data[j-1];
data[i-1]=e;
length++;
return true;
}
template <class T>
int SqListClass<T>::ListLength()
{
return length;
}
template <class T>
int SqListClass<T>::LocateElem(T e)
{
int i =0;
for( i=0;i<length;i++)
{
if(e == data[i])
return i+1;
}
if(i>=length) return 0;
// while(i<length && e!=data[i] ) i++;
// if(i>=length) return 0;
// else return i+1;
}
template <class TT>
void Reverse(SqListClass<TT> &L)
{
TT temp;
int i;
for(i =0 ;i<L.length/2;i++)
{
temp = L.data[i];
L.data[i]=L.data[L.length-i-1];
L.data[L.length-i-1]= temp;
}
}
int main()
{
SqListClass<int> sql;
int a[MaxSize];
//初始化
for(int i=0;i<MaxSize;i++)
a[i]=i;
sql.CreateList(a,10);
sql.DispList();
SqListClass<int> sql_two;
sql_two.CreateList(a,20);
cout<<"sql_two display:"<<endl;
sql_two.DispList();
SqListClass<int> sql_three;
Merge2(sql,sql_two,sql_three);
sql_three.DispList();
int temp;
// sql.GetElem(3,temp);
// cout<<"sql.GetElem(3,temp):"<<temp<<endl;
// sql.ListDelete(3);
// cout<<" sql.ListDelete(3):"<<endl;
// sql.DispList();
//
// sql.ListInsert(5,temp);
// sql.DispList();
// cout<<"sql.LocateElem(5)"<<sql.LocateElem(5)<<endl;
// sql.DispList();
// Reverse(sql);//逆置
// temp = 5;
// Delaelem(sql,5);
// sql.DispList();
// cout << "Hello world!" << endl;
return 0;
}
相关文章推荐
- 数据结构之顺序栈(数组)C++(模板)
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- 顺序栈结构(用数组完成)
- C语言 数组的顺序表示与实现 数据结构
- C++程序设计语言--第五章:指针、数组和结构
- 数组的顺序存储表示和实现-数据结构
- 算式计算器C++实现代码(顺序栈结构 增加了一些功能 求指教)
- 数据结构(严蔚敏)数组顺序表
- C数据结构之顺序栈(数组实现2)
- C++指针、数组和结构
- 算式计算器C++实现代码(顺序栈结构 增加了一些功能 比如三角函数 求指教)
- C++中取出的字节数组转为结构
- 打造 C++ 最灵活动态数组结构 (一)
- c++练习004之数据结构(顺序表操作)
- 数组的顺序结构表示和实现
- C++ 堆结构(数组实现)
- c++返回结构数组给c#
- 打造 C++ 最灵活动态数组结构 (三)
- 第03章 CORE C++_枚举_数组_结构_指针(I)
- //C++ 字符数组顺序排序