C++顺序表的基本操作(使用模版类)

本文实例为大家分享了C++顺序表的基本操作,供大家参考,具体内容如下

一、遇到问题:

原因:类的函数定义不能放在SeqList.cpp中,必须放在Seqlist.h(类的函数声明和定义放在同一个文件下)中,否则

会出现以下问题。

二、实现程序:

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); // 构造函数
 SeqList(SeqList<T>& 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(); // 排序
 SeqList<T> operator=(SeqList<T>& L); // 表整体赋值
private:
 T *data; // 存放数组
 int maxSize; // 最大可容纳表项的项数
 int last; // 当前已存表项的最后位置(从0开始)
 void reSize(int newSize); // 改变数组空间大小
};

template <class T>
SeqList<T>::SeqList(int sz) {
 // 构造函数,通过指定参数sz定义数组的长度
 if(sz > 0) {
 maxSize = sz;
 last = -1; // 置表的实际长度为空
 data = new T[maxSize]; // 创建顺序表存储数组
 if(data == NULL) {
 cerr << "动态内存分配失败!" << endl;
 exit(1);
 }
 }
}

template <class T>
SeqList<T>::SeqList(SeqList<T>& 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;
 }
}

template <class T>
SeqList<T>::~SeqList() {
 // 析构函数
 delete []data;
}

template <class T>
void SeqList<T>::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; // 复制新数组:数据和内存空间
 }
}

template <class T>
int SeqList<T>::Size(){
 // 计算表最大可容纳表项个数
 return maxSize;
}

template <class T>
int SeqList<T>::Length(){
 // 计算表长度
 return last+1;
}

template <class T>
int SeqList<T>::Search(T x){
 // 搜索x在表中位置,函数返回表项序号:在表中的第几个位置;搜索失败:返回0
 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个表项,函数返回第i(1<= i <= last+1)个表项的位置,否则函数返回-1,表示定位失败
 if(i >= 1 && i <= last+1)
 return i-1; // 数组下标从0开始
 return -1;
}

template <class T>
bool SeqList<T>::getData(int i, T& x){
 // 取第i个表项的值
 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个表项的值
 if(i > 0 && i <= last+1)
 data[i-1] = x;
}

template <class T>
bool SeqList<T>::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; // 插入成功
}

template <class T>
bool SeqList<T>::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; // 删除成功
}

template <class T>
bool SeqList<T>::isEmpty(){
 // 判断表是否为空,空则返回true;否则,返回false
 return (last == -1 ? true : false);
}

template <class T>
bool SeqList<T>::isFull(){
 // 判断表满否,满则返回true;否则,返回false
 return (last == maxSize-1 ? true : false);
}

template <class T>
void SeqList<T>::Input() {
 // 从标准输入(键盘)逐个数据输入,建立顺序表
 int len;
 cout << "开始建立顺序表,请输入表中元素个数:";
 cin >> len;
 if(len > maxSize) {
 cout << "表元素个数输入有误,范围不超过:" << maxSize << endl;
 return;
 }
 last = len - 1; // 数组最后位置
 cout << "请输入建表的数据:" << endl;
 for(int i = 0; i <= last; i++) // 逐个输入表元素
 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++) { // 最后一个不用排了
 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;
 }

}

