合并两个非递减排列的线性表 By C

    技术2026-03-06  5

    使用的数据结构:

    线性表 非递减序列:123456555789非递增排列:655553221递增:123456递减:654321

    使用两种编程的方式,本质都一样的,具体可见 Data Structure - 基于realloc可自动扩展的顺序表 By C里面写到有关于,指针,地址,数组的关系。

    第一个方式,里面的insert方式,也可以换成数组直接写进去。第二个方式即纯指针操作 void MergeList_Sq(Sqlist La, Sqlist Lb, Sqlist& Lc) { /* 已知顺序线性表La和Lb的元素按值非递减排列 归并La和Lb得到新的顺序表Lc Lc的元素也按值非递减排列 */ int LaLength = La.length; int LbLength = Lb.length; ElemType* LaP = La.elem; ElemType* LbP = Lb.elem; ElemType* LcP = Lc.elem; int t = 0; int k = 0; for (int i = 0; i < LaLength; i++) { if (t+1==LbLength) //当b子串放置满时,将a追加在其后 { for ( ;i < LaLength; i++) { ListInsert_sq(Lc, k++, LaP[i]); } return; } if (i+1 == LaLength) //当a子串放置完时,将b追加在其后 { for (;t < LbLength; t++) { ListInsert_sq(Lc, k++, LaP[t]); } return; } if (LaP[i] <= LbP[t]) { ListInsert_sq(Lc, k++, LaP[i]); if (LaP[i] = LbP[t]) { ListInsert_sq(Lc, k++, LbP[t++]); } } else { ListInsert_sq(Lc, k++, LbP[t++]); i--; } } } void MergeList_Sq_Second(Sqlist La, Sqlist Lb, Sqlist& Lc) { Lc.listsize = Lc.length = La.length + Lb.length; ElemType* pc = Lc.elem = (ElemType*)malloc(Lc.length * sizeof(ElemType)); if (!pc) { exit (OVERFLOW); } ElemType* pa = La.elem, * pb = Lb.elem; ElemType* pa_last = pa + La.length, *pb_last = pb + Lb.length; while (pa<pa_last&&pb<pb_last) { if (*pa>*pb) { *pc++ = *pb++; } else if(*pa==*pb) { *pc++ = *pa++; *pc++ = *pb++; } else { *pc++ = *pa++; } } while (pa<pa_last) { *pc++ = *pa++; } while (pb<pb_last) { *pc++ = *pb++; } }

    前两行,为输入的第一个线性表中两行,第二个后四,结果
    Processed: 0.014, SQL: 9