c語言將兩個遞增的順序表合併爲一個遞減的順序表

eg:順序表A:1 3 5 7
順序表B:2 4 6 8
合併後的表C:8 7 6 5 4 3 2 1
**思路:**從後往前遍歷順序表A和B,如果當前A表的數大於等於B表的數,則將A表的數存入C,A的元素下標往前移一位,否則,將B表的數存入C表,B的元素下標往前移一位B;最後再把其中一個未遍歷完的表存入C表。

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100 // 線性表存儲空間的初始分配量 
#define LISTINCREMENT 10 // 線性表存儲空間的初分配增量 
#define OVERFLOW -1 
#define OK 1
typedef int ElemType;
typedef int Status;

typedef struct {
	ElemType *elem; // 存儲空間基址 
	int length; // 當前長度 
	int listsize; // 當前分配的存儲容量 
}SqList;

//初始化線性表 
Status InitList_Sq(SqList *L) {
	L -> elem = (ElemType *) malloc (LIST_INIT_SIZE * sizeof(ElemType));
	if (!L -> elem) exit(OVERFLOW); // 存儲分配失敗 
	L -> length = 0; // 空表長度爲0 
	L -> listsize = LIST_INIT_SIZE; // 初始存儲容量 
	return OK;
}

//創建有序表並賦值 
void Create_Sq(SqList *L) {
	int n; 
	printf("\n輸入該有序表元素的個數:");
	scanf("%d", &n);
	while (n <= 0 || n > 100) {
		printf("\n非法輸入,請輸入大於0且小於100的數:");
    	scanf("%d", &n);
	} 
    L -> length = n; // 創建長度爲n的順序表 
    printf("\n依次輸入這%d個數(從小到大輸入):\n", n);
    for (int i = 0; i < n; i++) { // 輸入該順序表的元素 
    	scanf("%d", &L -> elem[i]);
	}
}

//輸出有序表 
void Print_Sq(SqList L) {
	for (int i = 0; i < L.length; i++) {
		if(!i) printf("%d", L.elem[i]);
		else printf(" %d", L.elem[i]);
	}
	printf("\n");
}

//將兩個有序遞增的順序表合併爲一個有序遞減的順序表 
void Merge_Sq(SqList *la, SqList *lb, SqList *lc) { 
	InitList_Sq(lc); // 初始化線性表lc 
	lc -> length = la -> length + lb -> length; // lc表的長度爲la表和lb表的長度和 
	int i = la -> length - 1, j = lb -> length - 1, k = 0; // 找出兩表的末位置並定義新表元素的開始 
	while (i >= 0 && j >= 0) {
		if (la -> elem[i] >= lb -> elem[j]) { // 如果當前la表的元素大於等於lb表的元素,將la的元素賦給lc,同時la的元素往前挪一位 
			lc -> elem[k++] = la -> elem[i];
			i--;
		} else {  // 如果當前lb表的元素大於la表的元素,將lb的元素賦給lc,同時lb的元素往前挪一位
			lc -> elem[k++] = lb -> elem[j];
			j--;
		}
	}
	while (i >= 0) { // 如果la表中還有元素,依次賦值給lc
		lc -> elem[k++] = la -> elem[i];
		i--;
	}
	while (j >= 0) { // 如果lb表中還有元素,依次賦值給lc
		lc -> elem[k++] = lb -> elem[j];
		j--;
	}
}

int Check_Sq(SqList *la) { // 判斷順序表是否爲遞增 
	int flag = 0;
	for (int i = 1; i < la -> length; i++) {
		if(la -> elem[i] < la -> elem[i-1]) flag = 1;
	}
	return flag;
}

int main() {
	SqList la, lb, lc;
    InitList_Sq(&la); // 初始化線性表la 
    InitList_Sq(&lb); // 初始化線性表lb 
	InitList_Sq(&lc); // 初始化線性表lc 
	
	printf("\n創建一個有序表A\n");
    Create_Sq(&la); // 創建線性表la 
    int ans = Check_Sq(&la);
    while (ans == 1) {
    	printf("\n非法順序輸入,該序列爲非遞增!請重新輸入該有序表\n");
		Create_Sq(&la); // 創建線性表la 
		ans = Check_Sq(&la);
	}
    printf("\n創建成功!\n"); 
    	
    printf("\n創建一個有序表B\n");
    Create_Sq(&lb); // 創建線性表lb
	int ans1 = Check_Sq(&lb); 
    while (ans1 == 1) {
    	printf("\n非法順序輸入,該序列爲非遞增!請重新輸入該有序表\n");
		Create_Sq(&lb); // 創建線性表lb
		ans1 = Check_Sq(&lb);
	} 
	printf("\n創建成功!\n"); 
    
    printf("\n順序表A的數據:\n");
	Print_Sq(la); // 輸出線性表la
	printf("\n順序表B的數據:\n");
	Print_Sq(lb); // 輸出線性表lb
	
    Merge_Sq(&la, &lb, &lc); //將la順序表和lb順序表合併爲一個有序遞減的順序表lc 
    printf("\n順序表C的數據:\n");
    Print_Sq(lc); // 輸出線性表lc 
    return 0;
}
發佈了63 篇原創文章 · 獲贊 10 · 訪問量 9759
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章