1.顺序表的结构定义
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define OVERFLOW 0 //溢出
#define ERROR 0 //出错
#define OK 1 //成功
typedef int ElemType;
typedef struct
{
ElemType *elem;//存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType))
}SqList;
2.初始化
void InitList_Sq(SqList *L)//初始化顺序表
{
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem) exit(OVERFLOW); //存储分配失败
L->length=0; //空表长度为0
L->listsize=LIST_INIT_SIZE; //初始存储容量
}
3.在表尾插入一个元素
void ListInsert_Tail_Sq(SqList *L,ElemType e)
{
if(L->length>=L->listsize)
{
ElemType *newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
L->elem[L->length++]=e;
}
4.在特定位置i插入一个元素e(如果i值分配不合法返回0,如果插入成功返回1)
int ListInsert_i_Sq(SqList *L,int i,ElemType e)//在顺序线性表L中第i个位置之前插入新的元素e
{
if(i<1||i>L->length+1) return ERROR; //i值分配不合法
if(L->length>=L->listsize) //当前存储空间已满,增加分配
{
ElemType *newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW); //存储分配失败
L->elem=newbase; //新基质
L->listsize+=LISTINCREMENT; //增加存储容量
}
ElemType *q=&(L->elem[i-1]),*p; //q为插入位置
for(p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p; //插入位置后移
*q=e;
++L->length;
return OK; //表长增1
}
5.删除表中i位置的
int ListDelete_i_Sq(SqList *L,int i,ElemType *e)//e的为删除元素的值
{
if(i<1||i>L->length+1) return ERROR; //i值分配不合法
ElemType *p=&(L->elem[i-1]),*q;
*e=*p;
q=L->elem+L->length-1; //表尾元素的位置&(L->elem[L->length-1])
for(++p;p<=q;p++)
*(p-1)=*p;
--L->length;
return OK;
}
5.输出顺序表
void ListPrint_Sq(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
}