c++实现单链表(类模板实现,详细注释)

我是计算机专业的一位本科生,现在是大一,希望我的代码对你有所帮助,欢迎斧正

单链表的结点
以下图片均取自《数据结构c++》第二版
在这里插入图片描述结点图
尾插法
即为将每次新申请的结点插到终端结点的后面
在这里插入图片描述
头插法
即为将每个新申请的结点都插入到头结点的后面
在这里插入图片描述
结点插入时的情况
在这里插入图片描述

运行结果:
在这里插入图片描述
在这里插入图片描述
代码实现:

#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 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);//采用尾插方式进行创建单链表
    }
}
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<<"已成功插入结点n(*≧▽≦*)n"<<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;
}
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;
    }
}
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;
}
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<<"------------------Insert--------------------"<<endl;
    list.Insert(3,2);
    list.PrintList();
    cout<<"------------------Delete--------------------"<<endl;
    list.Delete(2);
    list.PrintList();
    cout<<"--------------------Get---------------------"<<endl;
    list.Get(1);
    cout<<"--------------------Exchange----------------"<<endl;
    list.Exchangedata(1,2);
    list.PrintList();
    cout<<"-------------------------------------------------已退出单链表操作系统-----------------------------------------------"<<endl;
    return 0;
}

发布了11 篇原创文章 · 获赞 3 · 访问量 1300

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/104393839
今日推荐