首页 > 其他 > 详细

数据结构算法

时间:2014-02-10 20:46:43      阅读:560      评论:0      收藏:0      [点我收藏+]

      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++;

}

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

8.函数GetElem在单链表中的实现

StatusGetElem_L(LinkList L,int I,ElemType &e)

{

L为带头结点的单链表的头指针,当第i个元素存在时,其值赋给e并返回OK,否则返回error

p= L->next;j=1;//初始化,p指向第一个结点,j为计数器

while(p&&j<i)

  {

    p= p->next;

  ++j;

}

if(!p || j>i)return ERROR;//第i个元素不存在

e =p->data;//取第i个元素

return OK;

}

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

9.在单链表中实现插入与删除

*************插入

StatusListInsert_L(LinkList &L,int I,ElemType e)

{

//在带头结点的单链线性表L中第i个位置之前插入元素e

P= L;j=0;

while(p&&j<i-1)

 {

   p= p->next;++j//寻找第i-1个结点

}

if(!p ||j>i) returnERROR;//i小于1或者大于表长

s =(LinkList)malloc(sizeof(LNode));//生成新结点

s->data = e;

s->next =p->next;

p->next = s;

return OK;

}

**********************删除

StatusListDelete_L(LinkList &L,int i ,ElemType &e)

{

//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值

p=L;j=0;

while(p->next&& j<i-1)

{

       p = p->next;

++j;

}

if(!(p->next)|| j>i-1) return ERROR;//删除位置不合理

q= p-next;p->next = q->next;//删除并释放结点

e= q->data;free(q);

returnOK;

}

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

11.从表尾到表头逆向建立单链表的算法

Void  CreateList_L(LinkList &L,int n)

{

//逆序位输入n个元素的值,建立带表头结点的单链线性表L

L= (LinkList)malloc(sizeof(LNode));

L->next= NULL;//先建立一个带头结点的单链表

for(i=n;i>0;++i)

{

       p=(LinkList)malloc(sizeof(LNode));//生成新结点

scanf(&p->data);//输入元素值

p->next = L->next;L-next =p;//插入到表头

}

}

************************************************************************待续

数据结构算法

原文:http://blog.csdn.net/woailvmengmeng/article/details/19044261

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!