数据结构算法(一)

2014-11-24 02:45:30 · 作者: · 浏览: 3

Void union(List &La,List Lb)

//将所有在线性表Lb中但不在La中的数据元素插入到La中

{

La_len = ListLength(La);Lb_len =ListLength(Lb);//求线性表的长度

For(i= 1;i<=Lb_len;i++)

{

GetElem(Lb,i,e);//取Lb中第i个数据元素赋给e

If(!LocateElem(La,e,equal))ListInsert(La,++La_len,e);//la中不存在和e相同的数据元素,则插入之

}

}

***************************************************************************************************************************

Void MergeList(List La,List Lb,List &Lc)

{

//已知线性表La和Lb中的数据元素按值非递减排列

//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列

InitList(Lc);

i=j=1;k=0;

La_len =ListLength(La);Lb_len = ListLength(Lb);

While((i<=La_len)&&(j<=Lb_len)) //La和Lb均非空

{

GetElem(La,i,ai); GetElem(Lb,j,bj);

if(ai<=bj)

{

ListInsert(Lc,++k,ai);

++i;

}

else

{

ListInsert(Lc,++k,bj);

++j;

}

}

While(i<=La_len)

{

GetElem(La,i++,ai);

ListInsert(Lc,++k,ai);

}

While(j<=Lb_len)

{

GetElem(Lb,j++,bj);

ListInsert(Lc,++k,bj);

}

}

*************************************************************************************************************

3.构建一个空的线性表L

StatusInitList_Sq(SqList &L)

{

L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!L.elem) exit(OVERFLOW);//存储分配失败

L.length = 0;//空表长度为0

L.listsize = LIST_INIT_SIZE;//初始存储容量

return OK;

}

*************************************************************************************************************************

StatusListInsert_Sq(SqList &L,int I,ElemType e)

//在顺序线性表L中第i个位置之前插入新的元素e,i的合法值为1<=i<=ListLength_Sq(L)+1

{

if(i<1 || i>L.length+1) returnERROR; //i值不合法

if(L.length>=L.listsize) //当前存储空间已满,增加分配

{

Newbase= (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));

if(!newbase) exit(OVREFLOW);//存储分配失败

L.elem = newbase;//新基址

L.listsize+=LISTINCREMENT;//增加存储容量

}

q = &(L.elem[i-1]);//q为插入位置

for(p =&(L.elem[L.length-1]);p>=q;--p)

*(p+1) = *p;//插入位置及之后的元素右移

*q = e;//插入e

++L.length;//表长增1

return OK;

}

*******************************************************************************************************************************

StatusListDelete_Sq(SqList &L,int i,ElemType &e)

{

//在顺序线性表L中删除第i个元素,并用e返回其值,i的合法值为1<=i<=ListLength-Sq(L)

if(i<1|| i>L.length+1) return ERROR; //i值不合法

p= &(L.elem[i-1]);//p为被删除元素的位置

e= *p;//被删除元素的值赋给e

q= L.elem+L.length-1;//表尾元素的位置

for(++p;p<=q;++p)

*(p-1) = *p;//被删除元素之后的元素左移

--L.length;//表长减1

returnOK;

}

**********************************************************************************************************************************************

6.在顺序线性表L中查找第1个值与e满足compare()的元素的位序,若找到返回其在L中的位序,否则返回0

intLocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))

{

i=1;//i的初值为第1个元素的位序

p = L.elem;//p的初值为第一个元素的存储位置

while(i<=L.length&&!(*compare)(*p++,e))

++i;

if(i<=L.length) return i;

else return 0;

}

****************************************************************************************************************************************

VoidMergeList_Sq(SqList La,SqList Lb,SqList &Lc)

{

//已知线性表La和Lb中的数据元素按值非递减排列

//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列

pa = La.elem;

pb =Lb.elem;

Lc.listsize =Lc.length = La.length + Lb.length;

pc = Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));

if(!Lc.elem)exit(OVERFLOW);//存储分配失败

pa_last = La.elem+La.length-1;

pb_last=Lb.elem_Lb.length-1;

while(pa<=pa_last&&pb<=pb_last)

{

if(*pa<*pb) *pc++=*pa++;

else *pc++=*pb++;

}

While(pa<=pa_last)*pc+==*pa++;

While(pb<=pb_last)*pc+==*pb++;

}

******************************************************************