C++语言实现线性表之数组实例_C 语言

本文实例讲述了C++语言实现线性表之数组。分享给大家供大家参考。具体分析如下:

感觉用C++中的构造函数、析构函数等类的特点来描述一些数据结构更加易读,更加合理,便捷。但有一个问题,编译器不支持模板的分离编译,很不舒服

#include <iostream>
using namespace std;
template<class T>
class CArray
{
public:
 CArray(const int &iMax);
 CArray();
 ~CArray();
 void Create(const int &iMax);
 void Destroy();
 void Print();
 bool IsEmpty();
 bool IsFull();
 void Append(const T &data);
 int GetLength();
 int GetMax();
 bool Delete(const int &pos);
 bool Insert(const int &pos,const T &data);
 void operator+=(const T &data);
private:
 T *m_pArray;
 int m_len;
 int m_max;
 void Reset();
};
template<class T>
CArray<T>::CArray(const int &iMax)
{
 Create(iMax);
}
template<class T>
CArray<T>::~CArray()
{
 Destroy();
}
template<class T>
void CArray<T>::Create(const int &iMax)
{
 m_pArray = new T[iMax];
 m_max = iMax;
 m_len = 0;
 memset(m_pArray,0,sizeof(m_pArray));
}
template<class T>
void CArray<T>::Destroy()
{
 delete [] m_pArray;
}
template<class T>
void CArray<T>::Print()
{
 if(IsEmpty())
 {
  cout<<"没有数据!"<<endl;
 }
 else
 {
  for(int ix =0 ; ix < m_len ; ++ix)
  {
   cout<<m_pArray[ix]<<",";
  }
  cout<<endl;
 }
}
template<class T>
bool CArray<T>::IsEmpty()
{
 if(0 == m_len)
 {
  return true;
 }
 else
 {
  return false;
 }
}
template<class T>
bool CArray<T>::IsFull()
{
 if(m_len == m_max)
 {
  Reset();
  return false;
 }
 else
 {
  return false;
 }
}
template<class T>
void CArray<T>::Append(const T &data)
{
 if(!IsFull())
 {
  ++m_len;
  m_pArray[m_len - 1] = data;
 }
}
template<class T>
int CArray<T>::GetLength()
{
 return m_len;
}
template<class T>
bool CArray<T>::Delete(const int &pos)
{
 if(pos > m_len || pos <= 0)
 {
  cout<<"位置不合法"<<endl;
  return false;
 }
 for(int ix = pos - 1 ; ix < m_len - 1 ; ++ ix)
 {
  m_pArray[ix] = m_pArray[ix + 1];
 }
 --m_len;
 return true;
}
template<class T>
void CArray<T>::operator+=(const T &data)
{
 this->Append(data);
}
template<class T>
bool CArray<T>::Insert(const int &pos,const T &data)
{
 if(IsFull())
 {
  return false;
 }
 else
 {
  for(int ix = m_len - 1 ; ix >= pos - 1 ; -- ix)
  {
   m_pArray[ix + 1] = m_pArray[ix];
  }
  m_pArray[pos - 1] = data;
  ++m_len;
  return true;
 }
}
template<class T>
CArray<T>::CArray()
{
 Create(5);
}
template<class T>
void CArray<T>::Reset()
{
 T *pT = new T[m_max * 2];
 memset(pT,0,sizeof(pT));
 for(int ix = 0 ; ix < m_len ; ++ ix)
 {
  pT[ix] = m_pArray[ix];
 }
 delete [] m_pArray;

 m_pArray = pT;
 m_max = m_max * 2;
}
template<class T>
int CArray<T>::GetMax()
{
 return m_max;
}

希望本文所述对大家的C++程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, 线性表
c++语言
线性表c语言实现、顺序线性表c语言实现、线性表adt的c语言实现、go语言实现socket实例、c语言用数组实现栈,以便于您获取更多的相关知识。

时间: 2024-08-17 01:16:27

C++语言实现线性表之数组实例_C 语言的相关文章

c语言实现词频统计的简单实例_C 语言

