单链表

分配新结点时要判断一下新建结点是否成功。
删除第i个结点时通过定位到第i-1的位置删除。

LinkList.h

#include<iostream>

using namespace std;

template<class T>
struct LinkNode{
    T data;
    LinkNode<T>* link;
    LinkNode(LinkNode<T> *ptr = NULL){ link = ptr; }
    LinkNode(T& x,LinkNode<T> *ptr = NULL){ data = x; link = ptr; }
};

template<class T>
class LinkList{
protected:
    LinkNode<T> *first;  

public:
    LinkList(){ first = new LinkNode<T>; }
    LinkList(const T& x){ first = new LinkNode<T>(x); }
    ~LinkList(){ makeEmpty(); }
    void makeEmpty();
    int Length()const;
    LinkNode<T>* getHead()const{ return first; }
    LinkNode<T>* search(T& x);
    LinkNode<T>* locate(int i);     //定位,返回第i个元素的地址
    bool getData(int i, T& x);
    void setData(int i, T& x);
    bool insert(int i, T& x);   //将元素x插入在第i个结点之后
    bool remove(int i, T& x);   //删除链表中的第i个元素,并通过x返回该元素的值
    bool isEmpty()const{ return first->link = NULL ? return true : false; }
    void output();
    void inputFront(T endTag);  //前插法建立单链表

};

template<class T>
void LinkList<T>::makeEmpty(){
    LinkNode<T> *p;
    while (first->link != NULL){
        p = first->link;
        first->link = p->link;  // first链到将被删除的节点的后一个节点
        delete p;       
    }
}

template<class T>
int LinkList<T>::Length() const{
    LinkNode<T> *p;
    p = first->link;
    int cnt = 0;
    while (p->link != NULL){
        p = p->link;
        cnt++;
    }
    return cnt;
}

template<class T>
LinkNode<T>* LinkList<T>::search(T &x){
    LinkNode<T> *p = first->link;
    while (p->link != NULL){
        if (p->data == x)
            return p;
        p = p->link;
    }
    return NULL;
}


template<class T>
LinkNode<T>* LinkList<T>::locate(int i){
    if (i < 0) return NULL;         //判断i的有效性
    LinkNode<T> *p = first;
    int cnt = 0;
    while (p != NULL && cnt < i){  
        cnt++;
        p = p->link;
    }
    return p;
}

template<class T>
bool LinkList<T>::getData(int i, T& x){
    if (i <= 0) 
        return false;
    LinkNode<T> *p = locate(i);
    if (p == NULL)
        return false;
    else{
        x = p->data;
        return true; 
    }
}

template<class T>
void LinkList<T>::setData(int i, T& x){
    if (i < 0) return ;
    LinkNode<T> *p = locate(i);
    if (p == NULL) return;
    else
        p->data = x;
    return;
}

template<class T>
bool LinkList<T>::insert(int i, T& x){
    if (i < 0) return false;
    LinkNode<T> *current = locate(i);
    if (current == NULL) return false;
    LinkNode<T> *p = new LinkNode<T>(x);
    if (p == NULL) {
        cout << "内存分配错误" << endl; exit(1);
    }
    p->link = current->link;
    current->link = p;
    return true;
}


template <class T>
bool LinkList<T>::remove(int i, T& x){

    if (i < 0) return false;
    LinkNode<T> *current = locate(i - 1);
    if (current == NULL || current->link == NULL) return false;  // 要判断定位节点的和后一个节点(删除节点)的有效性
    LinkNode<T> *del = current->link;
    current->link = del->link;
    x = del->data; 
    delete del;
    return true;
}

template<class T>
void LinkList<T>::output(){
    LinkNode<T> *current = first->link;
    while (current != NULL){
        cout << current->data << "  ";
        current = current->link;
    }
    cout << endl;

}

template<class T>
void LinkList<T>::inputFront(T endTag){

    LinkNode<T> *p;
    T val;
    makeEmpty();
    cin >> val;
    while (val != endTag){
        p = new LinkNode<T>(val);
        if (p == NULL){
            cout << "内存分配错误!" << endl;
            exit(1);
        }
        p->link = first->link;
        first->link = p;
        cin >> val;
    }
}

Test.cpp

#include"LinkList.h"
using namespace std;

void main(){

    LinkList<int> intList;

    intList.inputFront(-1);
    intList.output();

    int x, y=10;
    intList.getData(2, x);
    cout << x <<endl;
    intList.setData(7, y);
    intList.output();

    intList.Length();
    int p, q = 9;
    intList.insert(6, q);
    intList.remove(5, p);
    cout << p << endl;
    intList.output();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值