北京理工大学CPP上机0328

Readme

20220328上机内容
设计一个链表,要求:
1.能够适用于各种数据类型
2.具有增,删,改,查的功能
3.重载+,-,[]等运算符
4.尽可能使用虚函数实现运行时的多态

#include<iostream>
using namespace std;
template<class T>//结点(类模板)
class Node
{
public:
    T data;//数据域
    Node<T> *next;//指针域
};
template<class T>
class LinkList
{
private:
    Node<T> *head;//头结点
public:
    LinkList();//构造函数
    void CreateList();//创建单链表
    ~LinkList();//析构函数
    int Length();//求单链表的长度

    //查
    bool Get(int index);//得到序号为index的结点元素值
    bool Locate(T data);//得到第一个元素值为data的结点的序号
    //增
    bool Insert(int index,T data);//在序号index位置插入元素值为data的结点
    //删
    bool Delete(int index);//删除序号为index的结点
    
    //改
    bool Change(int index, T data);//更改序号为index的结点为data

    bool PrintList();//输出单链表所有结点的元素值
    void Exchangedata(int index1,int index2);//进行两结点元素值的交换
};

//构造函数
template<class T>
LinkList<T>::LinkList()//初始化为空链表
{
    head=new Node<T>;
    head->data=0;
    head->next=NULL;
}

//创建空链表
template<class T>
void LinkList<T>::CreateList()
{
    int length;
    T data;
    cout<<"正在创建单链表,请输入你要创建的单链表的长度"<<endl;
    cin>>length;
    for(int i=0;i<length;i++)
    {
        cout<<"请输入第"<<i+1<<"个结点的元素值:";
        cin>>data;
        Insert(Length()+1,data);//采用尾插方式进行创建单链表
    }
}

//往index位插入data
template<class T>
bool LinkList<T>::Insert(int index,T data)
{
    Node<T> *p=head,*s;
    if(index<=0)
    {
        cout<<"插入位置不合法,请输入为正数的插入位置"<<endl;
        return false;
    }
        if(index>Length())//所插位置超出单链表长度时
        {
            while(p->next!=NULL)
            {
                p=p->next;
            }
            //此时指针p指向终端结点
            s=new Node<T>;
            p->next=s;//s成为p的后继结点
            s->data=data;//给予数据
            s->next=NULL;//s成为终端结点
            //进行单链表的插入;
        }
            else//所插位置位于链表长度内时
            {

                for(int i=0;i<index-1;i++)
            {
                p=p->next;
            }
            //此时指针p指向第index-1个结点
            s=new Node<T>;
            s->next=p->next;//s成为第index的前驱结点
            p->next=s;//s成为p的后继结点
            s->data=data;//给予数据
            //进行单链表的插入
            cout<<"已成功插入结点"<<endl;
            return true;
            }
}

//返回链表长度
template<class T>
int LinkList<T>::Length()
{
    Node<T> *p=head;
    int num=0;
    while(p->next!=NULL)
    {
        num++;
        p=p->next;
    }
    return num;
}

//析构函数
template<class T>
LinkList<T>::~LinkList()//销毁线性表
{
    Node<T> *p=head,*s;
    while(p->next!=NULL)
    {
        s=p->next;
        p=p->next;
        delete s;
    }
    delete p;
    delete head;
    cout<<"单链表销毁成功"<<endl;
}


//查找序号为index的结点元素值
template<class T>
bool LinkList<T>::Get(int index)
{
    Node<T> *p=head;
    if(index<=0||index>Length())//超出查找范围
    {
        cout<<"结点元素查找不合法"<<endl;
        return false;
    }
    else
    {
        for(int i=0;i<index;i++)
    {
        p=p->next;
    }
    cout<<"查找成功,该结点的元素值为:"<<p->data<<endl;
    return true;
    }
}

//得到第一个元素值为data的结点的序号
template<class T>
bool LinkList<T>::Locate(T data)
{
    Node<T> *p=head;
    int num=0;
    while(p->next!=NULL)
    {
        num++;
        p=p->next;
        if(p->data==data)
        {
            cout<<"成功找到该结点,该结点点到的位置为:"<<num<<endl;
            return true;
        }
    }
    cout<<"该单链表中没有该结点"<<endl;
    return false;
}

//更改序号为index的结点为data
template<class T>
bool LinkList<T>::Change(int index, T data)
{
    Node<T> *p=head;
    if(index<=0||index>Length())//超出链表范围
    {
        cout<<"结点元素修改不合法"<<endl;
        return false;
    }
    else
    {
        for(int i=0;i<index;i++)
        {
            p=p->next;
        }
        p->data=data;
        cout<<"修改成功"<<endl;
        return true;
    }

}


//删除序号为index的结点
template<class T>
bool LinkList<T>::Delete(int index)
{
    Node<T> *p=head,*s;
    if(index<=0||index>Length())
    {
        cout<<"删除位置不合法"<<endl;
    return false;
    }
    else if(index==Length())
    {
        for(int i=0;i<Length()-1;i++)
    {
        p=p->next;
    }
    p->next=NULL;
    }
    else
    {
        for(int i=0;i<index-1;i++)
    {
        p=p->next;
    }
    s=new Node<T>;
    s=p->next;
    p->next=s->next;
    cout<<"成功删除结点"<<index<<endl;
    return true;
    }
}


//输出单链表所有结点的元素值
template<class T>
bool LinkList<T>::PrintList()
{
    int i=1;
    Node<T> *p=head;
    if(p->next==NULL)
    {
        cout<<"该链表为空链表!"<<endl;
        return false;
    }
    else
    {
    while(p->next!=NULL)
    {
        p=p->next;
        cout<<"第"<<i<<"个结点的元素值为:"<<p->data<<endl;
        i++;
    }
    cout<<"成功输出结点元素值!"<<endl;
    return true;
    }
}


//进行两结点元素值的交换
template<class T>
void LinkList<T>::Exchangedata(int index1,int index2)
{
    Node<T> *p=head,*s1,*s2;
    int Min,Max,data;
    //定位结点的前后
    Min=(index1>index2)?index2:index1;
    Max=(index1>index2)?index1:index2;
    if(Min>0&&Max<=Length())
    {
        for(int i=0;i<Min-1;i++)
    {
        p=p->next;
    }
    s1=p->next;
    p=head;
    for(int i=0;i<Max-1;i++)
    {
        p=p->next;
    }
    s2=p->next;
    data=s1->data;
    s1->data=s2->data;
    s2->data=data;
    cout<<"结点元素值交换成功"<<endl;
    }
    else
        cout<<"结点元素值交换失败"<<endl;
}
int main()
{
    cout<<"创建单链表中..."<<endl;
    LinkList<int> list;
    list.CreateList();
    cout<<"单链表已创建成功"<<endl;
    list.PrintList();
    cout<<"插入节点"<<endl;
    list.Insert(3,2);
    list.PrintList();
    cout<<"删除节点"<<endl;
    list.Delete(2);
    list.PrintList();
    cout<<"获取节点的值"<<endl;
    list.Get(1);
    cout<<"交换节点的值"<<endl;
    list.Exchangedata(1,2);
    list.PrintList();
    cout<<"更改节点的值"<<endl;
    list.Change(2,5);
    list.PrintList();


    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值