Seqlist 3.5 第二周
/*
线性表:由n(n>=0)个类型相同的数据元素的
有限序列
n–表长,n=0时,空表
存储:顺序方式-顺序表
链接方式–链表
顺序表的类的定义
*/
#include<iostream>
using namespace std;
//const int Max=5;
#define Max 5
template<typename T>
class seqList{//seqList类名
private://可省略
T data[Max];//存放数据元素
int len;//表示表中实际元素的个数,表长
public:
seqList(){//无参构造函数,创建空的顺序表
//函数的原型声明
len=0;
}
seqList(T a[],int n);//有参构造函数
//创建一个顺序表,把a数组中的n个元素,依次
//存放到顺序表中,表长为n
int Length(){//求表长
return len;
}
bool Empty(){//判表空
if(len==0) return true;
else return false;
}
T Get(int i);//按位取值
int Locate(T x);//按值查找
void Insert(int i,T x);//插入,在第i位置上
//插入元素x
T Delete(int i);//删除
};
//可以在类的外部定义类的成员函数
template<typename T>
seqList<T>::seqList(T a[],int n){
//if(n>5) throw”参数不当\n”;
len=n;
for(int i=0;i<n;){
data[i]=a[i];
i++;
}//块语句,复合语句
}
template<typename T>
T seqList<T>::Get(int i){
if(i<1||i>len)throw”位置不当\n”;
return data[i-1];
}
template<typename T>
int seqList<T>::Locate(T x){
for(int i=0;i<len;i++)
if(data[i]==x) return i+1;
return 0;
}
template<typename T>
void seqList<T>::Insert(int i,T x){
if(len>=Max)throw”表满\n”;
if(i<1||i>len+1) throw”位置不当\n”;
//移位
for(int j=len-1;j>=i-1;j–)
data[j+1]=data[j];
data[i-1]=x;
len++;
}
template<typename T>
T seqList<T>::Delete(int i){
if(!len)throw”表空\n”;
if(i<1||i>len)throw”位置不当\n”;
int x=data[i-1];
for(int j=i;j<=len-1;j++)
data[j-1]=data[j];
len–;
return x;
}
int main(void){
int a[3]={10,20,6};//定义数组a,并且对数组进行初始化
seqList<int> list2(a,3);
seqList<char> list1;
//cout<<“list1表的长度”<<list1.len<<endl;
cout<<“list1表的长度”<<list1.Length()<<endl;
cout<<“list2表的长度”<<list2.Length()<<endl;
cout<<“拟在list1表的第2个位置插入120\n”;
try{ list1.Insert(2,120);}
catch(char *wr){ cout<<wr;}
try{ list2.Insert(2,120);}
catch(char *wr){ cout<<wr;}
cout<<“list1表的长度”<<list1.Length()<<endl;
cout<<“list2表的长度”<<list2.Length()<<endl;
cout<<“list2的第2个元素值为:”;
try{cout<<list2.Get(2)<<endl;}
catch(char *wr){ cout<<wr;}
cout<<“list1的第2个元素值为:”;
try{cout<<list1.Get(2)<<endl;}
catch(char *wr){ cout<<wr;}
cout<<“在list1表中查找120:”;
cout<<list1.Locate(120)<<endl;
cout<<“在list2表中查找6:”;
cout<<list2.Locate(6)<<endl;
cout<<“拟删除list1中的第1个元素:”;
try{cout<<list1.Delete(1)<<endl;}
catch(char *wr){ cout<<wr;}
cout<<“拟删除list2中的第1个元素:”;
try{cout<<list2.Delete(1)<<endl;}
catch(char *wr){ cout<<wr;}
cout<<“list2表的长度”<<list2.Length()<<endl;
cout<<“拟在list1表的第1个位置插入’H’\n”;
try{ list1.Insert(1,’H’);}
catch(char *wr){ cout<<wr;}
cout<<“拟在list1表的第2个位置插入’e’\n”;
try{ list1.Insert(2,’e’);}
catch(char *wr){ cout<<wr;}
cout<<“list1表的长度”<<list1.Length()<<endl;
cout<<“list1表的第1和第2个元素值依次为:”;
try{ cout<<list1.Get(1)<<list1.Get(2)<<endl;}
catch(char *wr){ cout<<wr;}
cout<<“list1表的第3个元素值为:”;
try{ cout<<list1.Get(3)<<endl;}
catch(char *wr){ cout<<wr;}
//seqList<double> list3;
//cout<<“list3表的长度”<<list2.Length()<<endl;
//cout<<“list3表的第3个元素值为:”;
//try{ list2.Get(3)<<endl;}
//catch(char *wr){ cout<<wr;}
/*cout<<“拟在list3表的第3个位置插入’f’\n”;
try{ list3.Insert(3,’f’);}
catch(char *wr){ cout<<wr;}
cout<<“拟删除list3中的第2个元素:”;
try{cout<<list3.Delete(2)<<endl;}
catch(char *wr){ cout<<wr;}
cout<<“在list3表中查找6.0:”;
cout<<list3.Locate(6.0)<<endl;*/
//定义list3顺序表对象,数据类型为double,调用无参构造函数
/*
这部分代码,请同学自己完善,主要对list3对象,
测试相关的成员函数
*/
/*相关的c++知识点
1.类的定义通用格式:
模板类
templaye<typename T>
class 类名{
private:
类型 成员变量名1;
类型 成员变量名2;
…;
public:
构造函数(){….;}
返回值类型 函数名1(形参列表){…;}
返回值类型 函数名2(形参列表){…;}
….
};
在类的外部定义模板类的成员函数:
template<tyoename T>
返回值类型 类名<T>::函数名(形参列表){
函数体的功能语句;
}
2.for循环语句
书写格式
for(exp1;表达式2;exp3){
循环体语句组;
}
执行过程:
1)先求解表达式1
2)求解表达式2
3)若表达式2值为非0,执行4);否则执行6)
4)执行循环体
5)求解表达式3,回到2)
6)结束循环,执行循环体后面的语句
3.if语句
书写格式
单分支:
if(表达式) 语句1;
语句2;
执行过程:求解表达式,若值非0,执行语句1,再执行语句2
若为0,则跳过语句1,直接执行语句2
双分支:
书写格式:
if(表达式)
语句1;
else
语句2;
语句3;
执行过程:
先求解表达式,若值为非0,执行语句1 ,跳过语句2,执行语句3
否则,执行语句2,再执行语句3
4.抛出异常
if(条件表达式) throw”异常发生提示的字符串\n”;
5.在主函数测试中,把有可能发生异常的函数调用,用try{}括起来
在后面用catch(char *wr){cout<<wr;}来捕获异常,并且输出异常的提示信息。
6.主函数中测试,对象定义(创建)时,会自动调用相应的构造函数
7.构造函数的功能,通常是对对象的数据成员进行初始化
8.模板类的对象创建(定义)时,要在类名后面加上<实际类型>