数据结构(C++)第二周笔记

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.模板类的对象创建(定义)时,要在类名后面加上<实际类型>

    原文作者:克里Chris
    原文地址: https://www.jianshu.com/p/201ad3de7a71
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