#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>///动态存储分配
#define LIST_INIT_SIZE 100
typedef int ElemType;
typedef struct SqList{
ElemType *base;
int capacity;///存储空间容量
int size;///有效元素个数
}SquList;
int InitList(SqList &L){
L.base=(ElemType* )malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(L.base==NULL)exit(-1);
L.capacity=LIST_INIT_SIZE;
L.size=0;
return 1;
}
///顺序表的销毁
int DestoryList(SqList &L){
if(L.base==NULL)return 0;
free(L.base);
L.base=NULL;
L.size=0;
return 1;
}
///顺序表的清空
int ClearList(SqList &L){
if(L.base==NULL)return 0;
else{
L.size=0;
return 1;
}
}
///顺序表的插入
int InsertList(SqList &L,int i,ElemType e){///这里的i是指第i个元素,而不是下标
if(i<1||i>L.size+1)return 0;
if(L.size>=L.capacity){
///若插入前表满,则将表的容量扩大为原本容量的二倍
L.base=(ElemType*)realloc(L.base,2*L.capacity*sizeof(ElemType));
if(L.base==NULL)exit(-1);
L.capacity*=2;
}
for(int k=L.size-1;k>=i-1;k--)///第i个元素,下表是i-1
L.base[k+1]=L.base[k];///将插入位置及其往后原所有元素往后移一格
L.base[i-1]=e;
L.size++;
return 1;
}
///顺序表的删除
int EraseList(SqList &L,int i,ElemType &e){///这里的i是指第i个元素,而不是下标
if(i<1||i>L.size)return 0;
e=L.base[i-1];
for(int k=i;k<L.size;k++)///被删除元素后的所有元素前移一位
L.base[k-1]=L.base[k];
L.size--;
return 1;
}
///顺序表的查找
int FindList(SqList L,ElemType e){
int result=0;
for(int i=0;i<=L.size-1;i++){
if(L.base[i]==e){
return i+1;///返回是第几个元素
break;
}
}
return result;///没找到
}
///是顺序表的的遍历输出
int PrintElem( ElemType e){
printf("%d",e);
return 1;
}
int ListTraverse(SqList L,int(*visit)(ElemType)){///visit是函数指针,指向一个接受Elemtype类型参数并返回int类型值的函数,
///visit存储了函数PrintElem的首地址,可通过visit调用PrintElem函数
int flag;
for(int i=0;i<L.size;i++){
///遍历L中的每个元素,调用visit函数
flag=visit(L.base[i]);///若visit函数返回0,则遍历结束.
if(flag!=1)return 0;
}///所有元素处理完返回1;
return 1;
}