c++中的顺序表写法,主要实现(增删查改,构造函数,运算符重载)

本文的内容主要是,利用c++写出顺序表,并对写出的代码进行测试,

主要实现的功能:实现对顺序表的增删查改,

要写的函数:构造函数,赋值运算符重载,析构函数。在编写代码过程中应注意到深浅拷贝问题。

下面是顺序表的类函数:

#pragma once

#include<iostream>
using namespace std;

typedef int DataType;

class SeqList
{
public:
	SeqList();
	SeqList(DataType *array, size_t size);
	SeqList(const SeqList &s); //现代写法
	SeqList &operator=(SeqList s);
	~SeqList();
	void PushBack(DataType x);
	void PopBack();
	void PushFount(DataType x);
	void PopFount();
	void Insert(size_t pos, DataType x);
	void Erase(size_t pos);
	int Find(DataType x);
	void PrintSeqList();
	void _CheekCapacity();

private:
	DataType *_array;
	size_t _size;
	size_t _capaci;
};

上面列举了,顺序表类,和其中包含的函数。

接下来介绍这各个函数:

构造函数,有两个(函数重载):

SeqList::SeqList()
:_array(NULL),
_size(0),
_capaci(0)
{}

SeqList::SeqList(DataType *array, size_t size)

: _array(new DataType[size]),

_size(size),

_capaci(size)

{

memcpy(_array, array, sizeof(DataType)*size);

}

拷贝构造函数:(两个,分别是不同的拷贝方法)

//SeqList::SeqList(const SeqList& s)  //传统写法
//	:_array(new DataType[s._size]),
//	_size(s._size),
//	_capaci(s._size)
//{
//	memcpy(_array, s._array, sizeof(DataType)*_size);
//}

SeqList::SeqList(const SeqList &s) //现代写法
:_array(NULL)
{
	SeqList temp(s._array, s._size);
	swap(_array, temp._array);
	_size = s._size;
	_capaci = s._capaci;
}

赋值运算符重载:(两个,分别是不同的拷贝方法)

SeqList&	SeqList::operator=(SeqList s)
{
	swap(s._array, _array);
	_size = s._size;
	_capaci = s._capaci;
	//swap(_size,s._size);
	//swap(_capaci,s._capaci);
	return *this;
}

//SeqList& SeqList::operator=(const SeqList s)
//{
//	if (this != &s)
//	{
//		DataType *temp = new DataType[s._size];
//		delete[]_array;
//		_array = temp;
//		_size = s._size;
//		_capaci = s._size;
//		memcpy(_array, s._array, sizeof(DataType)*_size);
//	}
//	return *this;
//}

析构函数:

SeqList::~SeqList()
{
	if (_array)
	{
		delete[] _array;
	}
}

检查顺序表容量的函数:

void SeqList::_CheekCapacity()
{
	if (_size >= _capaci)
	{
		_capaci = 2 * _capaci + 3;
		_array = (DataType*)realloc(_array, _capaci*sizeof(DataType));
	}
}

插入数据函数:(三个,分别是前插、后插、给定位置插入)

void SeqList::PushFount(DataType x)
{
	_CheekCapacity();
	for (int i = _size; i > 0; i--)
	{
		_array[i] = _array[i - 1];
	}
	_array[0] = x;
	_size++;
}

void SeqList::PushBack(DataType x)
{
	_CheekCapacity();
	_array[_size] = x;
	_size++;
}

void SeqList::Insert(size_t pos, DataType x)
{
	_CheekCapacity();
	if (pos<_size)
	for (int i = _size; i > _size - pos; i--)
	{
		_array[i] = _array[i - 1];
	}
	_array[pos - 1] = x;
	_size++;
}

删除数据函数(三个,分别是前删、后删、给定位置删除)

void SeqList::PopFount()
{
	if (_size == 0)
	{
		cout << "空链表" << endl;
	}
	for (int i = 0; i < _size - 1; i++)
	{
		_array[i] = _array[i + 1];
	}
	_size--;
}

void SeqList::PopBack()
{
	if (_size > 0)
	{
		_size--;
	}
}

void SeqList::Erase(size_t pos)
{
	if (_size == 0)
	{
		cout << "空链表,无需删除!" << endl;
	}
	for (int i = pos; i < _size; i++)
	{
		_array[i - 1] = _array[i];
	}
	_size--;
}

查找数据(返回此数据在顺序表中的位置)

int SeqList::Find(DataType x)
{
	if (_size == 0)
	{
		cout << "空链表!" << endl;
	}
	for (int i = 0; i < _size; i++)
	{
		if (x == _array[i])
		{
			return i + 1;
		}
	}
	return -1;
}

还有一个函数就是打印链表,此部分是最直接的观察

void SeqList::PrintSeqList()
{
	for (int i = 0; i < (int)_size; i++)
		cout << _array[i] << "  ";
	cout << endl;
}

当然还有测试用例,主函数,

#include "SeqLinkList.h"

