C++实现顺序表
顺序表
线性表的顺序存储结构称为顺序表。
本文中采用一维数组data来实现顺序表,并设定数组最大长度为常量MAXSIZE,将长度为n的线性表存放在data数组中。随着线性表的插入和删除操作,线性表的长度是变化的,而数组的长度是不可变的,所以线性表的长度应该小于或等于数组的长度MAXSIZE。
顺序表基本运算的实现
- 建立顺序表
- 顺序表的初始化和销毁
- 输出顺序表
- 求顺序表的长度
- 求顺序表中的某个位置元素值
- 按元素值查找
- 插入数据元素
- 删除数据元素
定义一个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;
}