这里我们的目的是要简单地实现一下顺序表:初始化顺序表,插入5个数并输出,查找 2和 6是否在顺序表中,取出第3个数,最后删除第3个数
操作流程为:
1.首先开头预处理一下
#include<bits/stdc++.h>
#define maxn 100
typedef int Status;
using namespace std;
typedef struct{
int *elem;
int length;
}SqList;
2.初始化
//初始化顺序表
Status InitList(SqList &l){
l.elem = new int(maxn);
if(!l.elem)
exit(-2);
l.length = 0;
return 1;
}
3.插入
//顺序表的插入(将要插入的新元素e放到第i个位置)
Status ListInsert(SqList &l,int i,int e){
if(i<1||i>l.length+1)
return 0;
if(l.length==maxn)
return 0;
for(int j=l.length-1;j>=i-1;j--){
l.elem[j+1]=l.elem[j];
}
l.elem[i-1]=e;
l.length++;
return 1;
}
4.取值
//取出顺序表中的第i个值 (1<=i&&i<=l.length)
Status GetElem(SqList &l,int i,int &e){
if(i<1||i>l.length)
return 0;
e = l.elem[i-1];
return 1;
}
5.查找
//顺序表的查找(看顺序表内有没有要查找的值,若查找到则返回当前位置,否则返回 0)
int LocateElem(SqList &l,int e){
for(int i=0;i<l.length;i++){
if(l.elem[i]==e){
return i+1;
}
}
return 0;
}
6.删除
//顺序表的删除(删除顺序表中的第i个元素)
Status ListDelete(SqList &l,int i){
if(i>l.length||i<1)
return 0;
for(int j=i;j<=l.length-1;j++){
l.elem[j-1]=l.elem[j];
}
l.length--;
return 1;
}
7.输出函数:为了方便查看顺序表是否已经实现,这里我写了个输出函数,用来打印当前顺序表中的所有元素
//打印顺序表中的元素
Status PrintList(SqList &l){
if(l.length==0)
return 0;
printf("当前顺序表中的元素依次为:");
for(int i=0;i<l.length;i++)
cout<<l.elem[i]<<" ";
cout<<endl;
return 1;
}
至此,顺序表的功能就大差不差了,完整代码如下:
#include<bits/stdc++.h>
#define maxn 100
typedef int Status;
using namespace std;
typedef struct{
int *elem;
int length;
}SqList;
//初始化顺序表
Status InitList(SqList &l){
l.elem = new int(maxn);
if(!l.elem)
exit(-2);
l.length = 0;
return 1;
}
//取出顺序表中的第i个值 (1<=i&&i<=l.length)
Status GetElem(SqList &l,int i,int &e){
if(i<1||i>l.length)
return 0;
e = l.elem[i-1];
return 1;
}
//顺序表的查找(看顺序表内有没有要查找的值,若查找到则返回当前位置,否则返回 0)
int LocateElem(SqList &l,int e){
for(int i=0;i<l.length;i++){
if(l.elem[i]==e){
return i+1;
}
}
return 0;
}
//顺序表的插入(将要插入的新元素e放到第i个位置)
Status ListInsert(SqList &l,int i,int e){
if(i<1||i>l.length+1)
return 0;
if(l.length==maxn)
return 0;
for(int j=l.length-1;j>=i-1;j--){
l.elem[j+1]=l.elem[j];
}
l.elem[i-1]=e;
l.length++;
return 1;
}
//顺序表的删除(删除顺序表中的第i个元素)
Status ListDelete(SqList &l,int i){
if(i>l.length||i<1)
return 0;
for(int j=i;j<=l.length-1;j++){
l.elem[j-1]=l.elem[j];
}
l.length--;
return 1;
}
//打印顺序表中的元素
Status PrintList(SqList &l){
if(l.length==0)
return 0;
printf("当前顺序表中的元素依次为:");
for(int i=0;i<l.length;i++)
cout<<l.elem[i]<<" ";
cout<<endl;
return 1;
}
//实现顺序表:初始化顺序表,插入5个数并输出,查找 2和 6是否在顺序表中,取出第3个数,最后删除第3个数
int main(){
SqList sql;
int e = 0;//取第三个数的时候用作实参变量
int status = 0;
//初始化顺序表
status = InitList(sql);
//插入1~5共5个数
for(int i=1;i<6;i++){
status = ListInsert(sql,i,i);
if(status==0){
cout<<"位置越界或顺序表已满!"<<endl;
break;
}
}
PrintList(sql);
//查找 2和 6是否在顺序表中
if(!LocateElem(sql,2))
cout<<"2不在顺序表中!"<<endl;
else
printf("2在顺序表中的第%d个位置\n",LocateElem(sql,2));
if(!LocateElem(sql,6))
cout<<"6不在顺序表中!"<<endl;
else
printf("6在顺序表中的第%d位置\n",LocateElem(sql,6));
//取出第 3个数
status = GetElem(sql,3,e);
if(status==0)
cout<<"你选择的位置超出顺序表的范围!"<<endl;
if(status==1)
printf("第三个数是:%d\n",e);
//删除第 3个数
status = ListDelete(sql,3);
if(status==0)
cout<<"位置越界!"<<endl;
if(status==1)
PrintList(sql);
return 0;
}