C++ Xcode + 連結串列
阿新 • • 發佈:2019-01-07
先給一個結構:
node.h
#ifndef Node_h
#define Node_h
/*類模板*/
template <class T>
class Node
{
public:
Node<T> * next;
Node<T> * prev;
T data;
};
#endif /* Node_h */
Link.hpp是具體類的定義,宣告等:
// // Link.hpp // Prac-Map // // Created by Lin,Wang on 2018/10/16. // Copyright © 2018年 Lin,Wang. All rights reserved. // #ifndef Link_hpp #define Link_hpp /*系統檔案尖括號,新增檔案是雙引號*/ #include<stdio.h> #include<iostream> #include<sstream> #include<string> #include "Node.h" using namespace std; template <class T> class List { public: List(); // 預設建構函式 List(const List& ln ); //拷貝建構函式 ~List(); // 解析函式 void add(T e); //新增節點 void ascSort(); //生序排列 void remove(T index); //移除某個節點 T find(int index);//查詢節點 bool isEmpty();//判斷是否為空 int size(); //判斷連結串列的長度 void show();// 顯示連結串列 void resShow();//連結串列的反向顯示 void removeAll();//刪除全部節點 private: Node <T> *head; Node <T> *tail; int length; }; //預設建構函式 template <typename T> List<T>::List() { head = new Node<T>; tail = new Node<T>; head->next = tail; head->prev = nullptr; tail->next = nullptr; tail->prev = head; length = 0; cout<<"Init List Succeed"<<endl; } //拷貝建構函式 template <typename T> List<T>::List(const List &ln) { head = new Node<T>; head->prev = nullptr; tail = new Node<T>; head->next = tail; tail->prev = head; length = 0; Node<T>* temp = ln.head; while(temp->next != ln.tail) { temp = temp->next; tail->data = temp->data; Node<T> *p = new Node<T>; p->prev = tail; tail->next = p; tail = p; length++; } tail->next = nullptr; } // 向連結串列新增資料 template <typename T> void List<T>::add(T e) { tail->data = e; tail->next = new Node<T>; Node<T> *p = tail; tail = tail->next; tail->prev = p; tail->next = nullptr; length++; } // 查詢節點 template <typename T> T List<T>::find(int index) { if (length == 0) { cout<<"List is empty"<<endl; return -1; } if(index >= length) { cout<<"Out Of Bounds"<<endl; return -1; } int x = 0; Node<T> *p; if(x < length/2) { p = head->next; while(p->next!=nullptr && x++!=index) { p = p->next; } }else { p = tail->prev; while(p->prev != nullptr && x++ != index) { p = p->prev; } } return p->data; } //刪除所有節點 template <typename T> void List<T>::removeAll() { if(length == 0) { return; } Node<T> *p = head->next; while(p!=tail) { Node<T>*temp = p; p = p->next; delete temp; } head->next = tail; tail->prev = head; length = 0; } //升序排列 template <typename T> void List<T>::ascSort() { if(length<=1) { return; } Node <T> *p = head->next; for(int i = 0;i<length-1;i++) { Node<T>*q = p->next; for(int j=i+1;j<length;j++) { if(p->data > q->data) { T temp = q->data; q->data = p->data; p->data = temp; } q = q->next; } p = p->next; } } //判斷連結串列是否為空 template <typename T> bool List<T>::isEmpty() { if(length == 0) { return true; }else { return false; } } //求連結串列長度 template <typename T> int List<T>::size() { return length; } //輸出連結串列 template <typename T> void List<T>::show() { if(length == 0) { cout<<"List is Empty"<<endl; return; } Node<T> *p = head->next; while(p!=tail) { cout<<p->data<<" -> "; p = p->next; } cout<<std::endl; } //反向輸出連結串列 template <typename T> void List<T>::resShow() { if(length == 0) { return; } Node<T> *p = tail->prev; while(p!=head) { cout<<p->data<<" -> "; p = p->prev; } cout<<endl; } //解構函式 template <typename T> List<T>::~List() { cout<<"刪除類List,析構"<<endl; if(length == 0) { delete head; delete tail; head = nullptr; tail = nullptr; return; } while(head->next != nullptr) { Node<T>*temp = head; head = head->next; delete temp; } delete head; head = nullptr; } #endif /* Link_hpp */
最後是main函式對List 的使用:
#include <iostream> #include "Link.hpp" using namespace std; int main(int argc, const char * argv[]) { // insert code here... cout << "Hello, World!"<<endl; List<float> ls1; ls1.add(1.1); ls1.add(0.1); ls1.add(6); ls1.add(3.3); ls1.show(); List<float> ls2(ls1); ls2.resShow(); ls2.ascSort(); ls2.show(); cout<<ls2.size()<<endl; cout<<ls2.find(2)<<endl; ls2.removeAll(); ls1.show(); return 0; }
最後的顯示: