歡迎您光臨本站 註冊首頁

C++順序表的基本操作(使用模版類)

←手機掃碼閱讀     火星人 @ 2020-04-28 , reply:0

本文實例為大家分享了C++順序表的基本操作,供大家參考,具體內容如下

一、遇到問題:

原因:類的函數定義不能放在SeqList.cpp中,必須放在Seqlist.h(類的函數聲明和定義放在同一個文件下)中,否則

會出現以下問題。

二、實現程序:

1.SeqList.h

#ifndef SeqList_h #define SeqList_h #include

using namespace std; const int defaultSize = 100; templateclass SeqList{ public: SeqList(int sz = defaultSize); 

// 構造函數 SeqList(SeqList& L); 

// 複製構造函數 ~SeqList();

 // 析構函數 int Size(); 

// 重載虛函數:計算表最大可容納表項個數,限制權限,類外無法直接獲取maxSize int Length(); 

// 計算表長度 int Search(T x); 

// 搜索x在表中位置,函數返回表項序號 int Locate(int i); 

// 定位第i個表項,函數返回表項序號 bool getData(int i, T& x); // 取第i個表項的值 void setData(int i, T x); // 用x修改第i個表項的值 bool Insert(int i, T x); 

// 在第i個表項後插入元素x bool Remove(int i, T& x); 

// 刪除第i個表項,通過x返回 bool isEmpty(); 

// 判斷表是否為空,空則返回true;否則,返回false bool isFull(); 

// 判斷表滿否,滿則返回true;否則,返回false void Input(); 

// 輸入數據建立表 void Output(); 

// 打印表 void Sort(); 

// 排序 SeqListoperator=(SeqList& L); // 表整體賦值 private: T *data; 

// 存放數組 int maxSize; 

// 最大可容納表項的項數 int last; // 當前已存表項的最後位置(從0開始) void reSize(int newSize); 

// 改變數組空間大小

 }; 

