线性表的顺序存储——顺序存储结构的抽象实现
生活随笔
收集整理的這篇文章主要介紹了
线性表的顺序存储——顺序存储结构的抽象实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1,本文完成順序存儲結構線性表的抽象實現:
1,SeqList 還是一個抽象類,這里僅實現線性表的關鍵操作,但是還是不能生成具體對象;
?????? 2,關鍵操作雖然指定,但是順序存儲的指定沒有在 SeqList 中完成,所以還是抽象類,不能生成具體對象;
?
??????
2,SeqList 設計要點:
?????? 1,抽象類模板,存儲空間的位置和大小由子類完成;
?????? 2,實現順序存儲結構線性表的關鍵操作(增刪查等);
?????? 3,提供數組操作符,方便快速獲取元素(因為是順序存儲結構,可以重載數組操作符);
?
3,SeqList 具體函數接口(增刪設獲長清操容):
? ? ?
?
4,順序存儲線性表實現:
1 #ifndef SEQLIST_H 2 #define SEQLIST_H 3 4 #include "Object.h" 5 #include "List.h" 6 #include "Exception.h" 7 8 namespace DTLib 9 { 10 11 template <typename T> 12 class SeqList : public List<T> 13 { 14 protected: 15 T* m_array; //順序存儲空間,子類實現,這里不賦值指針 16 int m_length; //當前線性表長度 17 18 public: 19 bool insert(int i, const T& e) // n + 5 => O(n) 20 { 21 bool ret = ((0 <= i) && (i <= m_length)); 22 ret = ret && (m_length <= capacity()); // 要插入元素,當插入后長度要加 1,此時小于號正好合適 23 24 if( ret ) 25 { 26 for(int p=m_length-1; p>=i; p--) // 基于順序表的插入要涉及數據向后挪動空出目標位置,向后移動則從后開始 27 { 28 m_array[p + 1] = m_array[p]; // 這里數組操作符實質是指針運算 29 } 30 31 m_array[i] = e; 32 m_length++; 33 } 34 35 return ret; 36 } 37 38 bool insert(const T& e) // 在線性表的尾部插入一個元素; 39 { 40 return insert(m_length, e); 41 } 42 43 bool remove(int i) // O(n) 44 { 45 bool ret = ((0 <= i) && (i < m_length)); 46 47 if( ret ) 48 { 49 for(int p = i; p<m_length-1; p++) // 基于順序表的刪除要涉及數據向前挪動,向前移動則從前開始 50 { 51 m_array[p] = m_array[p + 1]; 52 } 53 54 m_length--; 55 } 56 57 return ret; 58 } 59 60 bool set(int i, const T& e) 61 { 62 bool ret = ((0 <= i) && (i < m_length)); 63 64 if( ret ) 65 { 66 m_array[i] = e; 67 } 68 69 return ret; 70 } 71 72 /* 通過參數 e 來返回目標位置,而沒有通過返回值返回,是由于目標位置可能不合法,不合法就返回 false,也就是 get() 操作用來說明當前操作是否合法*/ 73 bool get(int i, T& e) const 74 { 75 bool ret = ((0 <= i) && (i < m_length)); 76 77 if( ret ) 78 { 79 e = m_array[i]; 80 } 81 82 return ret; 83 } 84 85 /* 86 int get(int i) const 87 { 88 int ret = -1; 89 90 if(get(i, ret)) 91 { 92 return ret; 93 } 94 95 return ret; 96 } 97 */ 98 99 int find(const T& e) const //O(n) 100 { 101 int ret = -1; 102 103 for(int i=0; i<m_length; i++) 104 { 105 if(m_array[i] == e) 106 { 107 ret = i; 108 109 break; 110 } 111 } 112 113 return ret; 114 } 115 116 int length() const 117 { 118 return m_length; 119 } 120 121 void clear() 122 { 123 m_length = 0; 124 } 125 126 // 順序存儲線性表的數組訪問方式,也是一般的訪問方式; 127 T& operator[] (int i) 128 { 129 bool ret = ((0 <= i) && (i < m_length)); // 必須先插入數據元素,然后才能訪問 130 131 if( ret ) 132 { 133 return m_array[i]; 134 } 135 else 136 { 137 THROW_EXCEPTION(IndexOutOfBoundsException, "Parameter i is invalid ..." ); 138 } 139 } 140 141 // 這里考慮了 const 和非 const 對象 142 T operator[] (int i) const 143 { 144 return (const_cast<SeqList<T>&>(*this))[i]; 145 } 146 147 //順序存儲空間的最大容量,順序存儲空間的指定沒有在這個類中指定,在//其子類中完成的,所以具體實現要放在子類中完成; 148 virtual int capacity() const = 0; 149 }; 150 151 } 152 #endif // SEQLIST_H?
5,順序鏈表測試代碼:
1 #include <iostream> 2 #include "SeqList.h" 3 4 using namespace std; 5 using namespace DTLib; 6 7 int main() 8 { 9 SeqList<int>* l; 10 return 0; 11 }轉載于:https://www.cnblogs.com/dishengAndziyu/p/10921473.html
總結
以上是生活随笔為你收集整理的线性表的顺序存储——顺序存储结构的抽象实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML框架IFrame结合JS在主页面
- 下一篇: 2018-2019-2 网络对抗技术 2