类的声明
一般类的声明在头文件中进行,类中成员函数的实现在源文件中进行
#define node elemType
//将node变量化,以后node如果要替换为双链表节点等,只需要修改此处即可
using namespace std;
typedef int dataType; //与上同样的道理,如果数据类型有变化,只需要修改此处即可
class node{
public:
dataType data;
};
class sql{
public:
sql();
~sql();
void creatSql(int n); //输入n个数值构造n个节点
void traverseSql();//遍历节点并输出
bool isEmpty();//判断线性表是否为空
bool isFull();//判断线性表是否为满
int getLength();//返回线性表当前长度
bool getElemByIndex(int i,dataType& elem);//按索引返回线性表中元素
bool getElemByElem(dataType data,int& elem);//按数值返回线性表中元素
bool insertSql(int n,dataType data);//按索引位置插入元素
bool insertSqlAtHead(dataType data);//在顺序表头插入元素
bool insertSqlAtEnd(dataType data);//在顺序表尾插入元素
bool delElemByIndex(int i);//按索引删除元素
bool delElemByElem(dataType data);//按元素值删除元素
bool delAllElem();//删除所有
private:
int length;//顺序表当前长度
node *elem;//顺序表首地址,类似于数组中数组名
};
类的实现
#include <iostream>
#include "sqlDef.h"
#include <cstdlib>
#define maxSize 10 //顺序表中元素最大元素个数
using namespace std;
sql::sql(){
elem=new elemType[maxSize];//申请连续的地址空间,并将首地址赋给elem
length=0;
}
sql::~sql(){
delete []elem;
}
void sql::creatSql(int n){
if(n<1||n>maxSize){
cout<<"输入的数目不符合规范"<<endl;
exit(0);
}
for(int i=0;i<n;i++){
cout<<"输入第"<<i+1<<"个数据"<<endl;
cin>>elem[i].data;
}
length=n;
};
void sql::traverseSql(){
for(int i=0;i<length;i++){
cout<<elem[i].data<<' '<<endl;
}
};
bool sql::isEmpty(){
if(length==0)
return true;
else
return false;
};
bool sql::isFull(){
if(length==maxSize)
return true;
else
return false;
};
int sql::getLength(){
return length;
};
bool sql::getElemByIndex(int i,dataType& temp){//利用引用将值传出
if(i<0||i>length-1){
cout<<"范围越界"<<endl;
return false;
}
temp=elem[i].data;
return true;
};
bool sql::getElemByElem(dataType data,int&temp){
int i;
for(i=0;i<length;i++){
if(elem[i].data==data){
temp=i;
return true;
}
}
return false;
};
bool sql::insertSql(int n,dataType data){
if(n<0||n>length){
cout<<"插入范围越界"<<endl;
return false;
}
else if(length==maxSize){
cout<<"线性表已满"<<endl;
return false;
}
for(int i=length-1;i>=n;i--){
elem[i+1]=elem[i];
}//元素依次后移,再将数据插入,要注意i=length-1,再i递减到n,将n位置以后的数全部后移一个位置
elem[n].data=data;
length++;
return true;
};
bool sql::insertSqlAtHead(dataType data){
if(length==maxSize){
cout<<"线性表已满"<<endl;
return false;
}
for(int i=length-1;i>=0;i--){
elem[i+1]=elem[i];
}
elem[0].data=data;
length++;
return true;
};
bool sql::insertSqlAtEnd(dataType data){
if(length==maxSize){
cout<<"线性表已满"<<endl;
return false;
}
elem[length].data=data;
length++;
return true;
};
bool sql::delElemByIndex(int i){
if(i<0||i>=length){
cout<<"范围越界"<<endl;
return false;
}
for(int k=i;k<length;k++){
elem[k]=elem[k+1];
}
length--;
return true;
};
bool sql::delElemByElem(dataType data){
int i=0;
while(elem[i].data!=data&&i<length)
i++;
if(i==length){
cout<<"线性表中无此元素"<<endl;
return false;
}
for(int k=i;k<length;k++){
elem[k]=elem[k+1];
}
length--;
return true;
};
bool sql::delAllElem(){
if(length==0){
cout<<"线性表为空"<<endl;
return false;
}
length=0;
return true;
};
int main()
{
sql sql0;
int temp,data=2;
sql0.creatSql(3);
sql0.traverseSql();
// sql0.getElemByElem(data,temp);
// cout<<temp<<endl;
// sql0.insertSql(2,10);
// sql0.insertSqlAtHead(9);
// sql0.insertSqlAtEnd(5);
// sql0.delElemByIndex(1);
// sql0.delElemByElem(5);
// sql0.delAllElem();
// cout<<sql0.getLength();
sql0.traverseSql();
system("pause");
return 0;
}
顺序表在插入和删除时需要移动大量元素,时间复杂度为O(n),每次在插入和删除操作时,不要忘记了关键操作length++或者length--