C++实现顺序表的14种操作

C++顺序表的操作

2017/12/27

 

// 顺序表.cpp: 定义控制台应用程序的入口点。
//Author:kgvito YinZongYao
//Date: 2017.12.27

#include<iostream>
using namespace std;

#define MAXSIZE 3
#define Node ElemType
#define ERROR 0
typedef int DataType;

//创建一个节点类
class Node                 
{
public:
	DataType data;
};

//创建一个顺序表类
class SqList               
{
public:
	SqList();     //初始化顺序表
	~SqList();    //销毁顺序表
	void CreateSqList(int n);       //定义创建一个顺序表
	void TraverseSqList();          //遍历顺序表
	ElemType GetElemByIndex(int i); //根据下标查找顺序表中的元素
	bool isEmpty();                 //判断顺序表是否为空
	bool isFull();                  //判断顺序表是否满
	int GetLength();                //获取顺序表的长度
	int GetElemByElem(DataType data);    //查看顺序表中是否含有查找的值
	void InsertSqList(int n, DataType data);     //向顺序表中插入新数据
	void InsertSqListAtHead(DataType data);      //在头部插入新数据
	void InsertSqListAtEnd(DataType data);       //向顺序表的最后插入数据
	void DeleteElem(int i);              //删除指定位置的值
	void DeleteElemAtElem(DataType data);//按值删除元素
	void DeleteAll();                    //删除所有元素
	void DeleteAtHead();                 //在头部删除元素
private:
	Node * elem;                  //顺序表的基地址
	int length;                   //顺序表的长度
};

//初始化顺序表
SqList::SqList()                  
{
	elem = new ElemType[MAXSIZE];   //开辟空间
	if (!elem) {                    //当溢出时报异常
		exit(OVERFLOW);
	}
	length = 0;                     //定义顺序表的长度
}

//销毁顺序表
SqList::~SqList()                  
{
	delete[] elem;   //删除基地址的指针
}

//创建顺序表
void SqList::CreateSqList(int n)
{
	if (n < 0) {                                //当输入的数值有误时报异常
		cout << "输入的节点个数有误!" << endl;
		exit(EXIT_FAILURE);
	}
	else {
		int i;
		for (i = 0; i < n;i++) {                //循环向数组中插入数据
			cout << "请输入第" << i + 1 << "个节点元素: ";
			cin>>elem[i].data;
		}
		length = n;                             //更改顺序表的长度
	}
}

//遍历顺序表
void SqList::TraverseSqList()
{
	for (int i = 0; i < length;i++) {           //循环打印顺序表的每个节点数据
		cout << "第" << i + 1 << "个元素的值是" << elem[i].data << endl;
	}
}

//通过下标获取元素
ElemType SqList::GetElemByIndex(int i)
{
	if (i < 1 || i > length) {       //下标输入有误时报异常
		cout << "查询的下标不存在" << endl;
	}
	else {
		return elem[i - 1];          //返回下标指定的节点
	}
}

//判断顺序表是否为空
bool SqList::isEmpty()
{
	if (length == 0)    //如果顺序表的长度为0,则表为空
		return true;
	return false;       //长度不为0,表不为空
}

//判断顺序表是否满
bool SqList::isFull()
{
	if (length == MAXSIZE)   //当长度为定义的最大长度,则顺序表满
		return true;
	return false;            //否则不满
}

//获取顺序表的长度
int SqList::GetLength()
{
	return length;     //返回顺序表的长度
}

//判断是否存在寻找的值,如果存在将返回下标
int SqList::GetElemByElem(DataType data)
{
	int i;
	for (i = 0; i < length;i++) {    //从头遍历顺序表
		if (elem && elem[i].data == data) {  //若找到与之匹配的数据,则返回当前节点的下标
			return i + 1;
		}
		if (i == length - 1) {       //否则返回-1
			return -1;
		}
			
	}
}

//插入一个数据
void SqList::InsertSqList(int i, DataType data)
{
	if (i<1 || i > length+1) {      //下标输入有误时报异常
		cout << "输入的下标不合法" << endl;
	}
	else if (length > MAXSIZE) {   //当顺序表满时无法插入新的数据
		cout << "已经达到最大长度" << endl;
	}
	else
	{
		for (int j = length - 1; j >= i - 1; j--) {   //遍历到要插入的位置
			elem[j + 1] = elem[j];     //从j位置后的全体数据向后移一位
		}
		elem[i - 1].data = data;       //插入数据
		length++;                      //更改顺序表长度
	}
}

