线性表的顺序表示和实现3(归并)

  1 # include <stdio.h>
  2 # include <stdlib.h>
  3 typedef int ElemType;
  4 typedef int Status;
  5 typedef struct sqlist
  6 {
  7     ElemType * elem;
  8     int length;
  9     int listsize;
 10 }SqList;
 11 
 12 Status ListInsert(SqList * L, int i, ElemType e)
 13 {
 14     ElemType *newbase, *p, *q;
 15     if(i < 1 ||i > L->length+1 )
 16         return 0;
 17     if(L->length == L->listsize)
 18     {
 19         newbase = (ElemType *)realloc(L->elem,sizeof(ElemType) * (10+2));//(偷工)
 20         if(!newbase)
 21             exit(1);
 22         L->elem = newbase;
 23         L->listsize += 2;
 24     }
 25 
 26     q = L->elem + i -1;
 27 
 28     for(p = L->elem+L->length-1; p >= q; p--)
 29         *(p+1) = *p;
 30 
 31     *q = e;
 32     L->length++;
 33     return 1;
 34 }
 35 
 36 void MergeList(SqList * La, SqList * Lb, SqList * Lc)
 37 //归并La和Lb得到新的顺序线性表Lc    按非递减排列
 38 {
 39     ElemType *pa, *pa_last, *pb, *pb_last, *pc;//
 40     pa = La->elem;  //pa指向La第一个元素
 41     pb = Lb->elem;  //pb指向Lb第二个元素
 42     Lc->listsize = Lc->length = La->length + Lb->length;//求得La和Lb长度赋给Lc
 43     pc = Lc->elem = (ElemType *)malloc(Lc->listsize * sizeof(ElemType));//分配所需空间
 44     if(!Lc->elem)   //分配失败
 45         exit(1);
 46     pa_last = La->elem + La->length -1; //指向La最后一个元素
 47     pb_last = Lb->elem + Lb->length -1; //指向Lb最后一个元素
 48     while(pa <= pa_last && pb <= pb_last)   //表La和表Lb均有元素没有归并
 49     {
 50         if(* pa <=  * pb)   //La的当前元素不大于Lb当前的元素
 51             *pc++ = *pa++;  //将pa指向的元素赋给pc 后指向下一个单元
 52         else
 53             *pc++ = *pb++;  //将pb指向的元素赋给Pc 后指向下一个单元
 54     }
 55     while(pa <= pa_last)    //表La的元素全都归并
 56         *pc++ = *pa++;  //插入La的剩余元素
 57     while(pb <= pb_last)    //表Lb的元素全都归并
 58         *pc++ = *pb++;  //插入Lb的剩余元素
 59 }
 60 
 61 void InitList(SqList * L)
 62 {
 63     L->elem = (ElemType *)malloc(sizeof(ElemType) * 10);
 64     if(!L->elem)
 65         exit(1);
 66     L->listsize = 10;
 67     L->length = 0;
 68 }
 69 
 70 void print(ElemType c)
 71 {
 72     printf("%d ", c);
 73 }
 74 
 75 void ListTraverse(SqList * L, void (*visit)(ElemType))
 76 {
 77     int i;
 78     ElemType * p = L->elem;
 79     for(i = 1; i <= L->length; i++)
 80         visit(*p++);
 81     printf("\n");
 82 }
 83 
 84 void main(void)
 85 {
 86     SqList La, Lb, Lc;
 87     int j;
 88     InitList(&La);
 89     InitList(&Lb);
 90     for(j = 1; j <= 5; j++)
 91         ListInsert(&La, j, j);
 92     for(j = 5; j <= 10; j++)
 93         ListInsert(&Lb, 1, j);
 94     printf("La = ");
 95     ListTraverse(&La, print);
 96     MergeList(&La, &Lb, &Lc);
 97     printf("Lc = ");
 98     ListTraverse(&Lc, print);
 99 }

猜你喜欢

转载自blog.csdn.net/Cheng__C/article/details/81437121