每日一數據結構封裝之單鏈表

打算從每天用c++類模板來封裝一數據結構,就從最簡單的單鏈表開始,本身比較簡單加上也比較熟悉了就當練練手。

我寫的是帶空頭結點的鏈表,這樣一些操作更簡單不用分情況。還有一需要注意的是代碼的魯棒性,比較在查找某節點時,注意輸入的位置是否大於鏈表長度,以及鏈表是否爲空等等,其他都很簡單,直接上代碼

#include <iostream>
using namespace std;

//單鏈表
template  <typename T>
class Node{
public:
    T val;
    Node *next;
    Node() = default;
    Node(T inval) : val(inval) , next(NULL) {};
};

template  <typename T>
class Single{
private:
    Node<int> *head;    //頭結點
    int length; //鏈表長度

public:
    Single();
    ~Single();

    int Getsize();  //獲取鏈表長度
    bool Empty();   //檢查是否爲空

    Node<T> *Insert_head(T t);
    Node<T> *Insert_end(T t);
    Node<T> *Insert(int index,T t); //在指定位置插入某節點

    int Find(T t);  //查詢某節點的位置
    Node<T>* Get_end();    //獲得尾節點
    Node<T>* Get(int index);   //獲得某位置的節點

    Node<T> *Delete(int index);     //刪除指定位置的節點
    Node<T> *Delete_head(); //刪除頭結點
    Node<T> *Delete_end();  //      刪除尾節點

};

template  <typename T>
Single<T> ::Single() {
    length = 0;
    head = new Node<T>();
    head->next = NULL;
}

template  <typename T>
Single<T>::~Single() {
    Node<T> *root = head->next;
    while(root != NULL){
        Node<T> *temp = root;
        root = root->next;
        delete temp;
    }
}

template  <typename T>
int Single<T>::Getsize() {
    return length;
}

template  <typename T>
bool Single<T>::Empty() {
    return length== 0;
}

template  <typename T>
Node<T>* Single<T>::Insert_head(T t){
    Node<T> *newhead = new Node<T>(t);
    newhead->next = head;
    head = newhead;
    return newhead;
}

template  <typename T>
Node<T>* Single<T>::Insert_end(T t){
    Node<T> *newnode = new Node<T>(t);
    Node<T> *end = Get_end();
    end->next = newnode;
    return newnode;
}

template  <typename T>
Node<T>* Single<T>::Insert(int index,T t){
    if(index >= length)
        return NULL;
    Node<T> *newnode = new Node<T>(t);
    Node<T> *temp  = Get(index);
    Node<T> *temp1 = temp->next;
    temp->next = newnode;
    newnode->next = temp1;
}

template  <typename T>
int Single<T>::Find(T t){
    if(head->next == NULL)
        return NULL;
    Node<T> *temp = head->next;
    int cnt = 0;
    while(temp != NULL){
        cnt++;
        if(temp->val == t->val)
            break;
    }
    return cnt;
}

template  <typename T>
Node<T>* Single<T>::Get_end() {
    Node<T> *temp = head;
    while(temp->next != NULL){
        temp = temp->next;
    }
    return temp;
}

template  <typename T>
Node<T>* Single<T>::Get(int index)
{
    Node<T> *temp = head;
    if(index>=length)
        return NULL;
    while(index--){
        temp = temp->next;
    }
    return temp;
}

template <typename T>
Node<T>* Single<T>::Delete(int index)
{
    if (Empty())
        return NULL;
    Node<T>* ptrNode = Get(index);
    Node<T>* delNode = ptrNode->_next;
    ptrNode->_next = delNode->_next;
    length--;
    delete delNode;
    return ptrNode->_next;
};

template<typename T>
Node<T>* Single<T>::Delete_head()
{
    return Delete(0);
};

template<typename T>
Node<T>*Single<T>::Delete_end()
{
    return Delete(length);
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章