数据结构与算法
顺序表
<新手上路! 记录学习>
顺序表为线性结构,以数组形式保存!
1.创建一个结构体来表示顺序表,其中*elems表示顺序表的元素地址,length表示顺序表的长度,size表示顺序表的总的存储空间大小。
2.初始化链表,为链表分配空间,宏定义表示顺序表的总的存储大小(可自由修改),为防止顺序表存储空间分配失败,外加了一条判断语句,判断顺序表分配空间后是否为空,为空直接结束。
3.往表中添加元素,首先判断顺序表的存储空间是否已满,通过循环输入,往顺序表中添加元素,添加个数由e决定。
4.向顺序表中指定位置插入元素,判断插入位置是否合法存储空间是否已满,防止出错;通过循环从最后一个元素依次向后移,直到i向后移动了为止,将i空间用来存储所要插入的元素e。
5.删除指定位置顺序表,首先判断位置是否合法,若要删除元素位置为最后一个直接表长减1,若不是,则通过循环将元素前移,直到覆盖所要删除的指定位置的元素的值为止。
6.销毁顺序表,首先判断存储空间是否存在,若是则释放,将表长和总长度设置为0
7.顺序表打印
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;}