顺序表的基本操作

(1)输出顺序表中的所有元素;
(2)按序号查找指定元素,即输出顺序表中的第i个元素;
(3)按值查找指定元素,即输出顺序表中值为x的元素的序号;
(4)在指定位置插入元素,即在第i个元素前面插入值为x的元素;
(5)删除指定元素,即删除第i个元素;
(6)删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
(7)单值化操作,即删除表中重复元素中的多余元素,只保留其中序号最小的一个,例如,顺序表(2,4,4,3,2,4)单值化后的结果为(2,4,3);
(8)简单划分操作,即将顺序表 (a1,a2,… ,an) 重新排列为以指定元素a1为界的两部分:a1前面的值均小于等于a1,a1后面的值均大于a1;
(9)采用直接插入法将顺序表排列为升序序列,参见教材P236对直接插入排序法基本操作步骤的讲解;
(10)销毁顺序表并退出。

/*
	要实现的操作
	(1)输出顺序表中的所有元素;
	(2)按序号查找指定元素,即输出顺序表中的第i个元素;
	(3)按值查找指定元素,即输出顺序表中值为x的元素的序号;
	(4)在指定位置插入元素,即在第i个元素前面插入值为x的元素;
	(5)删除指定元素,即删除第i个元素;
	(6)删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
	(7)单值化操作,即删除表中重复元素中的多余元素,只保留其中序号最小的一个,例如,顺序表(2,4,4,3,2,4)单值化后的结果为(2,4,3);
	(8)简单划分操作,即将顺序表 (a1,a2,... ,an) 重新排列为以指定元素a1为界的两部分:a1前面的值均小于等于a1,a1后面的值均大于a1;
	(9)采用直接插入法将顺序表排列为升序序列,参见教材P236对直接插入排序法基本操作步骤的讲解;
	(10)销毁顺序表并退出。
*/

#include<iostream>
#include<vector>

using namespace std;

typedef int Status;
typedef int ElemType;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//定义线性表结构
typedef struct {
	ElemType* Link;
	int length;
}Sqlist;


Status Init(Sqlist& QL);
Status Create(Sqlist& QL, int length);

Status Display(const Sqlist& QL);
Status GetElem(const Sqlist& QL, ElemType& e, int index);
Status LocateElem(const Sqlist& QL, ElemType e, int& index);
Status Insert(Sqlist& QL, ElemType e, int index);
Status Delete(Sqlist& QL, int index);
Status DeleteAll(Sqlist& QL, ElemType value, ElemType value2);
Status Uniform(Sqlist& QL);
Status Division(Sqlist& QL, int index);
Status InsertSort(Sqlist& QL);
Status Destroy(Sqlist& QL);
Status GetLength(const Sqlist& QL, ElemType& e);
Status IsEmpty(const Sqlist& QL);
Status IsFull(const Sqlist& QL);

