C++单链表基本操作

#include <iostream>
using namespace std;
template <typename T>
class LinkList;
template <typename T>
void Reverse(LinkList<T>& L);
template <typename T>
void Merge2(LinkList<T>& L1, LinkList<T>& L2, LinkList<T>& L3);
template <typename T>
struct LinkListNode                                //单链表结点类型
{
    T data;                                    //存放数据元素
    LinkListNode<T>* next;                        //指向下一个结点的域
};

template <typename T>
class LinkList                            //单链表类
{
    LinkListNode<T>* head;                        //单链表头结点
public:
    LinkList();                     //构造函数,创建一个空单链表
    ~LinkList();                     //析构函数,销毁单链表
    void CreateListF(T endTag);            //头插法建立单链表
    void CreateListR(T endTag);            //尾插法建立单链表
    void DispList();                        //输出单链表所有结点值
    int  ListLength();                        //求单链表数据结点个数
    bool GetElem(int i, T& e);                //求单链表中某个数据元素值
    int  LocateElem(T e);                    //按元素值查找
    bool ListInsert(int i, T e);            //插入数据元素
    bool ListDelete(int i);                    //删除数据元素
    void Sort();                            //将单链表递增排序
    LinkListNode<T>*Gethead()
    {
        return head;
    }
    //以下友元函数
    //friend int  Findlast(LinkList<T> &L, T x);
    friend void Reverse<>(LinkList<T>& L);
    friend void Merge2<>(LinkList<T>& L1, LinkList<T>& L2, LinkList<T>& L3);
};

template <typename T>
LinkList<T>::LinkList()         //构造函数,创建一个空单链表
{
    head = new LinkListNode<T>();
    head->next = NULL;
}
template <typename T>
LinkList<T>::~LinkList()         //析构函数,销毁单链表
{
    LinkListNode<T>* pre, * p;
    pre = head; p = pre->next;
    while (p != NULL)
    {
        delete pre;
        pre = p; p = p->next;
    }
    delete pre;
}
template <typename T>
void LinkList<T>::CreateListF(T endTag)  //头插法创建单链表
{
    LinkListNode<T>* p;
    T x;
        cin >> x;
        while(x != endTag)
        {
            p = new LinkListNode<T>();
            p->data = x;
            p->next = head->next;
            head->next = p;
            cin >> x;
        }

}
template <typename T>
void LinkList<T>::CreateListR(T endTag)        //尾插法建立单链表
{
    LinkListNode<T>* s, * r;
    T x;
    r = head;                                //r始终指向尾结点,开始时指向头结点
    cin >> x;
    while (x != endTag)                    //循环建立数据结点
    {
        s = new LinkListNode<T>();
        s->data = x;                    //创建数据结点*s
        r->next = s;                        //将*s结点插入*r结点之后
        r = s;
        cin >> x;
    }
    r->next = NULL;                        //将尾结点的next域置为NULL
}
template <typename T>
void LinkList<T>::DispList()        //输出单链表所有结点值
{
    LinkListNode<T>* p;
    p = head->next;                        //p指向开始结点
    while (p != NULL)                        //p不为NULL,输出*p结点的data域
    {
        cout << p->data << " ";
        p = p->next;                        //p移向下一个结点
    }
    cout << endl;
}
template <typename T>
int LinkList<T>::ListLength()        //求单链表数据结点个数
{
    int i = 0; LinkListNode<T>* p;
    p = head;                             //p指向头结点,n置为0(即头结点的序号为0)
    while (p->next != NULL)
    {
        i++;
        p = p->next;
    }
    return (i);                            //循环结束,p指向尾结点,其序号i为结点个数
}
template <typename T>
bool LinkList<T>::GetElem(int i, T& e)        //求单链表中某个数据元素值
{
    int j = 0; LinkListNode<T>* p;
    p = head;                                //p指向头结点,j置为0(即头结点的序号为0)
    while (j < i && p != NULL)                //找第i个结点*p
    {
        j++;
        p = p->next;
    }
    if (p == NULL)                        //不存在第i个数据结点,返回false
        return false;
    else                                //存在第i个数据结点,返回true
    {
        e = p->data;
        return true;
    }
}
template <typename T>
int LinkList<T>::LocateElem(T e)    //按元素值查找
{
    int i = 1; LinkListNode<T>* p;
    p = head->next;                        //p指向开始结点,i置为1(即开始结点的序号为1)
    while (p != NULL && p->data != e)        //查找data值为e的结点*p,其序号为i
    {
        p = p->next;
        i++;
    }
    if (p == NULL)                        //不存在元素值为e的结点,返回0
        return(0);
    else                                //存在元素值为e的结点,返回其逻辑序号i
        return(i);
}
template <typename T>
bool LinkList<T>::ListInsert(int i, T e)   //插入数据元素
{
    int j = 0;
    LinkListNode<T>* s, * p;
    if(i<1)
    {
        return false;
    }
    p = head;
    while (j < i - 1&&p!=NULL)
    {
        j++;
        p = p->next;
    }
    if(p==NULL)
    {
        return false;
    }
    else
    {
        s = new LinkListNode<T>;
        s->data = e;
        s->next = p->next;
        p->next = s;
        return true;
    }
}

template <typename T>
bool LinkList<T>::ListDelete(int i)
{
    int j = 0;
    LinkListNode<T>* q, * p;
    if(i<1)
    {
        return false;
    }
    p = head;
    while (j < i - 1 && p != NULL)
    {
        j++;
        p = p->next;
    }
    if(p==NULL)
    {
        return false;
    }
    else
    {
        q = p->next;
        if(q==NULL)
        {
            return false;
        }
        else
        {
            p->next = q->next;
            delete q;
            return true;
        }
    }
}
template <typename T>
void Reverse(LinkList<T>& L)        //逆置
{
    LinkListNode<T>* p = L.Gethead()->next;
    LinkListNode<T>* head = L.Gethead(), * q;
    head->next = NULL;
    while (p != NULL)
    {
        q = p->next;
        p->next = head->next;
        head->next = p;
        p = q;
    }
}
int main()
{
    LinkList<int>L;
    L.CreateListR(-1);
    Reverse(L);
    L.DispList();
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ww8821

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值