需求: 1.设计一个词频统计软件,统计给定英文文章的单词频率. 2.文章中包含的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为是跨专业0.0···并不会c++和java,只能用仅学过的C语言进行编写,还是挺费劲的. 2.定义一个包含单词和频率两个成员的结构体来统计词频(进行了动态分配内存,可以处理较大文本). 3.使用fopen函数读取指定的文档. 4.使用fgetc函数获取字符,再根据取得的字符是否是字母进行不同的处理. 5.采用快速排序法对统计结果进行排序. 5

C语言实现的程序员老黄历实例_C 语言

本文实例讲述了C语言实现的程序员老黄历.分享给大家供大家参考.具体如下: 以前看到过一个jquery程序员老黄历页面,觉得挺有创意的,自己闲着用C语言也写了一个,基本就是随机数的生成,没什么难度,大家随便看看,高手请绕过此篇,控制台程序没什么美观可言,已经尽量弄得好看点了. #include <stdio.h> #include <time.h> int random(int dayseed,int indexseed) //根据当前时间"天 "产生伪随机数.

C语言 二叉树的链式存储实例_C 语言

二叉树的链式存储 实现二叉树的基本操作:建立.遍历.计算深度.结点数.叶子数等. 输入C,先序创建二叉树,#表示空节点: 输入H:计算二叉树的高度: 输入L:计算二叉树的叶子个数: 输入N:计算二叉树节点总个数: 输入1:先序遍历二叉树: 输入2:中序遍历二叉树: 输入3:后续遍历二叉树: 输入F:查找值=x的节点的个数: 输入P:以缩格文本形式输出所有节点. 很简单就不需要多解释了,代码贴上 #include <stdio.h> #include <stdlib.h> #incl

c语言 字符串转大写的简单实例_C 语言

复制代码 代码如下: #include <string.h> #include <stdio.h> #include <ctype.h> #include <stdlib.h> int main(void) {    int length, i;    char string[20]= "this is a string";    length = strlen(string);    for (i=0; i<length; i++

C++归并算法实例_C 语言

本文实例讲述了C++归并算法.分享给大家供大家参考.具体如下: /* 归并算法:把两个或两个以上的线性表合并在一起,形成一个新的线性表 函数模版的基本使用 程序意图:将两个相同类型的线性表元素排好序,然后将他们组合成一个排好的线性表 */ #include <iostream> using namespace std; const int n = 5; //5个元素 //输出数据元素 template <class T1> void OutPut(T1 out[(2*n)]) {

c语言-【线性表问题】线性表创建时的一点问题

问题描述 [线性表问题]线性表创建时的一点问题 typedef struct{ int *data; int length; }sqlist; void init_list(sqlist *l){ (*l).data=(int *)malloc(3*sizeof(int)); if(!(*l).data)printf("error!"); (*l).length=0; } int *data;和(*l).data=(int *)malloc(3*sizeof(int));,这两句话的意

C++动态数组类的封装实例_C 语言

C++中的动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构造函数.拷贝构造函数.拷贝赋值运算符.析构函数).运算符的重载.涉及到的知识点很多,对此本文只做简单的介绍. 一.内存分配策略 当用new为一个动态数组申请一块内存时,数组中的元素是连续存储的,例如 vector和string.当向一个动态数组添加元素时,如果没有空间容纳新元素,不可能简单

C语言输出旋转后数组中的最小数元素的算法原理与实例_C 语言

  问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.      思路:这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(n).但这个思路没有利用输入数组的特性.既然有时间复杂度更小的算法,我们容易想到二分查找,因为它的时间复杂度为O(logn).这个问题是否可以运用二分查找呢

对C语言中指针的理解与其基础使用实例_C 语言

C语言的指针,关键意思在于"指". "指"是什么意思? 其实完全可以理解为指示的意思.比如,有一个物体,我们称之为A.正是这个物体,有了这么个称谓,我们才能够进行脱离这个物体的实体而进行一系列的交流.将一个物体的指示,是对这个物体的抽象.有了这种抽象能力,才有所谓的智慧和文明.所以这就是"指示"这种抽象方法的威力. 退化到C语言的指针,指针是一段数据/指令(在冯诺易曼体系中,二者是相通,在同一空间中的)的指示.这是指示,也就是这段数据/指令的起始