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 }
线性表的顺序表示和实现3(归并)
猜你喜欢
转载自blog.csdn.net/Cheng__C/article/details/81437121
今日推荐
周排行