链表操作一【合并链表】【严蔚敏】

来源:互联网 发布:linux 解压war包 编辑:程序博客网 时间:2024/06/05 19:17
 struct SqList {   ElemType *elem; // 存储空间基址   int length; // 当前长度   int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) };
void MergeList(SqList La,SqList Lb,SqList &Lc) // 算法2.2 { // 已知线性表La和Lb中的数据元素按值非递减排列。   // 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列   int i=1,j=1,k=0;   int La_len,Lb_len;   ElemType ai,bj;   InitList(Lc); // 创建空表Lc   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) // 表La非空且表Lb空   {     GetElem(La,i++,ai);     ListInsert(Lc,++k,ai);   }   while(j<=Lb_len) // 表Lb非空且表La空   {     GetElem(Lb,j++,bj);     ListInsert(Lc,++k,bj);   } }


void MergeList(SqList La,SqList Lb,SqList &Lc) // 算法2.7 { // 已知顺序线性表La和Lb的元素按值非递减排列。   // 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列   ElemType *pa,*pa_last,*pb,*pb_last,*pc;   pa=La.elem;   pb=Lb.elem;   Lc.listsize=Lc.length=La.length+Lb.length;//不用InitList()创建空表Lc   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) // 表La和表Lb均非空   { // 归并     if(*pa<=*pb)       *pc++=*pa++;     else       *pc++=*pb++;   }   while(pa<=pa_last) // 表La非空且表Lb空     *pc++=*pa++; // 插入La的剩余元素   while(pb<=pb_last) // 表Lb非空且表La空     *pc++=*pb++; // 插入Lb的剩余元素 }


void MergeList(SqList La,SqList Lb,SqList &Lc) { // 另一种合并线性表的方法(根据算法2.7下的要求修改算法2.7)   ElemType  *pa,*pa_last,*pb,*pb_last,*pc;   pa=La.elem;   pb=Lb.elem;   Lc.listsize=La.length+Lb.length; // 此句与算法2.7不同   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) // 表La和表Lb均非空     switch(comp(*pa,*pb)) // 此句与算法2.7不同     {       case  0: pb++;       case  1: *pc++=*pa++;                break;       case -1: *pc++=*pb++;     }   while(pa<=pa_last) // 表La非空且表Lb空     *pc++=*pa++;   while(pb<=pb_last) // 表Lb非空且表La空     *pc++=*pb++;   Lc.length=pc-Lc.elem; // 加此句 }


 void MergeList(LinkList La,LinkList &Lb,LinkList &Lc)// 算法2.12 { // 已知单链线性表La和Lb的元素按值非递减排列。   // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列   LinkList pa=La->next,pb=Lb->next,pc;   Lc=pc=La; // 用La的头结点作为Lc的头结点   while(pa&&pb)     if(pa->data<=pb->data)     {       pc->next=pa;       pc=pa;       pa=pa->next;     }     else     {       pc->next=pb;       pc=pb;       pb=pb->next;     }   pc->next=pa?pa:pb; // 插入剩余段   free(Lb); // 释放Lb的头结点   Lb=NULL; }




0 0
原创粉丝点击