#define LIST_INIT_SIZE 10
#define LISTINCREMENT 5
typedef struct {
ElemType *elem;
int length;
int listsize;
} SqLi
顺序表的基本操作
//线性表的基本的操作
Status InitList(SqList *l) {
l->elem = (ElemType*)malloc (LIST_INIT_SIZE *sizeof (ElemType));
if (l->elem == NULL) {//分配失败的情况
exit (OVERFLOW);
}
l->length = 0;
l->listsize = LIST_INIT_SIZE;
return OK;
}
//初始化:顺序表已经存在。操作的结果:销毁顺序表
Status DestoryList (SqList *l) {
free (l);
l->elem = NULL;
l->length = 0;
l->listsize = 0;
return OK;
}
//将表置空
Status ClearList (SqList *l) {
l->length = 0;
return OK;
}
//初始化:顺序线性表已经存在。操作结果:若顺序表为空。则返回的是TRUE否则返回的是FALSE;
Status ListEmpty (SqList *l) {
if (l->length == 0) {
return TRUE;
}else {
return FALSE;
}
}
int ListLength (SqList *l) {
//初始化条件:顺序表已经存在。操作的结果:返回顺序表中元素的个数
return l->length;
}
Status GetElem (SqList *l,int i,ElemType *e) {
//初始化的条件:顺序表已经存在,1<=i<=l->length
//操作的结果:用*e返回第i个元素
if (i <1 || i > l->length) {
exit (ERROR);
}
*e = *(l->elem + i - 1);
return OK;
}
int LocateElem (SqList *l,ElemType e,Status (*compare)(ElemType,ElemType)) {
//顺序表已经存在,compare()是数据元素判定函数(满足的情况为1,不是的情况下为0)
//操作结果:返回顺序表中第一个满足关系compare()的数据元素的位置
//如果元素不存在的话,返回0
ElemType *p;
int i = 1;//i的初始值为第一个元素的位置
p = l->elem;
while (i <= l->length &&!compare (*p++,e)) {
i++;
}
if (i <= l->length) {
return i;
}else {
return 0;
}
}
Status PriorElem (SqList *l,ElemType cur_e,ElemType *pre_e) {
//初始条件:顺序表已经处在
//操作结果:若cur_e是顺序表的数据元素,且不是第一项的话,则pre_e返回的是它的前驱
//否则操作失败。pre_e没有定义
int i = 2;
ElemType *p = l->elem + 1;
while (i <= l->length && *p!=cur_e) {
i++;
p++;
}
if (i > l->length) {
return INFEASIBLE;
}else {
*pre_e = *--p;
return OK;
}
}
Status NextElem (SqList *l,ElemType cur_e,ElemType *next_e) {
//初始条件:顺序表已经存在
//操作结果:若cur_e是其中的数据元素,并且不是最后一个。着next_e返回它的后继。否则操作失败,next_e没有定义
int i = 1;
ElemType * p = l->elem;
while (i < l->length && *p!= cur_e){
i++;
p++;
}
if (i >= l->length) {
return INFEASIBLE;
}else {
*next_e = *(p + 1);
return OK;
}
}
Status ListInsert (SqList *l,int i,ElemType e) {
//初始条件:1<=i<=l->listsize + 1
//操作结果:在顺序表第i个位置之前插入新的数据元素e。顺序表的长度加1
ElemType *newElem,*q,*p;
if (i <1 || i > l->length + 1) {//i的值是不合法
return ERROR;
}
if (l->length >=l->listsize) {//当前的储存空间已满,增加分配
if (!(newElem = (ElemType*)realloc(l->elem,(l->listsize + LISTINCREMENT)*sizeof(ElemType)))) {
exit (OVERFLOW);
}
l->elem = newElem;
l->listsize+=LISTINCREMENT;
}
q = l->elem + i - 1;//要插入的位置的地址
for (p = l->elem + l->length - 1;p >=q;p--) {
*(p + 1) = *(p);
}
*q = e;//插入e
l->length++;
return OK;
}
Status ListDelete (SqList *l,int i,ElemType *e) {
//
ElemType *p,*q;
if (i < 1 || i > l->length) {
return ERROR;
}
p = l->elem + i - 1;//要删除的位置
*e = *p;
for (q = l->elem + l->length - 1;p < q;p++) {
*p = *(p+1);
}
l->length--;
return OK;
}
Status ListTraverse (SqList *l,void (*visit)(ElemType e)) {
ElemType *elem;
int i;
elem = l->elem;
for (i = 0;i < l->length;i++) {
visit (l->elem[i]);
}
printf("\n");
return OK;
}