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

作者: 佛系生活体验家 | 来源:发表于2019-03-14 20:05 被阅读11次

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

    相关文章

      网友评论

        本文标题:数据结构(C++)第二周笔记

        本文链接:https://www.haomeiwen.com/subject/kpfhmqtx.html