#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define INITSIZE 10
#define INCREMENT 10
typedef struct{
ElemType *data;
int length;
int listSize;
}SqList;
Status InitList(SqList &L){
L.data=(ElemType*)malloc(sizeof(ElemType)*INITSIZE);
if(!L.data)
exit(OVERFLOW);
L.length=0;
L.listSize=INITSIZE;
return OK;
}
Status DestroyList(SqList &L){
free(L.data);
L.data=NULL;
L.length=0;
L.listSize=0;
return OK;
}
Status ClearList(SqList &L){
L.length=0;
return OK;
}
int ListLength(SqList L){
return L.length;
}
bool ListEmpty(SqList L){
return L.length==0;
}
Status GetElem(SqList L,int i,ElemType &e){
if(i<1 || i>L.length)
return ERROR;
e=L.data[i-1];
return OK;
}
int LocateElem(SqList L,ElemType e){
for(int i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}
Status IncreaseSize(SqList &L,int len){
ElemType *p=L.data;
L.data=(ElemType*)malloc(sizeof(ElemType)*(len+L.listSize));
if(!L.data)
exit(OVERFLOW);
for(int i=0;i<L.length;i++)
L.data[i]=p[i];
free(p);
L.listSize+=len;
return OK;
}
Status ListInsert(SqList &L,int i,ElemType e){
if(i<1 || i>L.length+1)
return ERROR;
if(L.length==L.listSize)
IncreaseSize(L,INCREMENT);
for(int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return OK;
}
Status ListDelete(SqList &L,int i,ElemType &e){
if(i<1 || i>L.length)
return ERROR;
e=L.data[i-1];
for(int j=i-1;j<L.length-1;j++)
L.data[j]=L.data[j+1];
L.length--;
return OK;
}
Status NextElem(SqList L,ElemType cur_e,ElemType &next_e){
int i=LocateElem(L,cur_e);
if(i<1 || i>L.length-1)
return ERROR;
next_e=L.data[i];
return OK;
}
Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e){
int i=LocateElem(L,cur_e);
if(i<2 || i>L.length)
return ERROR;
pre_e=L.data[i-2];
return OK;
}
Status ListTraverse(SqList L){
for(int i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
return OK;
}