int main()
{
	int index, length;
	ElemType e;
	//创建顺序表并初始化
	Sqlist L;
	Init(L);
	cout << "请您输入线性表的长度";
	cin >> length;
	Create(L, length);
	cout << "----------------------------------------\n";
	int key = 1;
	while (key != 10)
	{
		
		cout << "欢迎使用线性表\n"
		     << "请您输入您要执行的操作\n"
			 << "1 输出顺序表中所有元素\n"
			 << "2 按序号查找指定元素,即输出顺序表的第i个元素\n"
			 << "3 按值查找指定元素,即输出顺序表中值为x的元素的序号\n"
			 << "4 在指定位置插入元素,即在第i个元素前面插入值为x的元素;\n"
			 << "5 删除指定元素,即删除第i个元素;\n"	
			 << "6 删除顺序表中所有值在[x,y]范围内的元素\n"
			 << "7 单值化操作,即删除表中重复元素中的多余元素,只保留其中序号最小的一个;\n"
			 << "8 简单划分操作,即将顺序表 (a1,a2,... ,an) 重新排列为以指定元素"
			 << "a1为界的两部分。a1前面的值均小于等于a1,a1后面的值均大于a1\n"
			 << "9 升序排序。\n"
			 << "10 销毁顺序表并退出。\n"
			 << "----------------------------------------\n";

		cin >> key;
		switch (key)
		{
		case 1:
			Display(L); 
			break;
		case 2:
			cout << "请您输入您想要取的元素下标__\b\b";
			cin >> index;
			if (GetElem(L, e, index)) {
				cout <<"第" << index <<"个元素为" <<e << endl;
			}
			break;
		case 3:
			cout << "请输入您想要查找的元素__\b\b";
			cin >> e;
			if (LocateElem(L, e, index)) {
				cout << "您查找的元素下标在:" << index << endl;
			}
			break;
		case 4:
			cout << "请您输入您要插入的位置和元素,以空格分割__\b\b";
			cin >> index >> e;
			Insert(L, e, index);
			cout << "在" << index << "位置插入" << e << "之后的结果\n";
			Display(L); 
			break;
		case 5:
			cout << "请您输入您要删除的位置__\b\b";
			cin >> index;
			Delete(L, index);
			cout << "在" << index << "位置删除元素之后的结果\n";
			Display(L);
			break;
		case 6:
			ElemType value1, value2;
			cout << "请您输入要删除的值范围[x,y],以空格分开";
			cin >> value1 >> value2;
			DeleteAll(L, value1, value2);
			cout << "删除" << value1 << "和" << value2 << "之间的值之后的结果\n";
			Display(L);
			break;
		case 7:
			Uniform(L);
			cout << "单值化之后的结果\n";
			Display(L);
			break;
		case 8:
			cout << "请您输入指定元素的下标";
			cin >> index;
			Division(L, index);
			cout << "以" << index << "为下标简单划分之后的结果\n";
			Display(L);
			break;
		case 9:
			InsertSort(L);
			cout << "升序排序之后的结果\n";
			Display(L);
			break;
		case 10:
			Destroy(L);
			cout << "Bye!\n"; break;
		default:
			cout << "请您输入正确的操作\n";
			break;
		}

		cout << "----------------------------------------\n";
	}
	return 0;
}


Status Init(Sqlist& QL)
{
	QL.Link = new ElemType[MAXSIZE];
	if (!QL.Link)
	{
		return OVERFLOW;
	}
	QL.length = 0;
	return OK;
}

Status Create(Sqlist& QL, int length)
{
	QL.length = length;
	if (QL.length > MAXSIZE)
	{
		cout << "溢出\n";
		QL.length = 0;
		return OVERFLOW;
	}

	if (QL.length < 0)
	{
		cout << "输入长度不可以为负数\n";
		QL.length = 0;
		return ERROR;
	}

	cout << "请输入顺序表内的元素";
	for (int i = 0; i < QL.length; i++)
	{
		cin >> QL.Link[i];
	}
	return OK;
}

Status IsEmpty(const Sqlist& QL)
{
	if (QL.length == 0)
	{
		cout << "顺序表为空\n";
		return true;
	}
	else
	{
		return false;
	}
}

Status IsFull(const Sqlist& QL)
{
	if (QL.length == MAXSIZE)
	{
		cout << "顺序表已满\n";
		return true;
	}
	else
	{
		return false;
	}
}

Status Display(const Sqlist& QL)
{
	if (IsEmpty(QL))
	{
		return ERROR;
	}

	for (int i = 0; i < QL.length; i++)
	{
		cout << QL.Link[i] << ' ';
	}
	cout << endl;
	return OK;
}

Status GetElem(const Sqlist& QL, ElemType& e, int index)
{

	if (index > QL.length)
	{
		cout << "超过顺序表长度\n";
		return ERROR;
	}

	if (index < 0)
	{
		cout << "下标不应该为负数\n";
		return ERROR;
	}

	//这里想要想要取得的元素是客户指出的,但是顺序表中的首个元素是从0开始
	e = QL.Link[index - 1];
	return OK;
}

