2020-05-26

2020-05-26  本文已影响0人  老吾老

单向链表

链表介绍

代码

template<typename T>class MyList;
template<typename T>class Node
{
    friend class MyList<T>;
private:
    T data;
    Node* Link;
    Node<T>(T k):data(k),Link(nullptr) {};//私有构造函数 初始化data 与 Link 
};
template<typename T>class MyList
{
public:
    MyList() { _First = nullptr; };
    void Insert(T);//插入 从链表头插入
    void LookAll();
    void Remove(T);//删除
    void Inverse();//翻转
private:
    Node<T> *_First;
};
#pragma once
#ifndef _MYLIST_H_
#define _MYLIST_H_
#include<iostream>

template<typename T>class MyList;
template<typename T>class Node
{
    friend class MyList<T>;
private:
    T data;
    Node* Link;
    Node<T>(T k):data(k),Link(nullptr) {};//私有构造函数 初始化data 与 Link 
};

template<typename T>class MyList
{
public:
    MyList() { _First = nullptr; };
    void Insert(T);//插入 从链表头插入
    void LookAll();
    void Remove(T);//删除
    void Inverse();//翻转
private:
    Node<T> *_First;

};
template<typename T>void MyList<T>::Insert(T k)
{/* 表头存放数据的 
    或者说没有表头
*/
    Node<T>* NewNode = new Node<T>(k);
    NewNode->Link = _First;//插入的节点指针域指向表头
    _First = NewNode;//插入的节点成为新的表头
}
template<typename T>void MyList<T>::LookAll()
{
    for (Node<T> *i = _First; i; i=i->Link)
    {
        std::cout << i->data;
        if (i->Link)
        {
            std::cout << "->";
        }
    }
    std::cout << std::endl;
}
template<typename T>void MyList<T>::Remove(T k)
{
    Node<T> *NowNode ;
    Node<T> *Previous = nullptr;
    for (NowNode= _First;
        NowNode&&NowNode->data!=k;
        Previous=NowNode,NowNode=NowNode->Link)
    {
        ;
    }
    if (NowNode)
    {
        if (Previous)Previous->Link = NowNode->Link;
        else _First = _First->Link;
        delete NowNode;
    }
}
template<typename T>void MyList<T>::Inverse()
{
    Node<T>*p=_First, *q=nullptr;
    while (p)//p跳到链表末尾 nullptr就结束循环
    {
        Node<T> *r = q;//取出原q的内容
        q = p;//q被p覆盖
        p = p->Link;//p++
        q->Link = r;//q+1=原q
    }
    _First = q;
}
#endif // !_MYLIST_H_

反转成员函数的实现

template<typename T>void MyList<T>::Inverse()
{
    Node<T>*p=_First, *q=nullptr;
    while (p)//p跳到链表末尾 nullptr就结束循环
    {
        Node<T> *r = q;//取出原q的内容
        q = p;//q被p覆盖
        p = p->Link;//p++
        q->Link = r;//q+1=原q
    }
    _First = q;
}
上一篇 下一篇

猜你喜欢

热点阅读