顺序表


#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值