線性表C++類實現
阿新 • • 發佈:2019-01-08
線性表的定義:線性表是具有相同資料型別的n(n≥0)個數據元素有限序列。除第一個元素元素外都有前驅,除最有一個元素外都有後繼。
儲存是順序儲存成為順序表,鏈式儲存成為單鏈表。一下分別對順序表和單鏈表用C++類來實現。
順序表:
靜態分配記憶體
template <typename ElemType> class List { public: List(); ~List(); private: ElemType data[MaxSize]; //順序表陣列 int length; //順序表當前長度 static int MaxSize=50; //陣列的最大容量 };
動態分配記憶體
template <typename ElemType>
class List
{
public:
List();
~List();
private:
ElemType * data; //順序表動態分配陣列指標
int length; //順序表當前長度
int MaxSize; //陣列當前最大容量
static int InitSize = 50; //表長初始定義長度
};
可更具具體功能的需要,進行修改。
下面以動態分配記憶體為例實現一些功能
執行結果如下:#include <iostream> using namespace std; template <typename ElemType> class List { public: List(int n); //建構函式進行初始化 ~List(); void ElemInsert(ElemType t,int i); void ElemDelete(int i); void ShowList(); private: ElemType * data; //順序表動態分配陣列指標 int length; //順序表當前長度 int MaxSize; //陣列的當前最大容量 static const int InitSize = 50; //表長初始定義長度 }; template <typename ElemType> List<ElemType>::List(int n) { data = new ElemType[InitSize]; length = 0; MaxSize = InitSize; for (int i = 0; i < n; i++) { cout << "Input: data[" << i << "] = "; cin >> data[i]; length++; } } template <typename ElemType> List<ElemType>::~List() { delete[]data; } template <typename ElemType> void List<ElemType>::ElemInsert(ElemType t, int i) { if (i<1 || i>length + 1) { cout << "error"; return; } if (length>=MaxSize) { cout << "error"; return; } for (int j = length; j >= i; j--) data[j] = data[j - 1]; data[i - 1] = t; length++; } template <typename ElemType> void List<ElemType>::ElemDelete(int i) { if (i<1 || i>length) { cout << "error"; return; } for (int j = i; j < length; j++) data[j - 1] = data[j]; length--; } template <typename ElemType> void List<ElemType>::ShowList() { for (int i = 0; i < length; i++) { cout << data[i] << " "; } cout << endl; } int main() { List<int> one(4); one.ShowList(); one.ElemInsert(3, 2); //在第二個位置插入3 one.ShowList(); one.ElemDelete(2); //刪除第二個元素 one.ShowList(); return 0; }
單鏈表的實現看如下程式碼即可明白:
#include <iostream> using namespace std; template<typename ElemType> class LinkedNode { public: void CreateList(); // 建立連結串列 void ShowList(); //顯示連結串列 void ReverseList(); //逆置連結串列 void DeleteElem(ElemType t); //刪除t private: ElemType data; LinkedNode * next; }; template<typename ElemType> void LinkedNode<ElemType>::CreateList() { int n; cin >> n; LinkedNode * p, *q; p = this; while (n--) { q = new LinkedNode; cin >> q->data; p->next = q; p = q; } p->next = nullptr; } template<typename ElemType> void LinkedNode<ElemType>::ShowList() { LinkedNode *p; p = this->next; while (p != nullptr) { cout << p->data << " "; p = p->next; } cout << endl; } template<typename ElemType> void LinkedNode<ElemType>::ReverseList() { LinkedNode *p, *q, *t; p = this->next; if (p == nullptr) return; q = p->next; while (q != nullptr) //p不動一直是最後一個 { p->next = q->next; //儲存下個Q q->next = this->next; //插入Q this->next = q; q = p->next; //迭代下一個 } this->next = p; } template<typename ElemType> void LinkedNode<ElemType>::DeleteElem(ElemType t) { LinkedNode *p,*q; p = this; q = this->next; while (q!=nullptr) { if (q->data==t) { p->next = q->next; delete q; q = p->next; } else { p = p->next; q = q->next; } } } template<typename ElemType> void ACM1004() { LinkedNode<ElemType> *p = new LinkedNode<ElemType>; p->CreateList(); p->ShowList(); p->ReverseList(); p->ShowList(); ElemType t; cin >> t; p->DeleteElem(t); p->ShowList(); } int main() { ACM1004<int>(); ACM1004<char>(); ACM1004<double>(); return 0; }