线性表的顺序存储——C++实现

线性表的顺序存储——C++实现

线性表的顺序存储结构通过数组来实现

可以有多个函数,重点是增、删、查、改,具体可分为以下几个部分:
①构造、析构函数 ②判断是否为空、清空数组、遍历数组
③在指定位置插入元素④删除指定位置的元素⑤修改指定位置的元素
⑥查找指定下标元素、查找指定元素返回该元素的下标、查找指定元素的前驱和后继元素
⑦倒置数组⑧对数组进行排序

头文件如下:

typedef int Elem;//这里就是方便随时对类型进行更改,提高代码复用性
class List 
{
public:
	List(int size);//构造函数
	~List();//析构函数
	bool is_empty();//判断是否为空
	void insert(Elem arr[],Elem len);//导入一个数组中的所有元素
	void show();//遍历数组中的元素
	Elem length();//获取数组长度
	void sortarr();//对数组进行排序
	void inversion();//对数组元素进行倒置
	bool isempty();//判断数组是否为空
	bool insert_i(Elem i, Elem e);//向指定位置i插入数据e
	bool erease(Elem i);//删除指定位置i的元素
	int find_index(Elem e);//查找指定元素e的下标
	Elem find_data(int i);//查找指定下标i的元素
	Elem find_frontdata(Elem currentelem);//查找一个元素的前驱元素
	Elem find_nextdata(Elem currentelem);//查找一个元素的后继元素
	void clearlist();//清空线性表
private:
	Elem m_length;//这个变量是线性表的长度
	Elem m_size;//这个变量是线性表的容量:容量一定不小于长度
	Elem* m_ptr;//这个指针变量指向该线性表,方便对其进行操作
};

具体实现如下

#include<iostream>
#include"test0.h"
using namespace std;
List::List(Elem size)//构造函数
{
	cout << "这是线性表L1的构造函数" << endl;
	this->m_size = size;//传入的参数是数组的容量,最多能够包含多少元素
	this->m_ptr = new Elem[size];//在堆区new一块内存,用指针m_ptr维护它
	this->m_length = 0;//初始化数组的长度为0,里面没有东西
}
List::~List()//析构函数
{
	cout << "这是线性表L1的析构函数" << endl;
	delete m_ptr;//堆区内存由程序员手动释放
	m_ptr = NULL;//让指针指向空
}
bool List::is_empty()//判断数组是否为空
{
	if (m_length == 0)
		return true;
	else return false;
}
void List::insert(Elem arr[],Elem len)//传入一个数组中所有的元素
{
	for (int i = 0; i < len; i++)
	{
		m_ptr[i] = arr[i];
		m_length++;
	}
}
void List::show()//遍历数组中的元素
{
	for (int i = 0; i < m_length; i++)
	{
		cout << m_ptr[i] << " ";
	}
	cout << endl;
}
Elem List::length()//输出数组的长度
{
	return m_length;
}
void List::sortarr()//用冒泡排序实现升序排序
//这里注意要修改的是指针m_ptr指向的数据,而不是直接修改数组中的元素
//因为这是在堆区新new的线性表,虽然和原始数组存放的数据是一样的,但是存储的位置不同
{
	for (int i = 0; i < m_length-1; i++)
	{
		for (int j = 0; j < m_length-i-1; j++)
		{
			if (m_ptr[j] > m_ptr[j+1])
			{
				int temp = m_ptr[j];
				m_ptr[j] = m_ptr[j + 1];
				m_ptr[j + 1] = temp;
			}
		}
	}
}
void List::inversion()//对数组元素进行倒置
{
	if (m_length == 0)
	{
		cout << "线性表为空,无法倒置" << endl;
	}
	else
	{
		int i = 0; int j = m_length - 1;
		while (i < j)
		{
			int temp = m_ptr[i];
			m_ptr[i] = m_ptr[j];
			m_ptr[j] = temp;
			i++;
			j--;
		}
	}	
}
bool List::isempty()
{
	if (m_length == 0)
		return true;
	else return false;
}
bool List::insert_i(Elem i, Elem e)//向指定位置i添加元素时
//从最后一个位置到位置i依次向后挪动一位
{
	if (i<0 || i>m_length)
		return false;
		for (int k = m_length - 1; k >= i; k--)//原位置i上的元素也要向后挪动
		{
			m_ptr[k + 1] = m_ptr[k];
		}
		m_ptr[i] = e;
		m_length++;
		return true;
}
bool List::erease(Elem i)//从指定位置i删除元素时
//要从i开始到最后一个位置上的元素依次向前挪动一位
{
	if (i<0 || i>m_length)
	{
		return false;
	}
	for (int k = i; k < m_length; k++)
	{
		m_ptr[k] = m_ptr[k + 1];
	}
	m_length--;
	return true;
}
int List::find_index(Elem e)//查找指定元素的索引下标
{
	for (int i = 0; i < m_length; i++)
	{
		if (m_ptr[i] == e)
			return i;	
	}
	 return -1; 
}
Elem List::find_data(int i)//查找指定下标i上的元素
{
	if (i<0 || i>m_length)
	{
		return -1;
	}
	return m_ptr[i];
}
Elem List::find_frontdata(Elem currentelem)//查找一个元素的前驱元素
{
	int temp = find_index(currentelem);
	Elem frontelem;
	if (temp == 0||temp==-1)
		return -1;
	else 
	{
		frontelem = m_ptr[temp - 1];
	}
	return frontelem;
}
Elem List::find_nextdata(Elem currentelem)//查找一个元素的后继元素
{
	int temp = find_index(currentelem);
	Elem nextelem;
	if (temp == 0 || temp == m_length - 1)
	{
		return -1;
	}
	else
	{
		nextelem = m_ptr[temp + 1];
	}
	return nextelem;
}
void List::clearlist()//清空线性表
{
	m_length = 0;
}
int main()
{
	List l1(10);//创建一个List
	bool ret=l1.is_empty();
	if (ret)
	{
		cout << "线性表为空" << endl;
	}
	else 
	{
		cout << "线性表不为空" << endl;
	}
	Elem arr[8] = { 1,3,7,6,8,5,2,4 };
	int len = sizeof(arr) / sizeof(arr[0]);
	l1.insert(arr,len);
	l1.show();
	Elem count=l1.length();//count代表数组的长度(数组中元素的个数)
	cout << "数组的长度为:" << count << endl;
	l1.sortarr();
	l1.show();
	l1.inversion();
	l1.show();
	bool ans=l1.isempty();
	if (ans)
	{
		cout << "线性表为空" << endl;
	}
	else
	{
		cout << "线性表不为空" << endl;
	}
	l1.erease(3);
	l1.show();
	l1.insert_i(3, 1998);
	l1.show();
	int index=l1.find_index(1998);
	cout << "元素所在的位置为:" << index << endl;
	int data=l1.find_data(3);
	cout << "该位置上的元素为" << data << endl;
	int frontdata=l1.find_frontdata(1998);
	cout << "前驱元素为" << frontdata << endl;
	int nextdata=l1.find_nextdata(1998);
	cout << "后继元素为" << nextdata << endl;
	l1.clearlist();
	system("pause");
	return 0;
}

大家一起努力学数据结构呀!冲!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值