顺序表

来源:互联网 发布:淘宝大学图片 编辑:程序博客网 时间:2024/04/30 11:41
#define LIST_INIT_SIZE 10#define LISTINCREMENT 5typedef 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()的数据元素的位置//如果元素不存在的话,返回0ElemType *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。顺序表的长度加1ElemType *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;//插入el->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;}

原创粉丝点击