在數據結構中,有時需要把2個有序的順序表進行合併,這裏以從小到大進行排序的有序表A、B合併爲有序表C爲例,代碼如下:
// SQListAI.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include <stdlib.h>
#define Maxsize 100
typedef int ElemType;
typedef struct _sqList
{
ElemType data[Maxsize];
int length;
}SqList;
void InitList(SqList &L)
{
L.length = 0;
}
int GetElem(SqList L, int i, ElemType &e)
{
if (i<1 || i>L.length)
return 0;
e = L.data[i - 1];
return 1;
}
//輸出順序表中的每個元素
void printList(SqList L)
{
int i = 0;
while (i<L.length)
{
printf("%d ", L.data[i]);
i++;
if (i%10 ==0) {
printf("\r\n");
}
}
printf("\r\n");
}
//在第i個位置上插入新元素e(1<=i<=ListLength(L)+1)
int ListInsert(SqList &L, int i, ElemType e)
{
int j = 0;
if (i<1 || i>L.length + 1)
return 0;
i--;
for (j = L.length; j > i; j--) { //將邏輯位轉化爲elem的下標
L.data[j] = L.data[j - 1]; //將data[i]及以後元素都後移一位
}
L.data[i] = e;
L.length++; //順序表長度加1
return 1;
}
//刪除第i個元素(1<=i<=ListLength(L))
int ListDelete(SqList &L, int i, ElemType &e)
{
int j = 0;
if (i<1 || i>L.length)
return 0;
i--;
e = L.data[i];
for (j = i; j < L.length - 1; j++) { //將data[i]之後的元素前移一個位置
L.data[j] = L.data[j + 1];
}
L.length--; //順序表長度減1
return 1;
}
//將2個有序的順序表合併
void Merge(SqList L1, SqList L2, SqList &L3)
{
int i = 0, j = 0, k = 0,x=0; //i掃描L1,j掃描L2
int nMin = (L1.length <= L2.length) ? (L1.length) : L2.length;
int nMaxBefore1,nRowMin,nRowMax,nCurMin,nCurMax;
int nTmp;
//1)先解決公共部分
while (i < nMin) {
nRowMin = (L1.data[i] <= L2.data[i]) ? L1.data[i] : L2.data[i];
nRowMax = (L1.data[i] >= L2.data[i]) ? L1.data[i] : L2.data[i];
if (i == 0)
{
L3.data[k] = nRowMin;
k = k + 1;
}
else
{
x = i - 1;
nMaxBefore1 = (L1.data[x] >= L2.data[x]) ? L1.data[x] : L2.data[x];
if (nRowMin <= nMaxBefore1)
{
nCurMin = nRowMin;
nCurMax = nMaxBefore1;
}
else
{
nCurMin = nMaxBefore1;
nCurMax = nRowMin;
}
L3.data[k] = nCurMin;
L3.data[k + 1] = nCurMax;
k = k + 2;
nTmp = (nMaxBefore1 <= nRowMax) ? nRowMax : nMaxBefore1;
}
i++;
j++;
}
//2)解決剩餘部分
//nTmp插入到剩餘的序列中,再把該序列賦給L3
if (nMin == L1.length)
{
for (x = L2.length-1; x > j; x--)
{
if (L2.data[x] > nTmp)
{
L2.data[x+1] = L2.data[x];
L2.data[x] = nTmp;
}
}
for (x = j; x < L2.length + 1; x++)
{
L3.data[k] = L2.data[x];
k++;
}
}
else
{
for (x = L1.length - 1; x > j; x--)
{
if (L1.data[x] > nTmp)
{
L1.data[x + 1] = L1.data[x];
L1.data[x] = nTmp;
}
}
for (x = j; x < L1.length + 1; x++)
{
L3.data[k] = L1.data[x];
k++;
}
}
L3.length = k;
}
//1) 已知一個順序表L,其中的元素遞增有序排列,設計一個算法插入一元素x後保持該順序表仍遞增有序排列。
void insertList(SqList &L, ElemType x)
{
int i = 0, j = 0;
while (i < L.length && x >= L.data[i]) //查找插入位置i
i++;
for (j = L.length - 1; j >= i; j--)
L.data[j + 1] = L.data[j]; //移出插入x的位置
L.data[i] = x;
L.length++; //將x插入,順序表長度增1
}
int LocateElem(SqList L, ElemType e)
{
int i = 0;
while (i < L.length && L.data[i] != e)
i++;
if (i > L.length)
return 0;
else
return (i + 1);
}
int _tmain(int argc, _TCHAR* argv[])
{
SqList listA,listB,listC;
//設置前5個元素
listA.data[0] = 3;
listA.data[1] = 7;
listA.data[2] = 15;
listA.data[3] = 18;
listA.data[4] = 26;
listA.length = 5;
//設置前3個元素
listB.data[0] = 4;
listB.data[1] = 11;
listB.data[2] = 20;
listB.length = 3;
//listC是listA和listB的合併集
Merge(listA, listB, listC);
printf("listA: ");
printList(listA);
printf("listB: ");
printList(listB);
printf("listC = A U B: ");
printList(listC);
system("pause");
return 0;
}
結果如下: