顺序表的实现Visual Studio 2017 C++

一、顺序表类模板(LinearList.h)

#pragma once
template
class LinearList
{
public:
	LinearList(int LLMaxSize)//构造函数,创建空表
	{
		MaxSize = LLMaxSize;
		element = new T[LLMaxSize];
		length = 0;
	}
	LinearList()//析构函数,删除表
	{
		delete[]element;
	}
	LinearList& Insert(int k, const T &x)//在第k个位置插入元素x,返回插入后的线性表
	{
		if (k<1 || k>length + 1)
		{
			cout << "元素下标越界,添加元素失败" << endl;
		}
		else
			if (length == MaxSize)
			{
				cout << "此表已满,无法添加新元素" << endl;
			}
			else
			{
				for (int i = length; i > k - 1; i--)
				{
					element[i] = element[i - 1];//移动元素
				}
				element[k - 1] = x;//插入元素
				length++;//表长+1
			}
		return *this;
	}
	bool IsEmpty() const//判断表是否为空,表空返回true,表非空返回false
	{
		return length == 0;
	}
	int GetLength() const//返回表中数据元素的个数
	{
		return length;
	}
	bool GetData(int k, T &x)//将表中第k个元素保存到x中,不存在返回false
	{
		if (k<1 || k>length)
		{
			return false;
		}
		else
		{
			x = element[k - 1];
			return true;
		}
	}
	bool ModifyData(int k, const T &x)//将表中第k个元素修改为x,不存在则返回false
	{
		if (k<1 || k>length)
		{
			return false;
		}
		else
		{
			element[k - 1] = x;
			return true;
		}
	}
	int Find(const T&x)//返回x在表中的位置,如果x不在表中返回0
	{
		for (int i = 0; i < length; i++)
		{
			if (element[i] == x)
			{
				return i + 1;
			}
		}
		return 0;
	}
	LinearList & DeleteByIndex(int k, T&x)//删除表中第k个元素,并把它保存到x中,返回删除后的线性表
	{
		if (GetData(k, x))
		{
			for (int i = k - 1; i < length - 1; i++)
			{
				element[i] = element[i + 1];//移动元素
			}
			length--;
		}
		else
			cout << "元素下标越界,删除失败" << endl;
		return *this;
	}
	LinearList & DeleteByKey(const T& x, T& y)//删除表中关键字为x元素,返回删除后的线性表
	{
		int index = Find(x);//得到要删除的元素的位置
		if (index != 0)
			return DeleteByIndex(index, y);
		else
		{
			cout << "没有此元素,删除失败" << endl;
			return *this;
		}
	}
	void OutPut(ostream& out) const//将线性表放到输出流out中输出
	{
		for (int i = 0; i < length; i++)
		{
			out << element[i] << endl;
		}
	}
private:
	int length;
	int MaxSize;
	T *element;
};
//重载插入运算符<<
template
ostream&operator<<(ostream&out, const LinearList& x)
{
	x.OutPut(out);
	return out;
}

二、简单数据元素顺序表的应用问题(线性表的顺序存储.cpp)

#include
#include
using namespace std;
#include"LinearList.h"

int main()
{
	LinearListIntegerLList(10);//声明最多有10个以int为数据元素的顺序表对象
	int x, y;
	//依次插入100、200、300、400。。。
	IntegerLList.Insert(1, 100);
	IntegerLList.Insert(2, 200);
	IntegerLList.Insert(3, 300);
	IntegerLList.Insert(4, 400);
	cout << "当前表的长度为:" << IntegerLList.GetLength() << endl;
	cout << "当前表的元素为:\n" << IntegerLList << endl;
	//读取并输出表中第3个元素的值,判断元素100在表中的位置
	if (IntegerLList.GetData(3, x))
	{
		cout << "表中第3个元素为:" << x << endl;
	}
	x = 100;
	cout << "元素100在表中的位置为:" << IntegerLList.Find(x) << endl;
	//将100修改为150,删除200和400后,显示当前表的相关信息
	x = 150;
	IntegerLList.ModifyData(1, x);
	IntegerLList.DeleteByIndex(2, x);
	x = 400;
	IntegerLList.DeleteByIndex(x, y);
	cout << "当前表的长度为:" << IntegerLList.GetLength() << endl;
	cout << "当前表的元素为:\n" << IntegerLList << endl;

顺序表的实现Visual Studio 2017 C++_第1张图片

 

三、复杂数据元素顺序表的应用问题(Node.h Node.cpp)

#pragma once
#include
#include
using namespace std;
class Node
{
public:
	Node(string NumberOfStudent, string NameOfStudent, int grade[])
	{
		StdNumber = NumberOfStudent;
		StdName = NameOfStudent;
		for (int i = 0; i < 3; i++)
		{
			Score[i] = grade[i];
		}
	}
	Node()//无参构造函数
	{

	}
	Node& GetNode()//得到结点数据
	{
		return *this;
	}
	void OutPutNode(ostream& out) const//输出结点数据
	{
		out << StdNumber << " " << StdName << endl;
		out << "语文:" << Score[0]<<" ";
		out << "数学:" << Score[1]<<" ";
		out << "英语:" << Score[2]<<" ";
	}

private:
	string StdNumber;
	string StdName;
	int Score[3];
};

ostream& operator<<(ostream& out, const Node& x)
{
	x.OutPutNode(out);
	return out;
}

#include
#include
using namespace std;
#include"LinearList.h"
#include"Node.h"
int main()
{
	LinearListNodeLList(10);//最多有10个以Node对象为数据元素的顺序表
	int grade1[3] = { 99,100,95 };
	int grade2[3] = { 95,98,88 };
	int grade3[3] = { 90,90,90 };
	Node Node1("10001", "张三", grade1);
	Node Node2("10002", "李四", grade2);
	Node Node3("10003", "王五", grade3);
	Node x;
	//将两个结点插入表中
	NodeLList.Insert(1, Node1);
	NodeLList.Insert(2, Node2);
	//显示当前表的状态
	cout << "当前表的长度为:" << NodeLList.GetLength() << endl;
	cout << "当前表的元素为:\n" << NodeLList << endl;
	//将表中第2个元素输出
	NodeLList.GetData(2, x);
	cout << "表中第2个元素为:\n" << x << endl;
	//删除表中第2个元素,修改第一个元素的信息,显示当前表的状态
	NodeLList.DeleteByIndex(2, x);
	cout << "刚刚删除的元素为:\n" << x << endl;
	NodeLList.ModifyData(1, Node3);
	cout << "当前表的长度为:" << NodeLList.GetLength() << endl;
	cout << "当前表的元素为:\n" << NodeLList << endl;

	system("pause");
	return 0;
}

顺序表的实现Visual Studio 2017 C++_第2张图片

四、顺序表的特点和问题

 1、顺序表具有简单、存储密度大、空间利用效率高、存储效率高等优点。

2、在顺序表中进行插入与删除操作时,往往需要移动大量的数据元素,浪费时间。

3、在实际应用中由于顺序表的长度不好估计,往往需要为顺序表分配足够大的内存空间,造成浪费。

 所以,对于元素变动频繁、长度变化较大的线性表,不宜采用顺序存储结构。

你可能感兴趣的:(数据结构与算法,c++,visual,studio,数据结构,算法)