顺序表的各种操作实现(属于是很严格的按书上的标准写了)

这篇博客介绍了如何使用C++实现线性表的各种操作,包括初始化、创建、判断是否为空、是否为满、获取元素、遍历、查找、插入、删除、获取长度、更新值和销毁等。还提供了主函数调用来演示这些操作的使用。代码中特别注意了用户输入的下标需转换为实际数组下标,并在适当位置进行了错误检查。
摘要由CSDN通过智能技术生成

因为自我感觉各种变量起的名字都很明显,函数名也很标准就没怎么写注释,其实主要是我懒。
所有的由用户输入的下标都是现实下标,而非数组中的下标,故而使用时都需要index-1;

头文件

/*
	要实现的操作
	1初始化
	2创建
	3判断是否为空
	4判断是否为满
	5返回指定的元素
	6遍历顺序表
	7查找指定元素
	8在指定下标插入指定元素
	9删除指定下标元素
	10返回顺序表的长度
	11修改顺序表指定下标的值为指定元素
	12销毁顺序表
*/
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

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 IsEmpty(const Sqlist& QL);
Status IsFull(const Sqlist& QL);
Status GetElem(const Sqlist& QL,ElemType &e,int index);
Status Display(const Sqlist& QL);
Status LocateElem(const Sqlist& QL,ElemType e,int &index);
Status Insert(Sqlist& QL,ElemType e,int index);
Status Delete(Sqlist& QL,int index);
Status GetLength(const Sqlist& QL,ElemType &e);
Status UpadteValue(Sqlist& QL, ElemType e, int index);
Status Destroy(Sqlist& QL);

头文件各种函数的实现

#include"Sqlist.h"

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 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 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 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 UpadteValue(Sqlist& QL, ElemType e, int index)
{
	if (IsEmpty(QL))
	{
		return ERROR;
	}

	if (index > QL.length)
	{
		cout << "下标超出链表长度\n";
		return ERROR;
	}

	QL.Link[index - 1] = e;
	return OK;
}

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

主函数各种调用

#include"Sqlist.h"
int main()
{
	char key = 'a';
	cout << "----------------------------------------\n";
	cout << "欢迎使用线性表\n";
	Sqlist L;
	ElemType e;
	int index, length;
	while (key != 'q')
	{
		cout << "请您输入您要执行的操作\n"
			 << " a初始化		b创建\n"
			 << " c判断是否为空		d判断是否为满\n"
			 << " e返回指定的元素	f遍历顺序表\n"
			 << " g查找指定元素		h在指定位置插入指定元素\n"
			 << " i删除指定的元素	j返回链表的长度\n"
			 << " k修改链表指定下标的值	l销毁链表\n"
			 << " q退出\n"
			 << "----------------------------------------\n";
		cin >> key;
		switch (key)
		{
		case 'a':
			Init(L); break;
		case 'b':
			cout << "请您输入线性表的长度";
			cin >> length;
			Create(L, length); break;
		case 'c':
			if (!IsEmpty(L))
			{
				cout << "非空\n";
			}break;
		case 'd':
			if (!IsFull(L))
			{
				cout << "未满\n";
			}
			 break;
		case 'e':
			cout << "请您输入您想要取的元素下标__\b\b";
			cin >> index;
			if (GetElem(L, e, index)) {
				cout << e << endl;
			}
			break;
		case 'f':
			Display(L); break;
		case 'g':
			cout << "请输入您想要查找的元素__\b\b";
			cin >> e;
			if (LocateElem(L, e, index)) {
				cout << "您查找的元素下标在:" << index << endl;
			}
			break;
		case'h':
			cout << "请您输入您要插入的位置__\b\b";
			cin >> index;
			cout << "请您输入您要插入的元素__\b\b";
			cin >> e;
			Insert(L, e, index); break;
		case 'i':
			cout << "请您输入您要删除的位置__\b\b";
			cin >> index;
			Delete(L, index); break;
		case 'j':
			GetLength(L, length);
			cout << "顺序表的长度为:" << length << endl; break;
		case 'k':
			cout << "请您输入您要修改的位置__\b\b";
			cin >> index;
			cout << "请您输入想要修改的值__\b\b";
			cin >> e;
			UpadteValue(L, e, index); break;
		case 'l':
			Destroy(L); break;
		case 'q':
			cout << "Bye!"; break;
		default:
			cout << "请您输入正确的操作\n";
			break;
		}
		cout << "----------------------------------------\n";

	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

下坠丷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值