顺序表的定义:
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
struct SqList{
ElemType *elem;
int listsize;
int length;
}SqList;
status ListInit_Sq(SqList &L)
{
L.elem=(ElemType*)malloc(LIST_IINIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(0);
L.listsize=LIST_INIT_SIZE;
L.length=0;
return OK;
}
顺序表的插入操作(从新分配所有空间)
status ListInsert_Sq(SqList &L,int i,ElemType elem)
{
if(i<0||i>L.length)//插入位置有误
return ERROR;
if(L.listsize==L.length){//需要扩展空间
ElemType *pe=0;
pe=(ElemType*)malloc((L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!pe)
exit(0);
for(int index=0;index<i;++i){
pe[index]=L.elem[index];
}
pe[i]=elem;
for(int index=i;index<L.length;++i){
pe[index+1]=L.elem[index];
}
L.elem=pe;
++L.length;
L.listsize+=LISTINCREMENT;
}//无需增加空间,只是搬动元素
for(int index=L.length;index>i;--index){
L.elem[index]=L.elem[index-1];
}
L.elem[i]=elem;
++L.length;
}
//算法改进:
//注意:
//线性表的位置参数i映射到顺序表中对应的是下表为i-1的元素值
//在第i个元素之前插入一个元素时,需将第n至第i个元素向后移动一个位置
status ListInsert(SqList &L,int i,ElemType elem)
{
if(i<1||i>L.length+1)
return ERROR;
if(L.length>=L.listsize){
ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LIST_INCREMENT;
}
q=&(L.elem[i-1]);
for(ElemType *p=L.elem+L.length;p!=q;--p){
*p=*(p-1);
}
L.elem[i]=elem;
++L.length;
}
顺序表的删除操作:
status ListDelete_sq(SqList &L,int i,ElemType &e)
{
if(i<1||I>L.length)
exit(ERROR);
e=(L.elem)[i-1];
for(int index=i-1;index<L.length-1;++index){
(L.elem)[index]=(L.elem)[index+1];
}
--L.length;
return OK;
}
线性表初始化、插入、删除操作
最新推荐文章于 2023-09-11 22:06:15 发布