template <class T>
SeqList<T> SeqList<T>::operator=(SeqList<T>& 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 */

2.main.cpp

#include "SeqList.h"
using namespace std;

int main(int argc, const char * argv[]) {
 int choose, len, i, x, maxSize, loc; // val存储值,choose存储用户的选择
 bool finished = false;

 SeqList<int> L; // 声明SeqList对象
 while(!finished) {
 cout << "1:输入数据建立顺序表:" << endl;
 cout << "2:顺序表的最大可容纳表项个数:" << endl;
 cout << "3:顺序表的长度:" << endl;
 cout << "4:搜索x在表中的位置:" << endl;
 cout << "5:定位第i个表项:" << endl;
 cout << "6:取第i个表项的值:" << endl;
 cout << "7:用x修改第i个表项的值:" << endl;
 cout << "8:在第i个表项后插入元素x:" << endl;
 cout << "9:删除第i个表项:" << endl;
 cout << "10:判断表是否为空:" << endl;
 cout << "11:判断表满否:" << endl;
 cout << "12:打印顺序表中的数据:" << endl;
 cout << "13:将顺序表排序:" << endl;
 cout << "14:退出:" << endl;
 cout << "请输入你的选择[1-14]:" << endl;
 cin >> choose;
 switch(choose) {
 case 1:
 L.Input(); // 建立顺序表
 break;
 case 2:
 maxSize = L.Size();
 cout << "顺序表的最大可容纳表项个数为:" << maxSize << endl;
 break;
 case 3:
 len = L.Length();
 cout << "顺序表的长度为:" << len << endl;
 break;
 case 4:
 cout << "请输入要搜索的值x:";
 cin >> x;
 i = L.Search(x);
 if(i == 0)
  cout << "没找到" << x << endl;
 else
  cout << x << "在表中的第" << i << "个位置" << endl;
 break;
 case 5:
 cout << "请输入要定位的位置i:";
 cin >> i;
 loc = L.Locate(i);
 if(loc != -1)
  cout << "定位成功!在顺序表中下标为:" << loc << endl;
 else
  cout << "定位失败!" << endl;
 break;
 case 6:
 cout << "请输入要取表中元素的位置i:";
 cin >> i;
 if(L.getData(i, x))
  cout << "表中第" << i << "个表项的值为:" << x << endl;
 else
  cout << "取值失败!检查是否超范围取值" << endl;
 break;
 case 7:
 cout << "请输入要修改的位置i和值x:";
 cin >> i >> x;
 L.setData(i, x);
 break;
 case 8:
 cout << "请输入要插入的位置i和值x:";
 cin >> i >> x;
 if(L.Insert(i, x))
  cout << "插入成功!" << endl;
 else
  cout << "插入失败!" << endl;
 break;
 case 9:
 cout << "请输入要删除的表项的位置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 << "表满!" << endl;
 else
  cout << "表未满!" << endl;
 break;
 case 12:
 cout << "表中的数据为:" << endl;
 L.Output();
 break;
 case 13:
 cout << "表中的数据排序前:" << endl;
 L.Output();
 L.Sort();
 cout << "表中的数据排序后:" << endl;
 L.Output();
 break;
 case 14:
 finished = true;
 break;
 default:
 cout << "输入选择错误,请重新输入!" << endl;
 }
 }
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++顺序表的实例代码

    本文实例为大家分享了C++实现顺序表的具体代码,供大家参考,具体内容如下 #include <iostream> using namespace std; typedef int DataType; class SeqList { public: SeqList() :_a(NULL) , _size(0) , _capacity(0) {} SeqList(const SeqList& s) :_a(new DataType[s._size]) , _size(s._size) ,

  • 如何在C++中建立一个顺序表

    准备数据 复制代码 代码如下: #define MAXLEN 100 //定义顺序表的最大长度struct DATA{ char key[10]; //结点的关键字  char name[20]; int age;};struct SLType //定义顺序表结构 { DATA ListData[MAXLEN+1];//保存顺序表的结构数组 int ListLen;   //顺序表已存结点的数量 }; 定义了顺序表的最大长度MAXLEN.顺序表数据元素的类型DATA以及顺序表的数据结构SLTyp

  • C++实现顺序表的方法

    废话不多说了,直接给大家上关键代码了. #pragma once #include <assert.h> template<class T> class SeqList { public: SeqList() :_a(NULL) ,_size(1) ,_capacity(1) {} SeqList(T* a, size_t size) :_a(new T[size]) ,_size(size) ,_capacity(size) { for (size_t i = 0; i <

  • 利用C++简单实现顺序表和单链表的示例代码

    本文主要给大家介绍了关于C++实现顺序表和单链表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 一.顺序表示例代码: #include <assert.h> #include <iostream> using namespace std; typedef int Datatype; class SeqList { public: SeqList() :_array(NULL) ,_size(0) ,_capacity(0) { } SeqList(const

  • C++实现顺序表的常用操作(插入删出查找输出)

    实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include<iostream> using namespace std; #define MAXSIZE 15 typedef int DataType; typedef struct { DataType data[MAXSIZE]; //通常用一位数组来描述顺序表的数据存储 int SeqLength; /*线性表长度*/ } SeqList; SeqList *Init

  • C++顺序表的基本操作(使用模版类)

    本文实例为大家分享了C++顺序表的基本操作,供大家参考,具体内容如下 一.遇到问题: 原因:类的函数定义不能放在SeqList.cpp中,必须放在Seqlist.h(类的函数声明和定义放在同一个文件下)中,否则 会出现以下问题. 二.实现程序: 1.SeqList.h #ifndef SeqList_h #define SeqList_h #include <iostream> using namespace std; const int defaultSize = 100; template

  • C++顺序表的基本操作实现

    目录 1.顺序表的定义 2.顺序表上基本操作的实现 完整代码如下: 总结 1.顺序表的定义 线性表的顺序存储又称顺序表.它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻.第1个元素存储在线性表的起始位置,第i个元素的存储位置后面紧邻这存储的是第i+1个元素,称 i 为元素ai在线性表中的位序.因此,顺序表的特点是表中元素的逻辑顺序和物理顺序相同. 假定线性表中的元素类型为ElemType,则线性表的顺序存储为 #define ElemType

  • C语言实现顺序表的基本操作的示例详解

    目录 一.认识顺序表 1.线性表 2.顺序表的概念及结构 二.顺序表的基本操作(接口实现) 1.初始化顺序表 2.打印顺序表 3.尾插 4.尾删 5.扩容 6.头插 7.头删 8.任意位置插入 9.任意位置删除 10.查找某个数的位置 三.顺序表演示及代码(含源码) 1.演示效果 2.完整源代码 一.认识顺序表 1.线性表 线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表有顺序表.链表.栈.队列.字符串……线性表在逻辑上是线性结构,也就是说是一条

  • c语言实现顺序表的基本操作

    数据结构顺序表操作 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <malloc.h>#define LIST_INIT_SIZE 100#define LISINCREMENT 10#define ElemType int#define Status inttypedef struct Sq{ ElemType *elem; int length; int listsize;}SqList;Statu

  • 详解Python数据结构与算法中的顺序表

    目录 0. 学习目标 1. 线性表的顺序存储结构 1.1 顺序表基本概念 1.2 顺序表的优缺点 1.3 动态顺序表 2. 顺序表的实现 2.1 顺序表的初始化 2.2 获取顺序表长度 2.3 读取指定位置元素 2.4 查找指定元素 2.5 在指定位置插入新元素 2.6 删除指定位置元素 2.7 其它一些有用的操作 3. 顺序表应用 3.1 顺序表应用示例 3.2 利用顺序表基本操作实现复杂操作 0. 学习目标 线性表在计算机中的表示可以采用多种方法,采用不同存储方法的线性表也有着不同的名称和特

  • Java实现顺序表的增删查改功能

    创建顺序表 在java语言中要实现顺序表,首先创建一个类,因为顺序表本身就像数组,所以我们这里定义一个int类型的数组和usedata为有效数据,构造方法里先申请可以存放10个数据的空间. public class MyArraylist1 { public int[] elem;//存储数据的有效个数 public int usedata;//有效数据的个数 //构造方法 public MyArraylist1() { this.elem = new int[10]; } 主要实现以下方法 p

  • C语言动态顺序表实例代码

    目录 顺序表概念: 一.准备工作 二.顺序表的基本操作  1.顺序表的初始化函数 2.尾插函数(在尾部插入数据) 3.头插函数(在数组头部插入数据)  4.尾删函数 5.头删函数 6.在第pos的位置插入数据 7.删除第pos个位置的数据 8.修改第pos个位置的数据 9.查找函数. 10.销毁函数 11.打印函数 三.总代码: 顺序表概念:         顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构.一般情况下用数组存储.在数组上完成数据的增删查改. 代码解析: 一.准备工

  • Java实现顺序表的操作

    本文实例为大家分享了Java实现顺序表的基本操作,供大家参考,具体内容如下 静态顺序表:使用定长数组存储.动态顺序表:使用动态开辟的数组存储. 接口 package com.github.sqlist; public interface ISequence {     // 在 pos 位置插入 val     boolean add(int pos, Object data);     // 查找关键字 key 找到返回 key 的下表,没有返回 -1     int search(Objec

  • Java数据结构之顺序表篇

    目录 一.线性表 二.顺序表 1.概念及结构 2.顺序表的实现 打印顺序表 获取顺序表的有效长度 在pos位置新增元素 判断是否包含某个元素 查找某个元素对应的位置 获取/查找pos位置的元素 给pos位置的元素设为value 删除第一次出现的关键字key 清空顺序表 3.顺序表的优.缺点 三.顺序表的实现代码汇总 一.线性表 线性表( linear list ) 是 n 个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见 的线性表:顺序表.链表.栈.队列.字符串

  • C语言的线性表之顺序表你了解吗

    目录 线性表 —— 顺序表 (C语言) 1. 顺序表的储存结构 2. 顺序表的基本操作 2.1 顺序表的插入 2.2 顺序表的查找 2.3 顺序表的删除 总结 线性表 —— 顺序表 (C语言) 概念 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表中的数据元素,这种表示也称做线性表的顺序储存结构或顺序映像.通常,称这种存储结构的线性表为顺序表 (Sequential List) .其特点是,逻辑上相邻的数据元素,其物理次序也是相邻的. 1. 顺序表的储存结构 #include <st

随机推荐