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越界错误\n";
        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();
}

 

posted @ 2019-03-26 00:09  cc123nice  阅读(779)  评论(0编辑  收藏  举报