最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年04月27日 17:06:02   作者:ChanJose  
這篇文章主要為大家詳細(xì)介紹了C++順序表的基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

一、遇到問(wèn)題:

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

會(huì)出現(xiàn)以下問(wèn)題。

二、實(shí)現(xiàn)程序:

1.SeqList.h

#ifndef SeqList_h
#define SeqList_h
#include <iostream>
using namespace std;
 
const int defaultSize = 100;
 
template<class T>
class SeqList{
public:
 SeqList(int sz = defaultSize); // 構(gòu)造函數(shù)
 SeqList(SeqList<T>& L); // 復(fù)制構(gòu)造函數(shù)
 ~SeqList(); // 析構(gòu)函數(shù)
 int Size(); // 重載虛函數(shù):計(jì)算表最大可容納表項(xiàng)個(gè)數(shù),限制權(quán)限,類(lèi)外無(wú)法直接獲取maxSize
 int Length(); // 計(jì)算表長(zhǎng)度
 int Search(T x); // 搜索x在表中位置,函數(shù)返回表項(xiàng)序號(hào)
 int Locate(int i); // 定位第i個(gè)表項(xiàng),函數(shù)返回表項(xiàng)序號(hào)
 bool getData(int i, T& x); // 取第i個(gè)表項(xiàng)的值
 void setData(int i, T x); // 用x修改第i個(gè)表項(xiàng)的值
 bool Insert(int i, T x); // 在第i個(gè)表項(xiàng)后插入元素x
 bool Remove(int i, T& x); // 刪除第i個(gè)表項(xiàng),通過(guò)x返回
 bool isEmpty(); // 判斷表是否為空,空則返回true;否則,返回false
 bool isFull(); // 判斷表滿(mǎn)否,滿(mǎn)則返回true;否則,返回false
 void Input(); // 輸入數(shù)據(jù)建立表
 void Output(); // 打印表
 void Sort(); // 排序
 SeqList<T> operator=(SeqList<T>& L); // 表整體賦值
private:
 T *data; // 存放數(shù)組
 int maxSize; // 最大可容納表項(xiàng)的項(xiàng)數(shù)
 int last; // 當(dāng)前已存表項(xiàng)的最后位置(從0開(kāi)始)
 void reSize(int newSize); // 改變數(shù)組空間大小
};
 
template <class T>
SeqList<T>::SeqList(int sz) {
 // 構(gòu)造函數(shù),通過(guò)指定參數(shù)sz定義數(shù)組的長(zhǎng)度
 if(sz > 0) {
 maxSize = sz;
 last = -1; // 置表的實(shí)際長(zhǎng)度為空
 data = new T[maxSize]; // 創(chuàng)建順序表存儲(chǔ)數(shù)組
 if(data == NULL) {
 cerr << "動(dòng)態(tài)內(nèi)存分配失敗!" << endl;
 exit(1);
 }
 }
}
 
template <class T>
SeqList<T>::SeqList(SeqList<T>& L) {
 // 復(fù)制構(gòu)造函數(shù),用參數(shù)表中給出的已有順序表初始化新建的順序表
 // 如果沒(méi)有定義復(fù)制構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)建立一個(gè)復(fù)制構(gòu)造函數(shù)
 maxSize = L.Size(); // 最大可容納的個(gè)數(shù)
 last = L.Length() - 1; // 數(shù)組最后的位置
 T value;
 data = new T[maxSize]; // 創(chuàng)建順序表存儲(chǔ)數(shù)組
 if(data == NULL) {
 cerr << "動(dòng)態(tài)內(nèi)存分配失敗!" << endl;
 exit(1);
 }
 for(int i = 1; i <= last+1; i++) {
 L.getData(i, value); // 取第i個(gè)位置的值
 data[i-1] = value;
 }
}
 
template <class T>
SeqList<T>::~SeqList() {
 // 析構(gòu)函數(shù)
 delete []data;
}
 
template <class T>
void SeqList<T>::reSize(int newSize) {
 // 私有函數(shù):擴(kuò)充順序表的存儲(chǔ)數(shù)組空間大小,新數(shù)組的元素個(gè)數(shù)為newSize
 if(newSize <= 0) { // 檢查參數(shù)的合理性
 cerr << "無(wú)效的數(shù)組大小" << endl;
 return;
 }
 if(newSize != maxSize) { // 修改
 T *newArray = new T[newSize]; // 建立新數(shù)組
 if(newArray == NULL) {
 cerr << "動(dòng)態(tài)內(nèi)存分配失敗!" << endl;
 exit(1);
 }
 int n = last + 1;
 T *srcPtr = data; // 源數(shù)組首地址
 T *destPtr = newArray; // 目的數(shù)組首地址
 while(n--)
 *destPtr++ = *srcPtr++; // 復(fù)制:只是數(shù)據(jù)
 delete []data; // 刪除舊數(shù)組
 data = newArray; // 復(fù)制新數(shù)組
 maxSize = newSize; // 復(fù)制新數(shù)組:數(shù)據(jù)和內(nèi)存空間
 }
}
 
