C++实现顺序表

顺序表

线性表的顺序存储结构称为顺序表。
本文中采用一维数组data来实现顺序表,并设定数组最大长度为常量MAXSIZE,将长度为n的线性表存放在data数组中。随着线性表的插入和删除操作,线性表的长度是变化的,而数组的长度是不可变的,所以线性表的长度应该小于或等于数组的长度MAXSIZE。

顺序表基本运算的实现

  1. 建立顺序表
  2. 顺序表的初始化和销毁
  3. 输出顺序表
  4. 求顺序表的长度
  5. 求顺序表中的某个位置元素值
  6. 按元素值查找
  7. 插入数据元素
  8. 删除数据元素

定义一个SqList类

#include <iostream>
using namespace std;
#define MAXSIZE 6


class SqList{
	public:
		SqList();//初始化顺序表 
		~SqList();//删除顺序表 
		void CreatSqlList(int n);//创建顺序表 
		void DispList();//输出顺序表 
		int ListLength();//获得顺序表长度 
		bool isEmpty();//判断顺序表是否为空 
		bool getElemByIndex(int i,char &e);//查找某个位置的元素
		int getElemByElem(char e);//查找元素 
		bool InsertSqList(int i,char e);//插入元素 
		bool DeletElem(int i);//删除元素 
	private:
		char *data;//存放顺序表元素 
		int length;//存放顺序表的长度 
};

1.顺序表的初始化和销毁:

SqList::SqList(){
	data = new char[MAXSIZE];//为data分配长度为MAXSIZE的空间 
	length = 0;//初始化长度为0 
}

SqList::~SqList(){ 
	delete [] data;//释放data分配的空间 
}

2.建立顺序表:

void SqList::CreatSqlList(int n){
	for(int i=0;i<n;i++){
		cout << "请输入第" << i+1 << "个元素:" ;
	 	cin >> data[i];
	}
	length = n;
}

3.输出顺序表

void SqList::DispList(){
	if(length>0){
		for(int i=0;i<length;i++){
			cout << data[i] << " ";
		}
		cout << endl;
	}else{
		cout << "表为空" << endl;
	}
}

4.求顺序表的长度

int SqList::ListLength(){
	return length;
}

5.求顺序表中的某个位置元素值

bool SqList::getElemByIndex(int i,char &e){//通过引用的方式,将数据传回主函数
	if(i<1 || i>length){//参数错误时
		cout << "位置有误" << endl;
		return false;
	}else{
		e = data[i-1];
		return true;
	}
}

6.按元素查找

int SqList::getElemByElem(char e){
	int i=0;
	while(i<length&&data[i]!=e){
		i++;
	}
	if(i>=length){
 		return 0;
	}else{
		return i+1;//返回该元素的逻辑顺序
	}
}

7.插入数据元素

bool SqList::InsertSqList(int i,char e){
	if(i<1||i>length){
		cout << "该位置不存在" << endl; 
		return false;
	}
	for(int j=length;j>=i;j--){
		data[j] = data [j-1];//将插入位置以后的元素都后移一位
	}
	data[i-1] = e;
	length++;
	return true;
}

8.删除数据元素

bool SqList::DeletElem(int i){
	if(i<1||i>length){
		return false;
	}
	for(int j=i-1;j<length-1;j++){
		data[j] = data[j+1];//将删除元素后面的元素前移一位
	}
	length--;
	return true;
}

有序表的二路归并

假设两个递增有序表顺序表L1和L2,分别包含n个和m个元素,设计一个算法,将他们的所有元素归并为一个递增有序顺序表

void merge(SqList &L1,SqList &L2,SqList &L3){
	int i=0,j=0,k=0;
	while(i<L1.length&&j<L2.length){
//传入的循序表是升序,通过while循环同时遍历两个顺序表,将位置上较小的存入合并后的数组
//较大的位置停留,下次继续从这一个位置开始比较
		if(L1.data[i]<L2.data[j]){
			L3.data[k] = L1.data[i];
			i++;
			k++;
		}else{
			L3.data[k] = L2.data[j];
			j++;
			k++;
		}
	}
	while(i<L1.length){//若L1没有遍历完
		L3.data[k] = L1.data[i];
		i++;
		k++;
	}
	while(j<L1.length){//若L2没有遍历完
		L3.data[k] = L1.data[j];
		j++;
		k++;
	}
	L3.length = k;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值