C++顺序表的实现(采用模板)

顺序表构建学生信息管理系统(C++) 顺序表构建学生管理系统–C++样例 对于本文的任何建议和问题都可留言,我们共同探讨,进步和提高。 上次编写了根据单链表进行构建学生管理系统的C++样例,本次使用顺序表进行构建。单链表与顺序表各有利弊,顺序表能够快速的进行定位,但是必须事先指定表的大小,不利于数据动态增减;而单链表可以有效的进行动态增减,但进行查询时需要进行遍历。两者之间的使用视实际情况而定。 阅读详情

(数组描述)采用模板

#ifndef CLinearList_
#define CLinearList_
#include<iostream.h>
template<class T>
 class CLinearList  
{
public:
	CLinearList(int MaxListSize=10); //构造函数
	virtual ~CLinearList();
	bool IsEmpty() const {return length== 0;}
    int Length() const {return length;} //返回当前元素个数
    bool Find(int k, T& x) const; //返回第k个元素保存至x中
    int Search(const T& x) const; // 返回x所在位置
	CLinearList<T>& Insert(int k, const T& x); // 在第k个位置插入x,从零开始算
	CLinearList<T>& Delete(int k, T& x);
   void Output(ostream& out) const;
private:
	int length;
    int MaxSize;
    T *element; // 一维动态数组

};

 template<class T> 
CLinearList<T>::CLinearList(int MaxListSize)// 基于公式的线性表的构造函数
{
  MaxSize = MaxListSize;
  element = new T[MaxSize];
  length =0;
}
template<class T>
bool CLinearList<T>::Find(int k, T& x) const
{ //把第k个元素取至x中
//如果不存在第k个元素则返回false,否则返回true
if (k<0 || k>length-1)  // 不存在第k个元素
return false;
x=element[k];
return true;
}

template<class T>
int CLinearList<T>::Search(const T& x) const  // 查找x,如果找到,则返回x所在的位置
{
// 如果x不在表中,则返回0
for (int i = 0; i < length; i++)
if (element[i] == x) return i;
return 0;
}
template<class T>
CLinearList<T>& CLinearList<T>::Delete(int k, T& x)
{// 把第k个元素放入x中,然后删除第k个元素
if (Find(k, x))
{
for (int i=k; i <length; i++)
element[i] = element[i+1];    // 把元素k+l, ...向前移动一个位置
length-- ;
return *this;
}
}

template<class T>
CLinearList<T>& CLinearList<T>::Insert(int k, const T& x)
{// 在第k个位置插入x

	if (k < 0 || k >MaxSize-1) 
		cout<<"位置不对!"<<endl;
	else if (length == MaxSize) 
		cout<<"超出数组最大长度!"<<endl;
	else
	{
	if(length!=0)
	{
    for (int i=length-1;i>=k; i--)
         element[i] = element[i-1];
	}
    element[k] = x;
    length++ ;
    
	}
	return *this;
}

template<class T>
void CLinearList<T>::Output(ostream& out) const   //把表输送至输出流 辅助函数,只要是为了重载<<,也可以用友元函数重载
{ 
for (int i = 0; i <length; i++)
out <<element[i] << " ";
}
// 重载<<
template <class T>
ostream& operator<<(ostream& out, const CLinearList<T>& x)
{
	x.Output(out);
	return out;
}
template<class T> 
CLinearList<T>::~CLinearList()
{
delete [] element;
}
#endif 


在主函数下调用:

#include "LinearList.h"
void main(void)
{
CLinearList<int> myList(5);
cout<<"线性表长度为:"<<myList.Length()<<endl;
cout << "IsEmpty =" << myList.IsEmpty()<<endl;
cout << "Length = " << myList.Length() << endl;
myList.Insert(0,2).Insert(1,10).Insert(2,49);

cout << "IsEmpty =" << myList.IsEmpty() << endl;
cout << "List is" <<myList<<endl;
cout << "Length = " << myList.Length() << endl;

int z;
myList.Find(1,z);
cout << "位置为1的元素为:" << z << endl;
myList.Delete(2,z);
cout << "Deleted element is"<< z << endl;
cout << "List is " << myList << endl;
cout << "Length = " << myList.Length() << endl;
}