Status LocateElem(const Sqlist& QL, ElemType e, int& index)
{
	if (IsEmpty(QL))
	{
		return ERROR;
	}

	for (int i = 0; i < QL.length; i++)
	{
		if (QL.Link[i] == e)
		{
			index = i + 1;
			return OK;
		}
	}

	cout << "未找到该元素\n";
	return ERROR;
}

Status Insert(Sqlist& QL, ElemType e, int index)
{
	if (IsFull(QL))
	{
		return ERROR;
	}

	if (index < 0 || index>QL.length + 1)
	{
		cout << "插入位置不合理\n";
		return ERROR;
	}
	QL.Link[QL.length] = 0;
	for (int k = QL.length; k >= index; k--)
	{
		QL.Link[k] = QL.Link[k - 1];
	}
	QL.Link[index - 1] = e;
	QL.length++;
	return OK;
}

Status Delete(Sqlist& QL, int index)
{
	if (IsEmpty(QL))
	{
		return ERROR;
	}

	if (index > QL.length || index <= 0)
	{
		cout << "删除位置不合理\n";
		return ERROR;
	}

	for (int k = index - 1; k < QL.length - 1; k++)
	{
		QL.Link[k] = QL.Link[k + 1];
	}
	QL.length--;
	return OK;
}

Status GetLength(const Sqlist& QL, ElemType& e)
{
	e = QL.length;
	return OK;
}

Status DeleteAll(Sqlist& QL, ElemType value1, ElemType value2)
{
	if (IsEmpty(QL))
	{
		return ERROR;
	}

	ElemType temp1 = min(value1, value2);
	ElemType temp2 = max(value1, value2);
	int len;
	int k = 0;
	GetLength(QL, len);
	for (int i = 0; i < len; i++)
	{
		QL.Link[i-k] = QL.Link[i];
		if (QL.Link[i] >= temp1 && QL.Link[i] <= temp2)
		{
			k++;
		}
	}
	QL.length -= k;
	return OK;
}

//将重复的元素只保留第一个元素
Status Uniform(Sqlist& QL)
{
	if (IsEmpty(QL))
	{
		return ERROR;
	}

	int len;
	GetLength(QL, len);

	vector<int> book(len);
	int i,j ,k = 0;
	for (i = 0; i < len; i++)
	{

		QL.Link[i - k] = QL.Link[i];
		for (j = 0; j < book.size(); j++)
		{
			if (QL.Link[i] == book[j])
			{
				k++;
				break;
			}
		}
		if (j == book.size())
		{
			book.push_back(QL.Link[i]);
		}
	}
	QL.length -= k;
	return OK;
}

//前小后大
Status Division(Sqlist& QL, int index)
{
	if (IsEmpty(QL))
	{
		return OK;
	}

	if (index > QL.length)
	{
		cout << "Index超过顺序表长度";
		return ERROR;
	}
	int i = 0, j = QL.length;
	int key = QL.Link[index - 1];
	while (i!=j)
	{
		while(QL.Link[i]<key&&i!=j)
		{
			i++;
		}

		if (i != j)
		{
			QL.Link[j] = QL.Link[i];
			j--;
		}

		while (QL.Link[j] > key && i != j)
		{
			j--;
		}

		if (i != j)
		{
			QL.Link[i] = QL.Link[j];
			i++;
		}
	}
	QL.Link[i] = key;
	return OK;
}

//升序排列
Status InsertSort(Sqlist& QL)
{
	if (IsEmpty(QL))
	{
		return ERROR;
	}

	for (int i = 1; i < QL.length; i++)
	{
		ElemType key = QL.Link[i];
		int j = i-1;
		while (QL.Link[j]>key&&j>=0)
		{
			QL.Link[j+1] = QL.Link[j];
			j--;
		}
		QL.Link[j+1] = key;
	}
	return OK;
}

Status Destroy(Sqlist& QL)
{
	delete[] QL.Link;
	QL.length = 0;
	return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下坠丷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值