templateSeqList::SeqList(int sz) { 

// 構造函數,通過指定參數sz定義數組的長度

 if(sz > 0) { maxSize = sz; last = -1; 

// 置表的實際長度為空

 data = new T[maxSize]; 

// 創建順序表存儲數組 

if(data == NULL) { cerr << "動態內存分配失敗!" << endl; exit(1); } } } templateSeqList::SeqList(SeqList& L) { 

// 複製構造函數,用參數表中給出的已有順序表初始化新建的順序表 

// 如果沒有定義複製構造函數,系統會自動建立一個複製構造函數 

maxSize = L.Size(); 

// 最大可容納的個數 last = L.Length() - 1; 

// 數組最後的位置 T value; data = new T[maxSize]; 

// 創建順序表存儲數組 if(data == NULL) { 

cerr << "動態內存分配失敗!" << endl; exit(1); } for(int i = 1; i <= last+1; i++) { L.getData(i, value); 

// 取第i個位置的值 data[i-1] = value; } } templateSeqList::~SeqList() { 

// 析構函數 delete []data; } templatevoid SeqList::reSize(int newSize) { 

// 私有函數:擴充順序表的存儲數組空間大小,新數組的元素個數為newSize if(newSize <= 0) { // 檢查參數的合理性 cerr << "無效的數組大小" << endl; return; } if(newSize != maxSize) { // 修改 T *newArray = new T[newSize]; 

// 建立新數組 if(newArray == NULL) { cerr << "動態內存分配失敗!" << endl; exit(1); } int n = last + 1; T *srcPtr = data; // 源數組首地址 T *destPtr = newArray; 

// 目的數組首地址 while(n--) *destPtr++ = *srcPtr++; 

// 複製:只是數據 delete []data; 

// 刪除舊數組 data = newArray; 

// 複製新數組 maxSize = newSize; 

// 複製新數組:數據和內存空間 } } templateint SeqList::Size(){ 

// 計算表最大可容納表項個數 return maxSize; } templateint SeqList::Length(){ 

// 計算表長度 return last+1; } templateint SeqList::Search(T x){ 

// 搜索x在表中位置,函數返回表項序號:在表中的第幾個位置;搜索失敗:返回0 for(int i = 0; i <= last; i++) 

// 順序搜索 if(data[i] == x) return (i+1); return 0; } templateint SeqList::Locate(int i){ // 定位第i個表項,函數返回第i(1<= i <= i="">= 1 && i <= last+1) return i-1; 

// 數組下標從0開始 return -1; } templatebool SeqList::getData(int i, T& x){

 // 取第i個表項的值 if(i > 0 && i <= last+1) { x = data[i-1]; return true; } return false; } templatevoid SeqList::setData(int i, T x){ 

// 用x修改第i個表項的值 if(i > 0 && i <= last+1) data[i-1] = x; } templatebool SeqList::Insert(int i, T x) { 

// 在第i個表項後插入元素x if(last == maxSize-1) 

// 表滿,不能插入 return false; if(i < 0 || i > last+2) // 參數i不合理,不能插入, last+2表示數組的最後面插入 return false; for(int j = last; j >= i; j--) data[j+1] = data[j]; 

// 依次後移,空出第i號位置 data[i] = x; 

// 插入 last++; // 最後位置加1 return true; 

// 插入成功 } templatebool SeqList::Remove(int i, T& x) { 

// 刪除第i個表項,通過x返回 if(last == -1) 

// 表空,不能刪除 return false; if(i < 0 || i > last+1) 

// 參數i不合理,不能插入 return false; x = data[i-1]; for(int j = i-1; j < last; j++) data[j] = data[j+1]; last--; 

// 最後位置減1 return true; // 刪除成功 } templatebool SeqList::isEmpty(){ 

// 判斷表是否為空,空則返回true;否則,返回false return (last == -1 ? true : false); } templatebool SeqList::isFull(){ 

// 判斷表滿否,滿則返回true;否則,返回false return (last == maxSize-1 ? true : false); } templatevoid SeqList::Input() {

 // 從標準輸入(鍵盤)逐個數據輸入,建立順序表 int len; cout << "開始建立順序表,請輸入表中元素個數:"; cin >> len; if(len > maxSize) { cout << "表元素個數輸入有誤,範圍不超過:" << maxSize << endl; return; } last = len - 1; 

// 數組最後位置 cout << "請輸入建表的數據:" << endl; for(int i = 0; i <= cin="">> data[i]; } templatevoid SeqList::Output() { 

// 將順序表全部元素輸出到屏幕上 for(int i = 0; i <= last; i++) cout << data[i] << " "; cout << endl; } templatevoid SeqList::Sort() { int flag; T temp; // 排序:從小到大 for(int i = 0; i < last; i++) { 

// 最後一個不用排了 flag = 0;

 // 標誌該輪是否有交換, 0表示沒有交換,1表示有交換 

// 沒有交換,說明已排好序,提前結束 

for(int j = 0; j < (last - i); j++) { 

// 向後冒泡 

if(data[j] > data[j + 1]) { flag = 1; temp = data[j+1]; data[j+1] = data[j]; data[j] = temp; } } if(flag == 0) 

// 沒有交換,提前結束程序 break; } } templateSeqListSeqList::operator=(SeqList& L) { int size, value; 

// 表整體賦值:順序表整體賦值

 size = L.Size(); if(maxSize != size) { 

// 表最大可容納數小於L的 

reSize(size); 

// 該變數組大小 }

 last = L.Length() - 1; 

// 數組的最後位置 for(int i = 1; i <= last+1; i++) { L.getData(i, value); // 取第i個位置的值 data[i-1] = value; } } 

#endif /* SeqList_h */


[火星人 ] C++順序表的基本操作(使用模版類)已經有417次圍觀

http://coctec.com/docs/c/language/show-post-232002.html