运行结果:

注:在VC6.0中,模板类不支持分离编译,需要把模板类的定义与声明放同一个文件中才可以。


采用链表描述:


/* *******************************链表描述**************************************/

template<class T> class Chain; //加上Chain模板声明,不加出错
template <class T>
class ChainNode{
friend class Chain<T>;//保证了Chain<T>可以访问ChainNode<T>的所有成员,尤其是私有成员。
private:
T data;
ChainNode<T> *link;
};

/*
创建空的整型线性表Chain<int> L;

*/
template<class T>
class Chain {
  public:  
Chain() {first = 0;}
~Chain() ;
bool IsEmpty() const {return first == 0;}
int Length() const;
bool Find(int k, T& x) const;
int Search(const T& x) const;
Chain<T>& Delete(int k, T& x);
Chain<T>& Insert(int k, const T& x);
void Output(ostream& out) const;
void Erase();
Chain<T> & Append(const T& x);
private:
ChainNode<T> *first; // 指向第一个节点的指针
ChainNode<T> *last;
};


template<class T>
Chain<T>::~Chain()  //删除链表中的所有节点
{
	// 链表的析构函数,用于删除链表中的所有节点
ChainNode<T> *next; // 下一个节点
while (first) 
{
next = first->link;
 delete first;
 first = next;
}
}
template<class T>
int Chain<T>::Length() const    //返回链表中的元素总数 
{

ChainNode<T> *current = first;
int len = 0;
while (current) {
len++;
current = current->link;
}
return len;
}


template<class T>
bool Chain<T>::Find(int k, T& x) const
{// 寻找链表中的第k个元素,并将其传送至x
//如果不存在第k个元素,则返回f a l s e,否则返回t r u e
if (k < 1) return false;
ChainNode<T> *current = first;
int index = 1; // current的索引
while (index<k && current)
 {
current = current->link;
index++;
}
if (current) {x=current->data; return true;}
return false; //不存在第k个元素
}



template<class T>
int Chain<T>::Search(const T& x) const
{// 寻找x,如果发现x,则返回x的地址
//如果x不在链表中,则返回0
ChainNode<T> *current = first;
int index = 1; // current的索引
while (current && current->data!= x) {
current=current->link;
index++ ;
}
if (current) return index;
return 0;
}


template<class T>
void Chain<T>::Output(ostream& out) const
{// 将链表元素送至输出流
ChainNode<T> *current;
for (current=first; current; current = current->link)
out<<current->data<<" ";
}
//重载<<
template <class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{
	x.Output(out); 
	return out;
}

/*从链表中删除一个元素*/
template<class T>
Chain<T>& Chain<T>::Delete(int k, T& x) 
{// 把第k个元素取至x,然后从链表中删除第k个元素
//如果不存在第k个元素,则引发异常OutOfBounds
if (k < 1 || !first)
cout<<"不存在第K个元素"<<endl;  // 不存在第k个元素
// p最终将指向第k个节点
ChainNode<T> *p = first;
// 将p移动至第k个元素,并从链表中删除该元素
if (k == 1) // p已经指向第k个元素
first = first->link; // 删除之
else ( // 用q指向第k - 1个元素
ChainNode<T> *q = first;
for (int index = 1; index<k-1&&q; index++)
q = q->link;
if (!q || !q->link)
 cout<<"不存在第K个元素!"<<endl; //不存在第k个元素
p = q->link; // 存在第k个元素
if (p == last)
 last =q ;
q->link = p->link;) // 从链表中删除该元素
//保存第k个元素并释放节点p
x = p->data;
delete p;
return *this;
}

/*在链表中插入元素*/
template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{//在第k个元素之后插入x

if (k < 0)  cout<<"超出范围";
// p最终将指向第k个节点
ChainNode<T> *p = first;
//将p移动至第k个元素
for (int index = 1; index < k && p; index++)
p = p->link;
if (k > 0 && !p) tcout<<"不存在第K个元素"; //不存在第k个元素
// 插入
ChainNode<T> *y=new ChainNode<T>;
y->data = x;
if (k) {// 在p之后插入
y->link = p->link;
p->link = y;}
else {// 作为第一个元素插入
y->link = first;
first = y;}
if (!y->link)
last = y;
return *this;
}