//在头部插入一个新数据
void SqList::InsertSqListAtHead(DataType data)
{
	
	for (int i = length - 1; i >= 0; i--)  //将全体元素向后移一位
	{
		elem[i + 1] = elem[i];
	}
	elem[0].data = data;         //在第一个位置插入元素
	length++;                    //更改长度
}

//在顺序表的最后插入数据
void SqList::InsertSqListAtEnd(DataType data)
{
	if (length > MAXSIZE) {   //当顺序表满时无法插入新的数据
		cout << "已经达到最大长度" << endl;
	}
	else
	{
		elem[length].data = data;      //插入数据
		length++;                      //更改顺序表长度
	}
}

//根据下标删除一个节点
void SqList::DeleteElem(int i)
{
	int j;
	if (i<1 || i>length)           //输入的位置不合法报异常
		cout << "输入的下标不合法" << endl;
	else                           
	{
		for (j = i; j <= length - 1;j++) { //循环到要删除节点的位置
			elem[j - 1] = elem[j];         //该位置后的元素全体向前移一个位置
		}
		length--;                          //更改顺序表长度
	}
}

//按值删除元素
void SqList::DeleteElemAtElem(DataType data)
{
	int i = 0;
	while (elem[i].data != data && i < length)   //按值查到要删除数据的位置
	{
		i++;
	}
	for (int index = i; index <= length - 1; index++) //将该位置后的节点全体向前移一位
	{
		elem[index] = elem[index + 1];
	}
	length--;                              //更改顺序表长度
}

//删除所有元素
void SqList::DeleteAll()
{
	for (int i = length;i > 0;i--)    //从最后一个元素开始删除,长度减一
	{
		elem[i] = elem[i - 1];        //元素向前移位
		length--;                     //长度减一
	}
}

//在头部删除元素
void SqList::DeleteAtHead()
{
	for (int i = 1; i <= length - 1; i++) {
		elem[i - 1] = elem[i];
	}
	length--;
}

//测试函数
int main()
{
	SqList l;
	int i;
	cout << "1.创建一个顺序表   2.遍历顺序表   3.通过下标获取元素\n4.查找要查询的元素的下标   5.通过下标插入元素   6.通过下标删除一个元素\n7.获取顺序表的长度   8.删除所有元素   9.判断顺序表是否为空\n10.判断顺序表是否满   11.根据数据删除节点   12.在头部插入数据\n13.在头部删除数据   14.在顺序表最后插入数据   0.退出" << endl;
	do
	{
		cout << "请选择一个操作: " ;
		cin >> i;
		switch (i)
		{
		case 1:
			int n;
			cout << "请输入顺序表的元素个数: ";
			cin >> n;
			l.CreateSqList(n);
			break;
		case 2:
			l.TraverseSqList();
			break;
		case 3:
			int i;
			cout << "请输入将要获取元素的下标: ";
			cin >> i;
			ElemType getElemByIndex = l.GetElemByIndex(i);
			cout << getElemByIndex.data << endl;
			break;
		case 4:
			DataType data;
			cout << "请输入将要查找元素的值: ";
			cin >> data;
			cout<<"该元素的下标为:"<<l.GetElemByElem(data)<<endl;
			break;
		case 5:
			int index;
			DataType insertData;
			cout << "请输入要插入的数据的位置: ";
			cin >> index;
			cout << "请输入要插入的数据: ";
			cin >> insertData;
			l.InsertSqList(index, insertData);
			break;
		case 6:
			int deleteIndex;
			cout << "请输入要删除的数据的下标: ";
			cin >> deleteIndex;
			l.DeleteElem(deleteIndex);
			break;
		case 7:
			cout<<l.GetLength()<<endl;
			break;
		case 8:
			l.DeleteAll();
			break;
		case 9:
			if (l.isEmpty() == 1) {
				cout << "顺序表为空" << endl;
			}
			else
			{
				cout << "顺序表不为空" << endl;
			}
			break;
		case 10:
			if (l.isFull() == 1) {
				cout << "顺序表满" << endl;
			}
			else
			{
				cout << "顺序表不满" << endl;
			}
			break;
		case 11:
			DataType data1;
			cout << "请输入要删除的数据: ";
			cin >> data1;
			l.DeleteElemAtElem(data1);
			break;
		case 12:
			DataType data2;
			cout << "请输入要在头部插入的数据: ";
			cin >> data2;
			l.InsertSqListAtHead(data2);
			break;
		case 13:
			l.DeleteAtHead();
			break;
		case 14:
			DataType data3;
			cout << "请输入要在末尾插入的数据: ";
			cin >> data3;
			l.InsertSqListAtEnd(data3);
			break;
		default:
			break;
		}
	} while(i != 0);
	system("pause");
    return 0;
}

 

