线性表的顺序存储——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;
}