template <class T>
int SeqList<T>::Size(){
 // 計(jì)算表最大可容納表項(xiàng)個(gè)數(shù)
 return maxSize;
}
 
template <class T>
int SeqList<T>::Length(){
 // 計(jì)算表長(zhǎng)度
 return last+1;
}
 
template <class T>
int SeqList<T>::Search(T x){
 // 搜索x在表中位置,函數(shù)返回表項(xiàng)序號(hào):在表中的第幾個(gè)位置;搜索失?。悍祷?
 for(int i = 0; i <= last; i++) // 順序搜索
 if(data[i] == x)
 return (i+1);
 return 0;
}
 
template <class T>
int SeqList<T>::Locate(int i){
 // 定位第i個(gè)表項(xiàng),函數(shù)返回第i(1<= i <= last+1)個(gè)表項(xiàng)的位置,否則函數(shù)返回-1,表示定位失敗
 if(i >= 1 && i <= last+1)
 return i-1; // 數(shù)組下標(biāo)從0開(kāi)始
 return -1;
}
 
template <class T>
bool SeqList<T>::getData(int i, T& x){
 // 取第i個(gè)表項(xiàng)的值
 if(i > 0 && i <= last+1) {
 x = data[i-1];
 return true;
 }
 return false;
}
 
template <class T>
void SeqList<T>::setData(int i, T x){
 // 用x修改第i個(gè)表項(xiàng)的值
 if(i > 0 && i <= last+1)
 data[i-1] = x;
}
 
template <class T>
bool SeqList<T>::Insert(int i, T x) {
 // 在第i個(gè)表項(xiàng)后插入元素x
 if(last == maxSize-1) // 表滿(mǎn),不能插入
 return false;
 if(i < 0 || i > last+2) // 參數(shù)i不合理,不能插入, last+2表示數(shù)組的最后面插入
 return false;
 for(int j = last; j >= i; j--)
 data[j+1] = data[j]; // 依次后移,空出第i號(hào)位置
 data[i] = x; // 插入
 last++; // 最后位置加1
 return true; // 插入成功
}
 
template <class T>
bool SeqList<T>::Remove(int i, T& x) {
 // 刪除第i個(gè)表項(xiàng),通過(guò)x返回
 if(last == -1) // 表空,不能刪除
 return false;
 if(i < 0 || i > last+1) // 參數(shù)i不合理,不能插入
 return false;
 x = data[i-1];
 for(int j = i-1; j < last; j++)
 data[j] = data[j+1];
 last--; // 最后位置減1
 return true; // 刪除成功
}
 
template <class T>
bool SeqList<T>::isEmpty(){
 // 判斷表是否為空,空則返回true;否則,返回false
 return (last == -1 ? true : false);
}
 
template <class T>
bool SeqList<T>::isFull(){
 // 判斷表滿(mǎn)否,滿(mǎn)則返回true;否則,返回false
 return (last == maxSize-1 ? true : false);
}
 
template <class T>
void SeqList<T>::Input() {
 // 從標(biāo)準(zhǔn)輸入(鍵盤(pán))逐個(gè)數(shù)據(jù)輸入,建立順序表
 int len;
 cout << "開(kāi)始建立順序表,請(qǐng)輸入表中元素個(gè)數(shù):";
 cin >> len;
 if(len > maxSize) {
 cout << "表元素個(gè)數(shù)輸入有誤,范圍不超過(guò):" << maxSize << endl;
 return;
 }
 last = len - 1; // 數(shù)組最后位置
 cout << "請(qǐng)輸入建表的數(shù)據(jù):" << endl;
 for(int i = 0; i <= last; i++) // 逐個(gè)輸入表元素
 cin >> data[i];
}
 
template <class T>
void SeqList<T>::Output() {
 // 將順序表全部元素輸出到屏幕上
 for(int i = 0; i <= last; i++)
 cout << data[i] << " ";
 cout << endl;
}
 
template <class T>
void SeqList<T>::Sort() {
 int flag;
 T temp;
 
 // 排序:從小到大
 for(int i = 0; i < last; i++) { // 最后一個(gè)不用排了
 flag = 0; // 標(biāo)志該輪是否有交換, 0表示沒(méi)有交換,1表示有交換
 // 沒(méi)有交換,說(shuō)明已排好序,提前結(jié)束
 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) // 沒(méi)有交換,提前結(jié)束程序
 break;
 }
 
}
 
