return 0;
}
//8, PriorElem(L,cur_e,&pre_e) 初始条件:顺序表L已存在。
//操作结果:若cur_e是L的数据元素,且不是第⼀个,则⽤pre_e返回它的前驱,否则操作失败,pre_e⽆定义。
Status PriorElem(Sqlist L,ElemType cur_e,ElemType *pre_e){
ElemType *p =L.elem+1; //指针变量p 指向第⼆个数据元素
int i =2;
while(i<=L.length && (*p)!=cur_e){ //注意不能写成,(*p++)!=cur_e,虽然它先判断*p,在+1,
//但是在条件不成⽴时会多后移⼀个位置
p++;
++i;
}
if(i>L.length){
return ERROR;
}else{
*pre_e=(*--p); //p先⾃减,pre_e就指向该数据元素的前驱结点
return OK;
}
}
//9, NextElem(L,cur_e,&next_e) 初始条件:顺序表L已存在。
//操作结果:若cur_e是L的数据元素,且不是第⼀个,则⽤next_e返回它的前驱,否则操作失败,next_e⽆定义。
Status NextElem(Sqlist L,ElemType cur_e,ElemType *next_e){
ElemType *p =L.elem;
int i=1;
while(i
=L.length){
return ERROR;
}else{
*next_e =(*++p); //next_e指向该数据元素的后继结点
return OK;
}
}
//10, ListInsert(Sqlist *L,i,e) 初始条件:顺序表L已存在,1<=i<=ListLength(L)+1。
//操作结果:在L中第i个位置之前插⼊新的数据元素e,L的长度加1
/*
书中算法2.4
算法语⾔描述:
1,检查插⼊位置i的有效性,插⼊位置i的有效范围是1<=i<=ListLength(L)+1(注意:顺序表尾也能执⾏插⼊操作)。
2,在插⼊之前先检查顺序表是否已满(判断顺序表的length是否等于listsize),在顺序表满的时候不能进⾏插⼊运算,需要申请内存空间。
3,后移i位置以后的数据元素,为新数据元素让去第i个位置。
4,将新元素e插⼊第i个位置。
5,将当前的顺序表length加1.
*/
Status ListInsert(Sqlist *L,int i,ElemType e){
ElemType *q,*p,*newbase=NULL;
//第⼀步
if(i<1 || i>(*L).length+1){ //i的值不合法
return ERROR;
}
//第⼆步
if( (*L).length >=(*L).listsize){ /* 当前存储空间已满,增加分配 */
newbase =(ElemType *)realloc((*L).elem , ((*L).listsize+LISTADD)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
(*L).elem =newbase; //新基址
(*L).listsize +=LISTADD; //增加存储容量
}
//第三步
q =&((*L).elem[i-1]); //q为插⼊位置(或q =(*L).elem+i-1。)
for(p =&((*L).elem[(*L).length-1]);p >=q;--p){ //或p =((*L).elem+(*L).length-1)
*(p+1) =*p;