2個順序表合併

        在數據結構中,有時需要把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;
}




結果如下:
在這裏插入圖片描述

發佈了524 篇原創文章 · 獲贊 798 · 訪問量 208萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章