#include <iostream>
#include <string>
using namespace std;


/*定义线性表的容量*/
#define MAXSIZE 20


/*定义线性表元素类型*/
typedef int Element;

/*定义线性表的结构体*/
typedef struct{
Element data[MAXSIZE]; /*线性表使用一维数组做为顺序存储*/
int size = 0; /*表示当前线性表的长度*/
}List;

/**
* 获取线性表的长度
*/
int getSize(List l){
return l.size;
}

/**
* 按索引位置进行元素插入
*/
void insertByIndex(List *l,int index,Element e){

if (l->size >= MAXSIZE){
cout << "insert data to list failed,because: list size("<< l->size<<") lt MAIXSIZE("<< MAXSIZE <<")" <<endl;
return;
}

if (index < 0 || index > l->size){
cout << "insert data to list failed,because:index < 0 || index > l->size" << endl;
return;
}

if (index <= l->size){
for(int i = l->size-1; i > index-1;i--){
l->data[i+1] = l->data[i];
}
}
l->data[index] = e;
l->size++;
}

/**
* 按索引位置删除元素
*/
void deleteByIndex(List *l,int index,Element *e){
if (index < 0 || index > l->size){
cout << "index out" << endl;
return;
}
*e = l->data[index];
for(int i=index; i < l->size; i++){
l->data[i] = l->data[i+1];
}
l->size--;
return;

}

/*
* 获取线表中指定位置的元素
* */
void getElement(List l,int index,Element *e){
if(index < 0 || index >= l.size){
cout << "索引超出范围" << endl;
return;
}
*e = l.data[index];
}

/**
* 在线性表尾部追加元素
*/
void append(List *l,Element e){

cout << "size: " << l->size << endl;
if (l->size >= MAXSIZE){
cout << "list is full,storage size: " << MAXSIZE << endl;
return;
}
l->data[l->size] = e;
l->size++;
}

/**
* 打印输出线性表中的元素
*/
void printElement(List l){
for (int i =0; i < l.size; i++){
cout << "index: " << i <<" value: " << l.data[i] << endl;
}
}


/*
* 线性表的顺序存储结构,指的是用一段连续的存储单元依次存储线性瑶数据元素
* 存储器中每个存储单元都有自己的编号,这个编号称为地址。
* 有点: 1.无需为表示元素之间逻辑而增加额外的存储空间
* 2.可以快速读取表中的任何一个位置的元素
* 缺点: 1.插入和删除需要移动大量的元素
* 2.当线性表长度变化较大时,难以确定存储空间的容量
* 3.造成存储空间的"碎片"
*/
int main(){
List l;
cout << "size: " << getSize(l) << endl;

for(int i = 0; i < 20; i++){
insertByIndex(&l,i,(i+1)*2);
}
cout << "size: " << getSize(l) << endl;

insertByIndex(&l,1,30);
cout << "size: " << getSize(l) << endl;

Element value;
deleteByIndex(&l,1,&value); //the 2th element
cout << "size: " << getSize(l) <<" value: " << value << endl;

append(&l,100);
append(&l,200); //返回错误,线性表的存储空间已满无法追加新的元素到列表尾部
cout << "size: " << getSize(l) << endl;
cout << endl;
Element e;
getElement(l,19,&e);
cout << "get elment value is: " << e << endl;

cout << endl << "=========================" << endl;
printElement(l);
return 0;
}