大家都知道栈和队列数据结构,其实他们是特殊的线性表结构,只能在头结点出进行操作,而不能做插入和按序号删除这样的操作。
线性表结构则显得更为的灵活多了,用来存储一类同类型的数据显得非常的适用,同样的,他也有两种构建的方式,这一篇给大家带来的是静态的数组存储方式,用在小型的数据管理上非常便利,下面是构建的代码,读者可以细心阅读注释部分,后一篇会使用动态链表结构来构建这样一个线性表结构:
//超超
//2016 10 6
#include<iostream>
using namespace std;
typedef int elementtype;
enum error_code{success,underflow,overflow,rangeerror};
const int maxlen=15;
/*要构建一个线性表:
要知道他应该有什么基本的运算:
1.求表长度
2.按序号取元素
3.按值查找
4.插入元素
5.删除元素
*/
class list{
public:
list();
int length() const;
error_code get_element(const int i,elementtype &x);//按序号取元素
int locate(const elementtype x) const;//按值查找
error_code insert(const int i,const elementtype x);//插入元素
error_code delete_element(const i);//按序号删除指定元素
void write();//存数据
void read();//读数据
private:
elementtype data[maxlen];
int count;
};
list::list(){
count=0;
}
int list::length() const{
return count;
}
//按序号取元素,注意取数组下标即可找到数据
error_code list::get_element(const int i,elementtype &x){
if(i<=0||i>count) return rangeerror;
x=data[i-1];
return success;
}
//按值查找需要逐个和链表的数据进行比较,因为可能会有结点相同的值,所以必须全链表遍历
int list::locate(const elementtype x)const{
//不管能不能查到,必须全链表遍历
//定义一个数组来存放遍历到的下标数
int a[maxlen];
int j=0;
int i;
for(i=0;i<length();i++){
if(data[i]==x) a[j++]=(i+1);
}
if(j>0){
cout<<"按值查找到的下标值为"<<j<<"个";
for(i=0;i<j;i++){
if(a[i]!=0) cout<<a[i]<<" ";
}
return 1;//表示能查到该值所对应的下标
}
else return -1;//表示按值查找没有找到该值所对应的下标
}
//插入运算,注意插入运算会改动后面元素的下边,所以要往后移动元素
error_code list::insert(const int i,const elementtype x){
//因为是使用的数组存储,所以必要考虑满的情况
if(count==maxlen) return overflow;
//还要考虑这个下标值是不是在插入链表的范围中
if(i<0||i>length()+1) return rangeerror;
//完成检查做插入运算
//先找到要插入的位子,将后面数据移位
for(int j=count-1;j>=i-1;j--)
data[j+1]=data[j];
//移位好后空位子做放入操作即可
data[i-1]=x;
count++;
return success;
}
//按下标做删除操作其实就是插入运算的逆运算
error_code list::delete_element(const int i){
if(length()==0) return underflow;
if(i<0||i>length()) return rangeerror;
//将i下标后的元素都往前移位
for(int j=i+1;j<=length();j++)
data[j-2]=data[j-1];
count--;
return success;
}
void list::write(){
int a;
elementtype x;
cout<<"请输入要存的数据个数:"<<endl;
cin>>a;
for(int i=0;i<a;i++){
cout<<"请输入的第"<<i+1<<"个数据: ";
cin>>x;
data[i]=x;
count++;
}
}
void list::read(){
int i;
cout<<"存入的数据顺序如下:"<<endl;
for (i=0;i<count;i++)
cout<<data[i]<<" ";
cout<<endl;
}
int main(){
list l;
l.write();
l.read();
return 1;
}
相信读者看完这一大段代码后,会有很好的收获。