结构体:
typedef struct{
ElemType data[maxSize];
int length;
}Sqlist;
顺序表的操作主要为插入和删除,这两个理解了其他基本操作也就没什么问题了
- 插入:
x为待插元素,p为待插位置
插入思想:
1.先判断插的位置合不合理,能不能插
(代码中p>L.length而不是length-1是为了可以在线性表末插入,L.length==maxSize确保不会发生越界)
2.要想在p位置插入,则必须p后的每个元素都向后移一位,若从p开始移动会发生元素丢失,所以应该从最后一个元素开始移
for循环让L.data[i+1]=L.data[i];最后再L.data[p]=x;最后(L.length)++;
int insertElem(Sqlist &L,int x,int p){
if(p<0||p>L.length||L.length==maxSize){
return 0;
}
for(int i=L.length-1;i>=p;i--)
L.data[i+1]=L.data[i];
L.data[p]=x;
(L.length)++;
cout<<"insert sucess!"<<endl;
return 1;
}
- 删除(取出):
p为待删除位置,e用来接收删除的元素
删除思想:
1.先判断删的位置合不合理,能不能插
(在findElem函数判定)
2.想删除p位置的元素,则要p后的元素都像前移动一位置,从p后一个位置开始移动才不会发生元素丢失
for循环从p开始L.data[i]=L.data[i+1];最后记得(L.length)–;
int deleteElem(Sqlist &L,int p,int &e){
if(!findElem(L,p,e)) return 0;
for(int i=p;i<L.length-1;i++){
L.data[i]=L.data[i+1];
}
(L.length)--;
return 1;
}
int findElem(Sqlist &L,int p,int &e){
if(p<0||p>L.length-1) return 0;
e=L.data[p];
return 1;
}
线性表完整的代码如下
#include <iostream>
#include<cstring>
#define maxSize 100
typedef int ElemType;
using namespace std;
typedef struct{
ElemType data[maxSize];
int length;
}Sqlist;
//菜单
void menu(){
cout<<endl;
cout<<"输入1插入元素"<<endl;
cout<<"输入2删除指定位置的元素"<<endl;
cout<<"输入3查找指定位置的元素"<<endl;
cout<<"输入4退出"<<endl;
}
//根据输入建顺序表
bool creatSq(Sqlist &L){
int i=0,n=0;
int a;
cout<<"建表,请输入元素个数"<<endl;
cin>>n;
while(n>0){
if(L.length==maxSize){
return false;
}
else{
cin>>a;
L.data[i++]=a;
(L.length)++;
n--;
}
}
return true;
}
//显示
void show(Sqlist L){
int j=L.length;
cout<<"当前顺序表为:"<<" ";
for(int i=0;i<j;i++){
cout<<L.data[i]<<" ";
}
cout<<endl;
}
//插入元素x在表中第P位置
int insertElem(Sqlist &L,int x,int p){
if(p<0||p>L.length||L.length==maxSize){
return 0;
}
for(int i=L.length-1;i>=p;i--)
L.data[i+1]=L.data[i];
L.data[p]=x;
(L.length)++;
cout<<"insert sucess!"<<endl;
return 1;
}
//查找某个位置的元素
int findElem(Sqlist &L,int p,int &e){
if(p<0||p>L.length-1) return 0;
e=L.data[p];
return 1;
}
int deleteElem(Sqlist &L,int p,int &e){
if(!findElem(L,p,e)) return 0;
for(int i=p;i<L.length-1;i++){
L.data[i]=L.data[i+1];
}
(L.length)--;
return 1;
}
int main(){
Sqlist L;
memset(L.data, 0, sizeof(L));//初始化数据为0
L.length = 0; //初始化长度为0
if(!creatSq(L)){ cout<<"error"<<endl;return 0;}
cout<<"creat sucess!"<<endl;
show(L);
int choice;
while(1){
menu();
cin>>choice;
switch(choice){
case 1: {int x,p;
cout<<"输入插入的元素和位置"<<endl;
cin>>x>>p;
if(!insertElem(L,x,p)) {cout<<"插入失败"<<endl;break;}
show(L);
break;}
case 2: {int p,e=0;
cout<<"输入删除的位置"<<endl;
cin>>p;
if(!deleteElem(L,p,e)) {cout<<"删除失败"<<endl; show(L);break;}
cout<<"第"<<p<<"位置元素: "<<e<<"已经删除"<<endl;
show(L);
break;}
case 3: {int p,e=0;
cout<<"输入查找的位置"<<endl;
cin>>p;
if(!findElem(L,p,e)) {cout<<"查找失败"<<endl;break;}
cout<<"该位置元素为: "<<e<<endl;
break;}
case 4: return 0;
default: break;
}
}
return 0;
}