template<class T>
void Chain<T>::Erase()
{ //删除链表中的所有节点
ChainNode<T> *next;
while (first) 
{
next = first->link;
delete first;
first = next;
}
}
template <class T>
Chain<T> & Chain<T>::Append(const T& x)
{ //在链表尾部添加x
ChainNode<T> *y;
y = new ChainNode<T>;
y->data = x; y->link = 0;
if (first)
 {//链表非空
last->link = y;
last= y;
}
else // 链表为空
first = last = y;
return *this;
}


 在主函数中调用如下:

#include "LinearList.h"
void main(void)
{
    cout<<"采用链表描述:"<<endl;
	Chain<int> myChain;
	myChain.Append(3).Append(10);
	cout<<"链表元素为:"<<myChain<<endl;
}


用c++实现 c++顺序表的实现(采用模板) 函数实现数据的插入(头插&&尾插)、删除(头删&&尾删)、查找、按位置插入、按位置删除、顺序表求长、顺序表清除、顺序表摧毁、数据的逆置以及数据排序   main函数 #include"SeqList.h"//顺序表 void main() { SeqList mylist; int select = 1; int Item; int pos; while(sele 阅读详情

相关推荐

C++ 类型萃取

一、功能 类型萃取,在STL中用到的比较多,用于判断一个变量是否为POD类型. 简述来说可以用来判断出某个变量是内置类型还是自定义类型. 通过类型萃取,萃取到变量类型,对不同变量进行不同处理,可以提升程序效率. 二、应用场景 比如我们实现顺序表,在对顺序表进行扩容时,就靠重新开辟内存、拷贝对象. 拷贝对象时,就有两种情况:一种是类型,比如int char…;还有一种是自定义类型,Data类、String类. 对于内置类型,我们可以通过memset,来进行赋值.(扩展,浅拷贝相关的类也可以通过memset赋值

芒种、的博客 358

C++数据结构之顺序表(模板类实现)

用模板类实现顺序表数据结构

sagjhdj的博客 2823

别再只会用QTcpSocket了!手把手教你用QSslSocket为你的Qt网络应用加上SSL/TLS加密(附完整代码示例)

本文详细介绍了如何将Qt网络应用从QTcpSocket迁移到QSslSocket,实现SSL/TLS加密传输。通过对比API差异、解析核心机制和提供完整代码示例,帮助开发者快速掌握安全网络编程技巧,有效防范数据窃听和中间人攻击等安全风险。

weixin_30654583的博客 400

C++模板类实现顺序表

#define _CRT_SECURE_NO_WARNINGS #include using namespace std; #include #define length 10 typedef int DataType; class Vector { public: // 构造函数 explicit Vector(size_t capacity = 100) //若不给

心之所向,一如既往 462

从一根USB线缆说起:深入浅出聊聊那些影响信号完整性和EMC性能的‘小细节’(双绞、屏蔽、360度搭接全解析)

本文深入探讨了USB线缆中影响信号完整性和EMC性能的关键细节,包括双绞线绞距、屏蔽层设计和360度搭接工艺。通过实验数据和实用技巧,揭示了这些‘小细节’如何显著影响高频信号质量和电磁兼容性,为工程师提供了从选购到系统设计的全面指南。

weixin_30824479的博客 437

基于深度学习的时间序列预测

深度学习在时间序列数据中应用广泛,学术界已经有很多深度学习模型来适应不同领域的时间序列数据集的多样性。那么到底有哪些基于深度学习的时间序列预测模型?他们的优缺点是什么?让我们一起来看一下。

Sharon0408的博客 6580

数据结构-顺序表-c++语言-模板类实现代码(附详细解释) _清风明月

数据结构-顺序表-c++语言-模板类实现代码(附详细解释) _清风明月

_清风明月的博客 1029

VScode搭建Opencv(C++开发环境)

VScode配置Opencv一、准备软件二 、下载软件1、MinGw下载2、 Cmake下载3、Opencv下载三、编译1、cmake-gui2、make3、install四、 VScode配置1、launch.json2、c_cpp_properties.json3、tasks.json五、测试 用了半天事件,看了各种的博客终于配置成功了,在这里记录并分享一下,让更多的人少走弯路。 本次环境是Win 10. 一、准备软件 我们本次用到的3个软件,(建议读者文件路径,文件版本 尽量都和我相同,这样不容易出错

河旬的博客 8万+

C++模板实现简单的链表和顺序表

从最初学习C语言到C++,就有一个认识就是作为一个优秀的程序猿一定要学会 ”偷懒“ ,用程序员的话来说就是复用,在C的基础上开发的C++就深刻阐明了这一道理,因为这样有太多的好处,增加了代码的可移植性,提高了可维护性。C++的模板就很有用,可以大大提高写代码的效率,同时优秀的代码总是最简洁最有效的代码。下面我们来用模板实现链表和顺序表。 顺序表 SeqList.h文件 #define _CR

blight_888的博客 625

RPA 财务共享中心与RPA赋能

在和集团财务官交流的时候,客户经常会提到FSSC,其中有准备建立FSSC,正在建立FSSC,以及已建成FSSC正使用的,当中会有些对FSSC的疑虑和问题,所以花费些时间对FSSC进行了深入调研,从而也有幸拜读了王兴山、陈剑、梅震、钱自严等专业人士写的几本关于FSSC的书,对FSSC的前因后果有了更深入的认识,同时结合自己在FSSC的一些项目经验,故做了本次分享。 本文章主要分享财务共享中心以及R...

weixin_40244959的博客 2756

别再死记硬背了!用‘小乌龟’实战图解ROS1核心指令(rosnode/rostopic/rosparam保姆级手册)

本文通过经典的turtlesim乌龟仿真器,以可视化实战方式讲解ROS1核心指令(rosnode/rostopic/rosparam),帮助初学者摆脱死记硬背,在操控乌龟的过程中轻松掌握节点管理、话题通信和参数设置等ROS1核心概念。

weixin_28731223的博客 370

数据结构:顺序表之C++模板类实现

C++模板类实现顺序表相较c语言实现, 表的创建和销毁可以构造与析构函数管理。 定义表的长度、容量以及内存数组可以用私有成员实现,替代c语言中的结构体定义。 c定义: 定义表的结构体 typedef struct _tag_SeqList { int length; int capacity; unsigned int **node; }TSeqList; 其二是在操作函...

baidu_35260565的博客 987

Electron多窗口开发避坑指南:Pinia状态同步的3种解决方案对比

本文深入探讨了在Electron多窗口应用中实现Pinia状态同步的三种核心方案。针对Electron多窗口架构下状态隔离的挑战,文章对比了基础事件通信、共享存储以及智能Pinia插件等方案的优劣与适用场景,并提供了生产级的实现指南与选型建议,帮助开发者构建健壮高效的桌面应用。

spice的博客 479

c++ 实现顺序表类(初始化、输入、插入与删除)<<计算机软件技术基础 徐士良>>

/* c++ 实现顺序表类(初始化、输入、插入与删除)> */ #include using namespace std; template class sq_LList { private: int mm;//容量 int nn;//长度 T *v; // 顺序表存储控件首地址 public: sq_LList(){mm = 0; nn = 0; return;} sq_LList

taotaoahui 4571

UNet改进(24):注意力机制-从基础原理到高级融合策略

本文系统探讨了如何通过引入各类注意力机制增强UNet在医学图像分割中的性能。文章分为基础篇、进阶篇和高级篇三个层级:基础篇介绍了时序注意力、可变形注意力、分层注意力等8种基础机制;进阶篇提出了5种混合注意力设计;高级篇则探讨了全局+局部+多尺度等复杂组合机制。实验表明,这些注意力模块在心脏MRI、肺部感染等任务中能提升2-15%的分割精度。文章还提供了硬件适配建议和完整实现代码,为研究者提供了全面的技术参考。未来方向包括NAS优化、量子注意力等前沿探索,为UNet在医疗影像等领域的应用革新提供了理论指导。

2501_91516851的博客 764

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++ 模板的问题

<br />如果一个含有模板的类声明在 .h 头文件里,如:<br /> <br />#ifndef SEQLIST_H_ #define SEQLIST_H_ #include <stdlib.h> #include <iostream> using namespace std; //typedef int T; template <class T> class SeqList { protected: T *list; int maxSize; int size; p

Kevin的专栏 1068

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

顺序表C++模板类封装

顺序表+泛型+类的封装+实现cpp

WSTONECH的博客 531

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构 顺序表(泛型编程)

顺序表 虽然之前写过顺序表,但是没用模板所以很不方便,于是这次补一个顺序表的模板,写得比较仓促也比较简单,虽然没有注释但应该不难懂 #pragma once #include <iostream> #define MAX_LIST_SIZE 20 using namespace std; enum Status { ERROR = 0, OK = 1 }; template<typename ElemType> struct SqList { ElemType data[MA

oowadanoko的博客 252

顺序表应用-学生学籍管理

学生学籍主要有: 每个学生的学号(唯一),姓名,性别,出生日期,地址等数据项构成数据元素 要完成如下 功能: 1、插入 2、删除 3、修改 4、查询 5、输出 考虑到学生学籍表一般只会在开学毕业会有增加或者删除操作,而平时会进行频繁的查找或者小部分修改,所以采用顺序表比较好。为学籍表设计一个模板类,类中包含存储学生的基本信息的顺序表以及在上面的操作成员函数。为每个学生涉及的数据建立

yanerhao的专栏 2675

C++ 线性表模板的使用

SeqList.h#pragma once #include <iostream>const int MAXSIZE = 100; template <class T> class SeqList { public: // 无参数的构造函数 SeqList(); //有参数的构造函数,使用含有n个元素的数组,并且长度为n SeqList(const T a[], in

迪迦 • 奥特曼 943

C++类型萃取

C++类型萃取1. 功能2. 应用场景3. 实现4. 代码 1. 功能   类型萃取,可以在模板中萃取到变量类型,对不同变量进行不同处理,可以提升程序效率.   也就是我根据你传递过来的类型,我再决定调用那种方法   在STL中用到的比较多,用于判断一个变量是否为POD类型.   简述来说可以用来判断出某个变量是内置类型还是自定义类型.    2. 应用场景   比如我们实现顺序表,在对顺序表进行扩容时,就靠重新开辟内存、拷贝对象.拷贝对象时,就有两种情况:一种是类型,比如int char…;还有一种是自定

Sunrise的博客 956

C++ 栈的声明与定义(顺序表法)

C++ 栈的声明

weixin_52017692的博客 2498

模板实现顺序表

一   :SeqList.h#pragma once #include&lt;iostream&gt; #include&lt;assert.h&gt; #include &lt;string&gt; using namespace std; template &lt;class T&gt; class SeqList { public: SeqList() :_a(NULL) , _...

baidu_37964044的博客 276

顺序表(C++类模板实现)

文章目录1. 用C++实现顺序表2. 代码 1. 用C++实现顺序表     本文用到C++中的类模板,用类模板的好处就是方便建立任何类型的顺序表。但类模板这里有个坑就是无法分离编译,具体原因可以百度搜索类模板无法分离编译。最后废话不多说,直接上代码。 2. 代码     sqlist.h文件实现顺序表的声明和定义 #ifndef SQLIST_H #define SQLIST_H #define INIT_SIZE 100 #

zws的博客 4751

c++实现顺序表的基本操作(类模板)

c++实现顺序表基本操作(类模板) 第二期 上次写的是单链表的基本操作,下面写一个比单链表简单的——顺序表,顺序表跟数组的关系非常密切 运用数组所学的知识可实现顺序表的功能 功能实现如下: ①:元素的插入 ②:元素的删除 ③:根据元素的位置输出元素值 ④:根据元素值定位查找元素位置 ⑤:实现顺序表元素的翻转 话不多说,上代码! #include<iostream> using name...

终成大师的博客 5634
上一篇: C++程序性能总结
下一篇: C++有关数组和指针,内存管理
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值