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

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

    3.11 第三周

    /*  预备知识:

      1.指针:地址

      2.指针变量:存放地址的变量

      3.指针变量的定义:基类型  *指针变量名;

      4.指针变量初始化:

        1)在定义的同时赋初值

        2)先定义,然后通过赋值语句赋值

      5.指针的指向运算*

      比如:int a=10,*p=&a;

      cout<<p<<"\t"<<*p<<endl;

      6.指针与一组数组

        一组数组名称,代表其首元素的地址

    如:int a[4];  则a<=> &a[0]

      7.

    指针变量的加、减、自增、自减运算:通常是将指针变量和数组

    关联起来。

        将一个指针变量+常量,表示将数组的后面常量个元素

    比如:int a[4],*p=a;表示p指向a[0]

          p=p+2表示将p指向a[2]

      p++、p--分别表示什么?

      &a[3]-&a[1]?

      8.结构体

        1)结构体类型定义格式:

    struct  结构体类型名称{

        成员列表;

    };

    2)结构体变量定义:

        结构体类型  结构体变量名列表;

    3)结构体变量初始化

    成员运算符    结构体变量名.结构体成员

    4)给结构体变量输入值

      9.new运算符

        指针变量=new 类型;

    //动态开辟类型所需要的字节长度的存储空间

    //并且将该空间的首地址赋值给左边的指针变量

    int *p;

    p=new int;

    10.delete语句

    格式:  delete 指针变量;

          或  delete []指针变量;

        11.构造函数

        1)和类名同名,没有返回值,函数名左边不能加void

        2)构造函数可以重载,可以由形参。

        3)对象创建时由c++系统自动调用,其功能通常是给对象的数据成员进行初始化。

        4)类定义,如果程序员没有定义构造函数,c++在编译时,自动产生一个空语句的构造函数。

        12.析构函数

        1)和类名同名,前面有~号,没有返回值,函数名左边不能加void

        2)不能有参数,不能重载

        3)对象消失是,c++自动执行,功能是通常用于做善后工作,比如,释放new动态开辟的空间

        4)类定义,如果程序员没有定义析构函数,c++在编译时,自动产生一个空语句的析构函数

    #include<iostream.h>

    void main(){

    int *p2;

    p2=new int[4];

    *p2=10;

    *(p2+1)=20;

    *(p2+2)=30;

    *(p2+3)=40;

    cout<<p2[0]<<"  "<<p2[1]<<"  "<<*(p2+2)<<"  "

    <<*(p2+3)<<endl;

        delete []p2;

    int *p;

    p=new int;

    *p=15;

    cout<<p<<"  "<<*p<<endl;

    delete p;

    }

    */

    /*单链表

    1.定义存放数据元素和逻辑关系的结构体类型

    2.定义单链表(带头结点的单链表)类

    */

    #include<iostream>

    using namespace std;

    template<typename T>

    struct Node{

    T data;

    Node<T> *next;

    };

    template<typename T>

    class linkListHead{

    Node<T> *first;

    public:

    linkListHead(){//无参构造函数,创建空的单链表

    first=new Node<T>;

    (*first).next=NULL;//(*first).next<=>first->next

    }

    linkListHead(T a[],int n);//有参构造函数,创建单链表,

    //用尾插法a数组的n个元素存储在链表的各结点的data成员中

    void Insert(int i,T x);//插入函数

    T Delete(int i);//删除函数

    int Length();//求表长函数

    T Get(int i);//按位取值函数

    int Locate(T x);//按值查找函数

    bool Empty(){//判空函数

    if(!(first->next)) return true;

    else return false;

    }

    ~linkListHead();//析构函数

    };

    template<typename T>

    linkListHead<T>::linkListHead(T a[],int n){

    Node<T> *rear,*s;//定义指针变量

    //创建头结点,将其地址赋值给first和rear

    rear=first=new Node<T>;

    for(int i=0;i<n;i++){

    s=new Node<T>;  //产生结点,赋值给s变量

    s->data=a[i];//将a[i]赋值给s->data

    rear->next=s;//将rear->next指向s

    rear=s;//将s作为新的尾结点

    }

    rear->next=NULL;//将尾结点的next成员置空

    }

    template<typename T>

    void linkListHead<T>::Insert(int i,T x){

    if(i<1) throw"位置不当\n";

    //找第i-1个结点

    Node<T> *s,*p=first;

    int count=0;

    while(p!=NULL&&count<i-1){

    p=p->next;//p后移

    count++;//计数器变量加1

    }

    if(p==NULL) throw"位置不当\n";

    s=new Node<T>;

    s->data=x;

    s->next=p->next;

    p->next=s;

    }

    template<typename T>

    T linkListHead<T>::delete(int i){//删除函数

    if (i<1)throw"位置不当\n";

    int coumt=0;

    Node<T> *p=first;

    while(p!=NULL&&count<i-1){

      count++;

        p=p->next;

    }

    if(p==NULL||p!=NULL&&p->next==NULL)throw"位置不当\n";

    q=p->next;

    T x=q->data;

    p->next=q->next;

    delete q;

    return x;

    }

    template<typename T>

    int linkListHead<T>::Length(){//求表长b

    int count=0;

    Node<T> *p=first->next;

    while(p!=NULL){

        count++;

        p=p->next;

    }

    return count;

    }

    template<typename T>

    T linkListHead<T>::Get(int i){

        if(i<1)throw"位置不当\n";

        int count=1;

        Node<T> *p=first->next;

        while(p!=NULL&&count<i){

            count++;

            p=p->next;

        }

        if(p==NULL)throw"位置不当\n";

        return p->data;

    }

    template<typename T>

    int linkListHead<T>::Locate(T x){

        int count=1;

        Node<T> *p=first->next;

        while(p!=NULL&&p->data!=p->next)}

            count++;

            p=p->next;

        }

        if(p!=NULL) return count;

        else return 0;

    }

    template<typename T>

    linkListHead<T>::~linkListHead(){//析构函数

            //对象消失是,c++自动执行

            //通常用于做善后工作,比如释放now动态开辟的空间

        Node<T> *p=first;

        while(p!=NULL){

                first=first->next;

            delete P;

            p=first;

        }

    }

    int main(void){

        int a[4]={20,50,10,60};

        linkListHead<int> list(a,4);

        linkListHead<char> list2;

        cout<<list2.Empty()<<endl;

        cout<<list1.Empty()<<endl;

        cout<<list1.Length()<<endl;

        try{cout<<list.Get(5)<<endl;}

        catch (char *wr){cout<<wr;}

        cout<<list1.Locate(80)<<endl;

        try{ list1.Insert(3,70);list1.Insert(8,100);}

        catch(char *wr){cout<<wr;}

        try{cout<<list1.Delete(2)<<endl;

        catch(char *wr}{cout<<wr;}

        cout<<list1.Length()<<endl;

        try{cout<<list1.Get(2)<<endl;

        catch(char *wr){cout<<wr;}

    相关文章

      网友评论

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

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