template <class T>
SeqList<T> SeqList<T>::operator=(SeqList<T>& L) {
 int size, value;
 
 // 表整體賦值:順序表整體賦值
 size = L.Size();
 if(maxSize != size) { // 表最大可容納數(shù)小于L的
 reSize(size); // 該變數(shù)組大小
 }
 last = L.Length() - 1; // 數(shù)組的最后位置
 for(int i = 1; i <= last+1; i++) {
 L.getData(i, value); // 取第i個(gè)位置的值
 data[i-1] = value;
 }
}
 
#endif /* SeqList_h */

2.main.cpp

#include "SeqList.h"
using namespace std;
 
int main(int argc, const char * argv[]) {
 int choose, len, i, x, maxSize, loc; // val存儲(chǔ)值,choose存儲(chǔ)用戶(hù)的選擇
 bool finished = false;
 
 SeqList<int> L; // 聲明SeqList對(duì)象
 while(!finished) {
 cout << "1:輸入數(shù)據(jù)建立順序表:" << endl;
 cout << "2:順序表的最大可容納表項(xiàng)個(gè)數(shù):" << endl;
 cout << "3:順序表的長(zhǎng)度:" << endl;
 cout << "4:搜索x在表中的位置:" << endl;
 cout << "5:定位第i個(gè)表項(xiàng):" << endl;
 cout << "6:取第i個(gè)表項(xiàng)的值:" << endl;
 cout << "7:用x修改第i個(gè)表項(xiàng)的值:" << endl;
 cout << "8:在第i個(gè)表項(xiàng)后插入元素x:" << endl;
 cout << "9:刪除第i個(gè)表項(xiàng):" << endl;
 cout << "10:判斷表是否為空:" << endl;
 cout << "11:判斷表滿(mǎn)否:" << endl;
 cout << "12:打印順序表中的數(shù)據(jù):" << endl;
 cout << "13:將順序表排序:" << endl;
 cout << "14:退出:" << endl;
 cout << "請(qǐng)輸入你的選擇[1-14]:" << endl;
 cin >> choose;
 switch(choose) {
 case 1:
 L.Input(); // 建立順序表
 break;
 case 2:
 maxSize = L.Size();
 cout << "順序表的最大可容納表項(xiàng)個(gè)數(shù)為:" << maxSize << endl;
 break;
 case 3:
 len = L.Length();
 cout << "順序表的長(zhǎng)度為:" << len << endl;
 break;
 case 4:
 cout << "請(qǐng)輸入要搜索的值x:";
 cin >> x;
 i = L.Search(x);
 if(i == 0)
  cout << "沒(méi)找到" << x << endl;
 else
  cout << x << "在表中的第" << i << "個(gè)位置" << endl;
 break;
 case 5:
 cout << "請(qǐng)輸入要定位的位置i:";
 cin >> i;
 loc = L.Locate(i);
 if(loc != -1)
  cout << "定位成功!在順序表中下標(biāo)為:" << loc << endl;
 else
  cout << "定位失敗!" << endl;
 break;
 case 6:
 cout << "請(qǐng)輸入要取表中元素的位置i:";
 cin >> i;
 if(L.getData(i, x))
  cout << "表中第" << i << "個(gè)表項(xiàng)的值為:" << x << endl;
 else
  cout << "取值失敗!檢查是否超范圍取值" << endl;
 break;
 case 7:
 cout << "請(qǐng)輸入要修改的位置i和值x:";
 cin >> i >> x;
 L.setData(i, x);
 break;
 case 8:
 cout << "請(qǐng)輸入要插入的位置i和值x:";
 cin >> i >> x;
 if(L.Insert(i, x))
  cout << "插入成功!" << endl;
 else
  cout << "插入失??!" << endl;
 break;
 case 9:
 cout << "請(qǐng)輸入要?jiǎng)h除的表項(xiàng)的位置i:";
 cin >> i;
 if(L.Remove(i, x))
  cout << "刪除成功!刪除的值為:" << x << endl;
 else
  cout << "刪除失敗!" << endl;
 break;
 case 10:
 if(L.isEmpty())
  cout << "表為空!" << endl;
 else
  cout << "表不為空!" << endl;
 break;
 case 11:
 if(L.isFull())
  cout << "表滿(mǎn)!" << endl;
 else
  cout << "表未滿(mǎn)!" << endl;
 break;
 case 12:
 cout << "表中的數(shù)據(jù)為:" << endl;
 L.Output();
 break;
 case 13:
 cout << "表中的數(shù)據(jù)排序前:" << endl;
 L.Output();
 L.Sort();
 cout << "表中的數(shù)據(jù)排序后:" << endl;
 L.Output();
 break;
 case 14:
 finished = true;
 break;
 default:
 cout << "輸入選擇錯(cuò)誤,請(qǐng)重新輸入!" << endl;
 }
 }
 return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++核心編程之內(nèi)存分區(qū)模型詳解

    C++核心編程之內(nèi)存分區(qū)模型詳解

    這篇文章主要為大家介紹了C++核心編程中內(nèi)存分區(qū)模型,C++程序在執(zhí)行時(shí),將內(nèi)存大方向分為四個(gè)區(qū)域,代碼區(qū),全局區(qū),棧區(qū),堆區(qū),文章通過(guò)代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以參考閱讀下
    2023-07-07
  • C語(yǔ)言樸素模式匹配算法實(shí)例代碼

    C語(yǔ)言樸素模式匹配算法實(shí)例代碼

    樸素模式匹配算法也稱(chēng)為布魯特-福斯算法,感覺(jué)很是高大上,但是實(shí)現(xiàn)起來(lái)很簡(jiǎn)單。這篇文章主要給大家介紹了關(guān)于C語(yǔ)言樸素模式匹配算法的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • C++ 中類(lèi)的拷貝、賦值、銷(xiāo)毀的實(shí)例詳解

    C++ 中類(lèi)的拷貝、賦值、銷(xiāo)毀的實(shí)例詳解

    這篇文章主要介紹了C++ 中類(lèi)的拷貝、賦值、銷(xiāo)毀的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C語(yǔ)言函數(shù)的遞歸調(diào)用詳情

    C語(yǔ)言函數(shù)的遞歸調(diào)用詳情

    這篇文章主要介紹了C語(yǔ)言函數(shù)的遞歸調(diào)用詳情,遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用,主要的思考方式就是大事化小,下文具體的相關(guān)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • C語(yǔ)言正則表達(dá)式詳解 regcomp() regexec() regfree()用法詳解

    C語(yǔ)言正則表達(dá)式詳解 regcomp() regexec() regfree()用法詳解

    C語(yǔ)言處理正則表達(dá)式常用的函數(shù)有regcomp()、regexec()、regfree()和regerror(),這里就為大家介紹一下,需要的朋友可以參考一下啊
    2018-04-04
  • C++?plog日志使用方法介紹

    C++?plog日志使用方法介紹

    最近突然心血來(lái)潮,想學(xué)一下日志方面的操作。在網(wǎng)上找了很多日志相關(guān)的技術(shù),最終還是決定使用plog,小巧,快速,跨平臺(tái)
    2022-10-10
  • 如何把C++的源代碼改寫(xiě)成C代碼的方法

    如何把C++的源代碼改寫(xiě)成C代碼的方法

    這篇文章主要介紹了如何把C++的源代碼改寫(xiě)成C代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • VC枚舉串口端口應(yīng)用

    VC枚舉串口端口應(yīng)用

    這篇文章主要介紹了VC枚舉串口端口應(yīng)用,羅列了常見(jiàn)的一些串口端口的應(yīng)用實(shí)例,需要的朋友可以參考下
    2014-10-10
  • C++應(yīng)用實(shí)現(xiàn)簡(jiǎn)易五子棋游戲

    C++應(yīng)用實(shí)現(xiàn)簡(jiǎn)易五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++應(yīng)用實(shí)現(xiàn)簡(jiǎn)易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Qt中connect()函數(shù)及用法詳解

    Qt中connect()函數(shù)及用法詳解

    connect() 函數(shù)就是Qt 框架中用于將信號(hào)(SIGNAL)和槽(SLOT)關(guān)聯(lián)起來(lái)的核心函數(shù),本文給大家介紹Qt中connect()函數(shù),感興趣的朋友跟隨小編一起看看吧
    2024-07-07

最新評(píng)論

修水县| 凯里市| 高要市| 大化| 金乡县| 东港市| 洪江市| 织金县| 延长县| 巢湖市| 镇巴县| 稷山县| 彭州市| 新营市| 婺源县| 乌拉特后旗| 开鲁县| 虞城县| 梁平县| 扶余县| 乐业县| 县级市| 馆陶县| 北京市| 绥德县| 兴安盟| 嘉鱼县| 临清市| 岳阳市| 前郭尔| 拉孜县| 西藏| 青铜峡市| 皋兰县| 大竹县| 赣榆县| 兴和县| 西吉县| 霞浦县| 丰台区| 大埔县|