c++顺序表的基本操作
下面是代码
//头文件
#include<iostream>
using namespace std;
#define max 20 //顺序表能存储的最大容量
typedef int datatype;
class node { //创建结点类
public:
datatype data;
};
class sqlist { //创建顺序表类
private:
node * elem;//基地址
int length;//顺序表长度
public:
sqlist();//初始化
~sqlist();//销毁顺序表
void creat_list(int n);//创建一个顺序表
int len_list();// 顺序表长度
bool isfull();//判满
bool isempty();//判空
void headinsert(datatype e);//头插法
void tailinsert(datatype e);//尾插法
void insert_list(int i, datatype e);//根据下标插入数据
void dele_list(int i);//根据下标删除数据
int find_list(datatype e);//查找数据,并返回下标
void dele_all();// 删除所有数据
void printf_list();//打印顺序表
void sort();//由小到大排序
};
//.cpp文件
``#include"sqlist_self.h"
//初始化顺序表
sqlist::sqlist()
{
elem = new node[max]; //开辟空间
if (!elem)
{
exit(1); //分配内存失败
}
length = 0; //定义顺序表长度为0
}
//销毁顺序表
sqlist::~sqlist()
{
if (elem)
{
delete elem;
elem = NULL;
}
length = 0;
}
//创建一个顺序表
void sqlist::creat_list(int n)
{
for (int i = 0; i < n; i++)
{
if (n < 0)
cout << "输入的结点个数有误" << endl;
else if (n > max)
cout << "输入结点数超过最大长度20" << endl;
else {
cout << "请输入第" << i + 1 << "个元素" << endl;
cin >> elem[i].data;
}
}
length = n;
}
// 返回顺序表长度
int sqlist::len_list()
{
return length;
}
//判满
bool sqlist::isfull()
{
return length == max; //长度等于最大长度,表示顺序表已满,返回true
}
//判空
bool sqlist::isempty()
{
return length == 0; //长度为0,说明顺序表为空,返回true
}
//头插法,将e插入表首
void sqlist::headinsert(datatype e)
{
if (isfull())
{
cout << "元素已满,不可插入" << endl;
}
else
{
for (int i = length - 1; i >= 0; i--) //将所有元素向后移一位,先移最后一位,即elem[length-1]
{
elem[i + 1] = elem[i];
}
elem[0].data = e; //第一个位置空出,将e赋值
length++; //长度+1
}
}
//尾插法
void sqlist::tailinsert(datatype e)
{
if (isfull())
{
cout << "元素已满,不可插入" << endl;
}
else
{
elem[length].data = e; //直接在尾部插入
length++; //长度+1
}
}
//根据下标插入数据
void sqlist::insert_list(int i, datatype e)
{
if (isfull())
cout << "元素已满,不可插入" << endl;
else if (i > length || i < 1)
cout << "输入的下标超出范围" << endl;
else {
for (int j = length-1; j >= i - 1; j++)//循环到要插入的结点位置
{
elem[j + 1] = elem[j]; //向后移一位
}
elem[i - 1].data = e;
length++;
}
}
//根据下标删除数据
void sqlist::dele_list(int i)
{
if (i > length || i < 1)
cout << "输入的下标超出范围" << endl;
else {
for (int j=i; j <=length - 1; j++)//从要删除的结点位置的后一个结点,依次向前移一位
{
elem[j - 1] = elem[j];
}
length--;
}
}
//查找数据,并返回下标
int sqlist::find_list(datatype e)
{
for (int i = 0; i <= length - 1;i++)//遍历整个顺序表
{
if (elem&&elem[i].data == e)
return i + 1; //找到返回下标
else if(i == length - 1) { //否则返回-1
return -1;
}
}
}
// 删除所有数据
void sqlist::dele_all()
{
length = 0; //长度为0,顺序表为空
}
//由小到大排序,冒泡排序
void sqlist::sort()
{
for (int i = 0; i <length - 1; i++) //排序的趟数(例如5个数据需要比较4趟)
{
for (int j = 0; j < length - 1 - i; j++)//每一趟比较中的比较次数(例如5个数据在第0趟需要比较4次)
{
if (elem[j].data > elem[j + 1].data)
{
int temp = elem[j].data;
elem[j].data = elem[j + 1].data;
elem[j + 1].data = temp;
}
}
}
}
//打印顺序表
void sqlist::printf_list()
{
cout << "顺序表为" << endl;
for (int i = 0; i < length; i++)
{
cout << elem[i].data << " " ;
}
}
主函数测试
```cpp
#include"sqlist_self.h"
int main()
{
sqlist l;
int select=0;
cout << "*****1.创建一个顺序表 *****" << endl << "*****2.寻找要查询的元素的下标***** " << endl
<< "*****3.通过下标插入元素 *****" << endl << "*****4.通过下标删除一个元素 ***** " << endl
<< "*****5 获取顺序表的长度 *****" << endl << "*****6.删除所有元素 ***** " << endl
<< "*****7.判断顺序表是否为空 *****" << endl << "*****8.判断顺序表是否满 ***** " << endl
<< "*****9.在头部插入数据 *****" << endl << "*****10.在尾部插入数据 ***** " << endl
<< "***** 0. 退出 *****" << endl << "*****11.遍历顺序表 ***** " << endl;
do
{
cout << "请选择一个操作: ";
cin >> select;
switch (select)
{
case 1:
int n;
cout << "请输入顺序表的元素个数: ";
cin >> n;
l.creat_list(n);
break;
case 2:
int finddata;
cout << "请输入将要查找元素的值: ";
cin >> finddata;
cout << "该元素的下标为:" << l.find_list(finddata) << endl;
break;
case 3:
int index;
int insertData;
cout << "请输入要插入的数据的位置: ";
cin >> index;
cout << "请输入要插入的数据: ";
cin >> insertData;
l.insert_list(index, insertData);
break;
case 4:
int deletedata;
cout << "请输入要删除的数据的下标: ";
cin >> deletedata;
l.dele_list(deletedata);
break;
case 5:
cout << l.len_list() << endl;
break;
case 6:
l.dele_all();
break;
case 7:
if (l.isempty() == 1) {
cout << "顺序表为空" << endl;
}
else
{
cout << "顺序表不为空" << endl;
}
break;
case 8:
if (l.isfull() == 1) {
cout << "顺序表满" << endl;
}
else
{
cout << "顺序表不满" << endl;
}
break;
case 9:
int insertdata2;
cout << "请输入要在头部插入的数据: ";
cin >> insertdata2;
l.headinsert(insertdata2);
break;
case 10:
int insertdata3;
cout << "请输入要在末尾插入的数据: ";
cin >> insertdata3;
l.tailinsert(insertdata3);
break;
case 11:
l.printf_list();
break;
default:
break;
}
} while ( select!= 0);
system("pause");
return 0;
}