void Test1()   //顺序表测试
{
	SeqList s1;  //前插
	s1.PushBack(1);
	s1.PushBack(2);
	s1.PushBack(3);
	s1.PushBack(4);
	//s1.PopBack();
	//s1.PopFount();
	//s1.PushFount(4);
	//s1.PushFount(1);
	s1.Insert(3, 5);
	//s1.Erase(3);
	s1.Insert(3, 6);
	cout << "s1 = ";
	s1.PrintSeqList();
	SeqList s2(s1);
	cout << "拷贝构造  s2 = ";
	s2.PrintSeqList();
	SeqList s3;
	s3 = s1;
	cout << "赋值运算符重载  s3 = ";
	s3.PrintSeqList();
	//int let = s1.Find(6);
	//cout << "6 是第"<<let <<"个数"<< endl;
}

int main()
{
	Test1();
	system("pause");
	return 0;
}

小弟是初学者,如果哪位大神发现代码中有错误或需要改进的地方,请您指正,只有发现了自己的错误才能进步,谢谢

时间: 2024-07-29 01:02:05

c++中的顺序表写法,主要实现(增删查改,构造函数,运算符重载)的相关文章

用VC++操作ACESS数据库(创建数据库、建立新表、连接、增删查改)

转载http://liheng19870711.blog.163.com/blog/static/8716802201121724528232/进行修改 用VC++操作ACESS数据库(创建数据库.建立新表.连接.增删查改) 首先在StdAfx.h中包含如下头文件#import "C:\Program Files\Common Files\system\ado\msadox.dll"  // 创建数据库必用#import"C:\Program Files\Common Fil

SQLite在Android程序中的使用方法,SQLite的增删查改方法

Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序中使用SQLite的语句来创建数据库,并实现数据库的增删查改 SQLite的简单使用方法: 如何获得一个数据库的class模板,并设定数据库里的数据结构: 自己新建一个类,继承SQLiteOpenHelper,并重写构造方法,oncreate(),onUpgrade() 自定义类的代码实现方法和构造

在Android中利用SQLite实现对数据的增删查改

停更了一天,I'm back again~~当我们需要操作大量的数据时,我们首先想到的当然是数据库,因为可以通过简单的语句实现数据的增删改查,在Android中,我们不使用SQL或者ORACLE,我们使用SQLite,因为它占用资源更少,而语句格式与SQL语句一样. 首先,我们来在Android中实现数据库的创建与增删改查,引用数据库的类时,不再继承常用的Activity类,而是继承Android中的SQLiteOpenHelper,创建一个构造方法,四个参数分别是(Context contex

6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pattern-and-dep/ 系列目录: Relationship in Entity Framework Using Code First Approach With Fluent API[[使用EF Code-First方式和Fluent API来探讨EF中的关系]] Code First Mig

5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pattern-and-uni/ 系列目录: Relationship in Entity Framework Using Code First Approach With Fluent API[[使用EF Code-First方式和Fluent API来探讨EF中的关系]] Code First Mig

小猪的数据结构辅助教程——2.1 线性表中的顺序表

小猪的数据结构辅助教程--2.1 线性表中的顺序表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.抽象数据类型(ADT)的概念,三要素:数据,数据元素间的关系和数据的操作 2.线性表的特点:按照一条线排列的数据集合,1对1,除了首元和尾元,其他元素都有直接前驱和直接后继 3.牢记线性表的存储结构,要理解并熟悉12个基本操作的逻辑,最好能徒手撕出代码 4.求并集,顺序表的经典例子,必须掌握! 1.抽象的数据类型 简单点说: 抽象:有点像我们面向对象语言中的类的思想,将事物

C++实现静态顺序表的增删查改以及初始化

C++实现静态顺序表的增删查改 顺序表:用一段地址连续的存储单元依s次存储数据元素的线性结构,是线性表的一种. //SeqList.h #pragma once #include <assert.h> #include <string.h> #define MAX_SIZE 5 typedef int DataType; //定义顺序表结构体 typedef struct SeqList { DataType array[MAX_SIZE];  //数据块数组 size_t siz

在MVC程序中,使用泛型仓储模式和工作单元实现增删查改

在这片文章中,我将自己动手为所有的实体:写一个泛型仓储类,还有一个工作单元. 工作单元的职责就是:为每一个实体,创建仓储实例.仓储(仓库)的职责:增删查改的功能实现. 我们将会在控制器中,创建工作单元类(UnitOfWork)的实例,然后根据实体,创建仓储实例,再就是使用仓储里面的方法,做操作了. 下面的图中,解释了,仓储和EF 数据上文的关系,在这个图里面,MVC控制器和仓储之间的交互,是通过工作单元来进行的,而不是直接和EF接触. 那么你可能就要问了,为什么要使用工作单元??? 工作单元,就

4.CRUD Operations Using the Repository Pattern in MVC【在MVC中使用仓储模式进行增删查改】

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 上一篇文章,讲到了MVC中基本的增删查改,这篇文章,我会继续说到,使用仓储模式,进行增删查改. 什么是仓储模式呢,我们先来了解一下:  仓储模式是为了在程序的数据访问层和业务逻辑层之间创建一个抽象层,它是一种数据访问模式,提供了一种更松散耦合的数据访问方法.我们把创建数据访问的逻辑代码写在单独的类中,或者类库中