打算從每天用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);
};