C++ 靜態連結串列的實現
阿新 • • 發佈:2019-02-06
#include<iostream> #define MAXSIZE 100 using namespace std; struct Node { int data; //結點資料 int next; //指向下一個結點的指標 }; class Static_List { private: Node node[MAXSIZE]; //存放靜態連結串列的結構陣列 int free_node; //空閒連結串列表頭 public: Static_List() { node[0].next = -1; //頭結點 free_node = 1; //空閒連結串列第一個結點的位置 for (int i = 1; i < MAXSIZE-1; i++) node[i].next = i + 1; //構造空閒連結串列 node[MAXSIZE - 1].next = -1; //空閒連結串列收尾 } int Length(); //計算靜態連結串列的長度 int search(int value); //在靜態連結串列中查詢具有給定值的結點 int Locate(int i); //在靜態連結串列中查詢第i個結點 bool Append(int value); //在靜態連結串列的表尾追加一個新結點 bool Insert(int i, int value); //在靜態連結串列第i個結點後插入新結點 bool Remove(int i); //在靜態連結串列中釋放第i個結點 bool IsEmpty(); //判斷連結串列空否 void print_list(); }; int Static_List::Length() { int count = 0; int p = node[0].next; while (p != -1) { p = node[p].next; count++; } return count; } int Static_List::search(int value) { int p = node[0].next; while (node[p].data != value) { if (node[p].next == -1) return -1; //未找到 p = node[p].next; } return p; } int Static_List::Locate(int i) { int p = node[0].next; if (i < 0) { cout << "輸入錯誤" << endl; return -1; //輸入錯誤 } if (i == 0) { return 0; } for (int j = 1; j < i; j++) { if (node[p].next == -1) return -1; //連結串列元素個數小於i p = node[p].next; } return p; } bool Static_List::Append(int value) { if (free_node == -1) { return false; //剩餘空間不足,無法分配 } int temp = free_node; free_node = node[free_node].next; node[temp].data = value; node[temp].next = -1; int p = 0; while (node[p].next != -1) { p = node[p].next; } node[p].next = temp; return true; } bool Static_List::Insert(int i, int value) { int p = Locate(i); if (free_node == -1) return false; //連結串列剩餘空間不足 int temp = free_node; free_node = node[free_node].next; node[temp].data = value; node[temp].next = node[p].next; node[p].next = temp; return true; } bool Static_List::Remove(int i) { int p = Locate(i); if (p == -1) { cout << "連結串列長度小於i" << endl; return false; } int temp = Locate(i - 1); node[temp].next = node[p].next; node[p].next = free_node; free_node = p; } bool Static_List::IsEmpty() { return node[0].next == -1; } void Static_List::print_list() { int p = node[0].next; while (p != -1) { cout << node[p].data << " "; p = node[p].next; } cout << endl; }