• c++实验3 链式存储线性表


    1、线性表链式存储结构及基本操作算法实现

    (1)单链表存储结构类的定义:

    #include <iostream>
    using namespace std;
    template <class T>
    class LinList
    {    private:
            ListNode <T> *head;                //头指针
            int size;                          //当前的数据元素个数
            ListNode <T> *Index(int i);        //定位
        public:
            LinList(void);                     //构造函数
            LinList(T a[],int i)
            ~LinList(void);                    //析构函数
            int Size(void) const;              //取当前数据元素
            void Insert(const T& e,int i);      //插入
            T Delete(int i,T& e);               //删除
            T GetData(int i);                  //取数据元素
            void GetAll();                      //取得所有数据
            int countnum();                     //元素个数
            bool isnull();                      //判断列表是否为空
            void deleteall();                   //删除所有节点
    };

    2)初始化带头结点空单链表构造函数实现

    template <class T>
    LinList <T>::LinList()                     //构造函数
    {
        head=new ListNode <T>();               //头指针指向头结点
        size=0;                                //size的初值为0
    }

    (3)利用数组初始化带头结点的单链表构造函数实现

    template <class T>
    LinList <T>::LinList(T a[],int i)
    {
        head=new ListNode<T>();
        size=0;
        if(int j=0;j<i;j++)
        {
            ListNode<T>*p;
            p=new ListNode<T>(a[i],head->next);
            head->next=p;
            size++;
        }
    }

    (4)在带头结点单链表的第i个位置前插入元素e算法

    template <class T>
    void LinList<T>::Insert(const T& e,int i);  //插入
    {    
         if(i<0||i>size-1)
        {
            cout<<"参数i越界出错!"<<endl;
            exit(0);
        }
        ListNode <T> *p=Index(i-1);       //p为指向第i-1个结点的指针
        //构造新结点q的data域值为item,next域值为p->next
        ListNode <T> *q=new ListNode <T> (e,p->next);
        p->next=q;                        //新结点插入第i个结点前
        size++;                          //元素个数加1
    
    }

    (5)在带头结点单链表中删除第i个元素算法

    template <class T>
    T LinList<T>::Delete(int I,T& e);                   //删除
    {
        if(size==0)
        {
            cout<<"链表已空无可删"<<endl;
    
        }
         if(i<0||i>size-1)
        {
            cout<<"参数i越界出错!"<<endl;
            exit(0);
        }
        ListNode <T> *s,*p=Index(i-1);       //p为指向第i-1个结点指针
        s=p->next;                            //s指向第i个结点
        p->next=p->next->next;                //第i个结点脱链
    T x=s->data;
    e=x;
        delete s;                             //释放第i个结点空间
        size--;                               //结点个数减1
        return e;                             //返回第i个结点的data域值
    }

    (6)遍历单链表元素算法

    template <class T>
    void LinList<T>::GetAll()
    {
        for(int i=0;i<=size-1;i++)
        {
            cout<<GetData(i)<<" ";
        }      
        cout<<endl;
    }

    (7)求单链表表长算法。

    template <class T>
    int LinList<T>::Size(void) const
    {
        return size;
    }

    (8)判单链表表空算法

    template <class T>
    bool LinList<T>::isnull()
    {
        if(size==0)
        {
            cout<<"为空"<<endl;
            return 1;
        }  
        else
        {
            cout<<"非空"<<endl;
             return 0;
        }    
    }

    (9)获得单链表中第i个结点的值算法

    template <class T>
    T LinList<T>::GetData(int i)
    {
         if(i<0||i>size-1)
        {
            cout<<"参数i越界出错!"<<endl;
            exit(0);
        }
        ListNode<T>*p=Index(i)
        return p->data;
    }

    主函数调用

    #include <iostream>
    #include"LinList.h"
    using namespace std;
    int main()
    {
        LinList<int>li1335;
        int s[]={1,2,3,4,5,6,7,8,9,10};
        int e;
        for(int i=0;i<10;i++)
            li1335.Insert(s[i],i);
        li1335.Delete(5,e);
        li1335.GetAll();
        li1335.isnull();
        li1335.deleteall();
        li1335.isnull();
        return 0;
    }

     

    ===========================================================

    2、参考单链表操作定义与实现,自行完成单循环链表的类的定义与相操作操作算法。

    (1)利用数组初始化带头结点的单循环链表构造函数实现

    template <class T>
    CircleList::CircleList(T a[],int n)     //创建方式大同小异,唯一的区别就是创建的最后将尾结点指向头结点 
    {
        if(n<0)
            cout << "你输入的长度不正确 " << endl;
        else
        {
            length = n;
            ListNode<T>*p,*q;   //定义头尾节点
            p = head;
           for(int i=0;i<n;i++)
            {
                q = new ListNode<T>();
                q->data=a[i];
                q->next = head;
                p->next = q;
                p = q;
            }
        }
    }

    (2)在带头结点单循环链表的第i个位置前插入元素e算法

    template <class T>
    void CircleList::insertNode(int n,T data)    
    {
        Node *q,*p = new Node();
        p->data = data;
        q = head;
        for(int i = 1;i<n;i++)
            q = q->next;
        p->next = q->next;
        q->next = p;
        length++;
    }

    (3)在带头结点单循环链表中删除第i个元素算法

    template <class T>
    void CircleList<T>::deleteNode(int i)      //删除i位置的结点
    {
        if(i<0||i>length)
        {
            cout<<"参数i越界错误
    ";
            exit(0);
        }
        else
        {
            ListNode<T> *p,*q;
            p = head;
            for(int j=1;j<i;j++)
                p=p->next;
            q = p->next;
            p->next = q->next;
            delete q;
            q = NULL;
            length--;
        }
    }

    3、采用链式存储方式,并利用单链表类及类中所定义的算法加以实现线性表La,Lb为非递减的有序线性表,将其归并为新线性表Lc,该线性表仍有序(未考虑相同时删除一重复值)的算法。

    template<class T>
    void sort1(int c,int d,T a[],T b[],LinList<T>li)
    {
        int amin=0,bmin=0;
        for(int i=0;i<c+d;i++)
        {
            if(amin==c)
            {
                for(int j=bmin;j<d;j++,i++)
                    li.Insert(b[j],i);
                break;
            }
             if(bmin==d)
            {
                for(int j=amin;j<c;j++,i++)
                    li.Insert(a[j],i);
                break;
            }
            if(a[amin]>b[bmin])
            {
                li.Insert(b[bmin],i);
                bmin++;
            }
            else if(a[amin]<b[bmin])
            {
                li.Insert(a[amin],i);
                amin++;
            }
            else
            {
                li.Insert(a[amin],i);
                amin++;
                bmin++;
            }
    
        }
        li.GetAll();
    }
  • 相关阅读:
    JDBC学习笔记
    hdfs文件格式
    全国疫情防控监控平台开发
    MySQL学习笔记
    拖拽表单生成
    Cython加密(含Windows和Linux)
    pcl 文字点云
    新装Ubuntu系统--常用软件安装配置
    GIT
    Data Analysis With Python
  • 原文地址:https://www.cnblogs.com/cc123nice/p/10597766.html
Copyright © 2020-2023  润新知