zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    node.js 安装后怎么打开 node.js 命令框
    thinkPHP5 where多条件查询
    网站title中的图标
    第一次写博客
    Solution to copy paste not working in Remote Desktop
    The operation could not be completed. (Microsoft.Dynamics.BusinessConnectorNet)
    The package failed to load due to error 0xC0011008
    VS2013常用快捷键
    微软Dynamics AX的三层架构
    怎样在TFS(Team Foundation Server)中链接团队项目
  • 原文地址:https://www.cnblogs.com/cc123nice/p/10597766.html
Copyright © 2011-2022 走看看