数据结构与算法

顺序表

<新手上路! 记录学习>

顺序表为线性结构,以数组形式保存!

1.创建一个结构体来表示顺序表,其中*elems表示顺序表的元素地址,length表示顺序表的长度,size表示顺序表的总的存储空间大小。

倒叙便利lua表 倒叙 顺序_数据结构与算法


2.初始化链表,为链表分配空间,宏定义表示顺序表的总的存储大小(可自由修改),为防止顺序表存储空间分配失败,外加了一条判断语句,判断顺序表分配空间后是否为空,为空直接结束。

倒叙便利lua表 倒叙 顺序_倒叙便利lua表_02


倒叙便利lua表 倒叙 顺序_存储空间_03


3.往表中添加元素,首先判断顺序表的存储空间是否已满,通过循环输入,往顺序表中添加元素,添加个数由e决定。

倒叙便利lua表 倒叙 顺序_数据结构与算法_04


4.向顺序表中指定位置插入元素,判断插入位置是否合法存储空间是否已满,防止出错;通过循环从最后一个元素依次向后移,直到i向后移动了为止,将i空间用来存储所要插入的元素e。

倒叙便利lua表 倒叙 顺序_倒叙便利lua表_05


5.删除指定位置顺序表,首先判断位置是否合法,若要删除元素位置为最后一个直接表长减1,若不是,则通过循环将元素前移,直到覆盖所要删除的指定位置的元素的值为止。

倒叙便利lua表 倒叙 顺序_倒叙便利lua表_06


6.销毁顺序表,首先判断存储空间是否存在,若是则释放,将表长和总长度设置为0

倒叙便利lua表 倒叙 顺序_数据结构与算法_07


7.顺序表打印

倒叙便利lua表 倒叙 顺序_存储空间_08


8.完整代码

|#include 
 #include <stdlib.h>
using namespace std;
#define MAX_SIZE 100
typedef struct{
 int *elems; // 顺序表的元素地址
 int length; // 顺序表的长度
 int size; // 顺序表的总的存储空间
 }Sqlist;//初始化链表
 bool getList(Sqlist &L){ //创建一个空的顺序表L
 L.elems = new int[MAX_SIZE]; //为顺序表分配MAX_SIZE个空间
 if(!L.elems) return false; //如果顺序表为空,则存储空间分配失败L.length = 0;  //初始表长度为0
L.size = MAX_SIZE; //表的总的大小
return true;}
//打印链表
 void print_List(Sqlist &p){
 cout<<"|--------------链表信息打印--------------|"<<endl;
 for(int i=0;i<p.length;i++){
 cout<<"+顺序表第"<<i+1<<“个元素为:”<<p.elems[i]<<endl;
 }
 cout<<endl;
 cout<<“顺序表的大小为:”<<p.size<<"\t";
 cout<<“顺序表的长度为:”<<p.length<<endl;
 cout<<"|------------------结束------------------|"<<endl;
 }//添加元素
 bool add_List(Sqlist &L,int e){ //e表示要添加的元素个数
 if(L.length == L.size) return false;//若表长等于总表长,则存储空间已满
 cout<<endl;
 for(int i=0;i<e;i++){ //循环输入e个元素信息
 cout<<“请输入要添加的”<<i+1<<“个信息:”;
 cin>>L.elems[L.length];//使用数组下标存储
 L.length++;//表长加1
 }
 return true;
 }//插入元素
 bool intoThing(Sqlist &L,int i,int e){ //i为插入的位置,e为插入的元素
 if(i<0 || i>L.size) return false; //判断插入位置是否合法
 if(L.length == L.size) return false;//判断存储空间是否已满for(int j=L.length-1;j>=i;j--){//从最后一个元素开始向后移,直到i个元素后移为止
	L.elems[j+1] = L.elems[j];
}

L.elems[i] = e; //将e元素插入i位置
L.length++;     //表长加1
return true;}
//删除指定位置的顺序表
 bool deleteList(Sqlist &L,int i){ //i表示要删除元素位置
 if(i<0 || i>L.length) return false; //判断要删除元素位置是否合法if(i == L.length-1){ //判断要删除的位置是不是最后一个,若是直接长度减1,达到删除目的
	L.length--;
	return true;
}

//所删除元素位置不是最后一个
for(int j=i;j<L.length-1;j++){//循环查找所要删除的元素位置
	L.elems[j] = L.elems[j+1];//元素前移,覆盖前一个元素值,达到删除目的
}
L.length--; //将表长减1
return true;}
//销毁顺序表
 void overList(Sqlist &L){
 if(L.elems) delete L.elems;//如果存储空间存在,则释放空间
 L.length = 0; //将表长设置为0
 L.size = 0; //表总长设置为0
 cout<<“顺序表销毁成功!”<<endl;
 }int main(void){
 Sqlist list;
 int e = 0;
 int i = 0;//1.初始化顺序表
cout<<"顺序表初始化..."<<endl;
if(getList(list)){
	cout<<"顺序表初始化成功!"<<endl;
	cout<<endl;
}
print_List(list);

//2.向顺序表添加元素
cout<<"请输入要添加的元素个数: ";
cin>>e;
if(add_List(list,e)){
	cout<<"信息添加成功!"<<endl;
}else{
	cout<<"信息添加失败!"<<endl;
}
print_List(list);

//3.向顺序表插入元素
cout<<"请输入要插入的位置和元素:";
cin>>i>>e;
if(intoThing(list,i,e)){
	cout<<"元素插入成功!"<<endl;
}else{
	cout<<"元素插入失败!"<<endl;
}
print_List(list);

//4.删除顺序表元素
cout<<"请输入要删除元素的位置:";
cin>>i;
if(deleteList(list,i)){
	cout<<"元素删除成功!"<<endl;
}else{
	cout<<"元素删除失败!"<<endl;
}
print_List(list);

//5.销毁顺序表
overList(list);
print_List(list);

system("pause");
return 0;}