使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数
用模板方式实现顺序表的合并 #include "stdafx.h" #include #define MaxSize 100 template class SeqList { private: T * Mylist; int ListMaxSize; int Length; public: SeqList(int ListMaxSize=MaxSize); //构造函数 ~SeqList(void);// 析构函数 bool SLIsEmpty(void); // 判断表是否为空 bool SLIsFull(void);//判断表是否满 int ListLength(void){return Length;}//求表长度 T SLGetElem(int i); // 取得第i个元素的值 int SLFind(T & x,int index); //查找值为x的结点 bool SLInsert(int i,T & x); // 在表的第i个位置插入新结点 bool SLDelete(int i); // 删除表的第i个位置的结点 void CreateList(int num);// 创建一个包含num个元素的顺序表 void SLPrint(); //输出全体元素 }; template SeqList ::SeqList(int listMaxSize) //初始化顺序表 { if(listMaxSize>0){ ListMaxSize=listMaxSize; Length=0; Mylist=new T [ListMaxSize]; // 创建连续的表空间 } } template SeqList ::~SeqList(void) { delete [] Mylist;//删除表,释放表空间 } template void SeqList ::CreateList(int num) { T x; Length=0; cout << "请输入"<<num<<"个整数数据元素以创建一个线性表"<<endl; for (int i=0;i>x; Mylist[i]=x; Length++; } } template bool SeqList ::SLIsEmpty(void) // 判断表是否为空 { return (Length<=0)?true:false; //表空则返回真(true),否则返回假(false) } template bool SeqList ::SLIsFull(void)//判断表是否满 { return(Length>=ListMaxSize)?true:false; //表满则返回真(true),否则返回假(false) } template T SeqList ::SLGetElem(int i) // 取得第i个元素的值 { return(iLength-1)?-1:Mylist[i]; } template int SeqList ::SLFind(T & x,int index) //查找值为x的结点 { for(int i=0;i<index;i++) if(Mylist[i]==x) return i+1; return -1;//没有找到给定元素 } template bool SeqList ::SLInsert(int i,T & x) // 在表的第i个位置插入新结点 { if(iLength) {cout <<"参数i不合理!" <<endl; return false;} else if(Length==ListMaxSize) {cout<< "表已满,无法插入!"<i;j--) Mylist[j]=Mylist[j-1]; Mylist[j]=x; Length++; return true; } } template bool SeqList ::SLDelete(int i) // 删除表的第i个位置的结点 { if(iLength) {cout <<"参数i不合理!" <<endl; return false;} else if(Length==0) {cout<< "表已空,无无元素可删除!"<<endl; return false;} else{ for(int j=i;j<Length-1;j++)Mylist[j]=Mylist[j+1]; Length--; cout<<"删除操作成功"<<endl; return true; } } template void SeqList ::SLPrint(void) //输出全体元素 { if (SLIsEmpty()) cout<<"空表! 无元素可输出"<<endl; else{ cout<<"顺序表中的所有元素分别为: "; for (int i=0;i<Length;i++) cout<<Mylist[i]<<" "; } cout <<endl; } void ListUnion(SeqList &ListA;,SeqList &ListB;) { cout<<"两个参数对象的顺序表:"<<endl; ListA.SLPrint(); ListB.SLPrint(); int n,m; int XX,i=0; n=ListA.ListLength(); m=ListB.ListLength(); int j=i; while(i<m){ XX=ListB.SLGetElem(i); int k=ListA.SLFind(XX,n); if(k==-1) { ListA.SLInsert(n+j,XX); j++; } i++; } cout<<"两个顺序表合并后的结果"<<endl; ListA.SLPrint(); cout<<"ListUnion end"<<endl; } int main(int argc, char* argv[]) { SeqList myListA(20),myListB(30); int LenA,LenB; cout<>LenA; cout<<endl; myListA.CreateList(LenA); myListA.SLPrint(); cout<<endl<>LenB; cout<<endl; myListB.CreateList(LenB); myListB.SLPrint(); ListUnion(myListA,myListB); return 0; }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kgvito

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

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

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

打赏作者

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

抵扣说明:

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

余额充值