c++顺序表

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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值