C++實現(xiàn)線性表有序表的合并方式(順序表實現(xiàn)and鏈表實現(xiàn))
更新時間:2024年04月23日 11:06:59 作者:Daydreamer_cl
這篇文章主要介紹了C++實現(xiàn)線性表有序表的合并方式(順序表實現(xiàn)and鏈表實現(xiàn)),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
有序表的合并:
- 已知線性表La和Lb中的元素按值非遞減有序排列
- 現(xiàn)要求將La和Lb歸并為一個新的線性表Lc
- 且Lc中的數(shù)據(jù)元素仍按值非遞減有序排列
一、順序表實現(xiàn)
#include<iostream>
using namespace std;
#define MAXSIZE 100 //定義最大存儲空間
//順序表的定義
struct SqList
{
int* Elme; //動態(tài)數(shù)組
int Length; //元素個數(shù)
};
//初始化
bool initList_Sq(SqList& L)
{
L.Elme = new int[MAXSIZE]; //為順序表分配空間
if (!L.Elme)
{
exit(0); //分配失敗退出系統(tǒng)
}
L.Length = 0; //空表長度為0
return true; //分配成功返回1
}
//插入
bool Listinsert_Sq(SqList& L, int i, int e)
{
if (i < 1 || i > L.Length + 1) //判斷輸入的i釋放合法
{
return false;
}
if (L.Length == MAXSIZE) //判斷空間是否已滿
{
return false;
}
for (int j = L.Length - 1; j >= i - 1; j--)
{
L.Elme[j + 1] = L.Elme[j]; //將插入位置及之后的元素后移
}
L.Elme[i - 1] = e; //將元素e放入位置i
L.Length++; //表長加一
return true;
}
//遍歷
void ListPrint_Sq(SqList L)
{
for (int j = 0; j < L.Length; j++)
{
cout << L.Elme[j] << " ";
}
cout << endl;
}
//線性表有序表的合并
void MergeList_Sq(SqList La, SqList Lb, SqList& Lc)
{
//指針pa,pb,pc的初值分別指向兩個表的第一個元素
int* pa = La.Elme;
int* pb = Lb.Elme;
Lc.Length = La.Length + Lb.Length; //新表長度等于兩表之和
Lc.Elme = new int[Lc.Length]; //為新表分配存儲空間
int* pc = Lc.Elme;
//pa_last、pb_last分別指向表中最后一個元素
int *pa_last = &La.Elme[La.Length - 1];
int* pb_last = &Lb.Elme[Lb.Length - 1];
//判斷兩表是否為空,或當(dāng)其中一表摘取完,則停止循環(huán)
while (pa <= pa_last && pb <= pb_last)
{
if (*pa <= *pb) //依次摘取兩表中值較小的結(jié)點
{
*pc++ = *pa++;
}
else
{
*pc++ = *pb++;
}
}
//如果條件為真,表明Lb表已經(jīng)到達(dá)表尾,將La中剩余元素加入Lc
while (pa <= pa_last)
{
*pc++ = *pa++;
}
//如果條件為真,表明La表已經(jīng)到達(dá)表尾,將Lb中剩余元素加入Lc
while (pb <= pb_last)
{
*pc++ = *pb++;
}
}
int main()
{
SqList La; //創(chuàng)建線性表La
initList_Sq(La); //初始化
//創(chuàng)建數(shù)組并把數(shù)組中元素插入到La中
int arr1[3] = { 1,7,8 };
for (int i = 1; i <= 3; i++)
{
Listinsert_Sq(La, i, arr1[i - 1]);
}
cout << "合并前La中元素:" << endl;
ListPrint_Sq(La); //遍歷La
SqList Lb;//創(chuàng)建線性表Lb
initList_Sq(Lb); //初始化
//創(chuàng)建數(shù)組并把數(shù)組中元素插入到Lb中
int arr2[6] = { 2,4,6,8,10,11 };
for (int i = 1; i <= 6; i++)
{
Listinsert_Sq(Lb, i, arr2[i - 1]);
}
cout << "合并前Lb中元素:" << endl;
ListPrint_Sq(Lb); //遍歷La
SqList Lc;
MergeList_Sq(La, Lb, Lc); //合并La、Lb到Lc中
cout << "合并后Lc中元素:" << endl;
ListPrint_Sq(Lc); //遍歷Lc
system("pause");
return 0;
}二、鏈表表實現(xiàn)
#include<iostream>
using namespace std;
//結(jié)點
struct Lnode
{
int Data; //數(shù)據(jù)域
Lnode* Next; //指針域
};
typedef Lnode* LinkList; //將LinkList定義為Lnode*類型
//初始化
void Listinit_L(LinkList& L)
{
L = new Lnode;
L->Next = NULL;
}
//插入
bool Listinsert_L(LinkList& L, int i, int e)
{
Lnode* p = L;
int j = 0;
while (p && j < i - 1) //利用循環(huán)找到i-1的結(jié)點
{
p = p->Next;
++j;
}
if (!(p) || j > i - 1)//判斷輸入的i是否合法
{
return false;
}
else
{
Lnode* s = new Lnode; //創(chuàng)建新結(jié)點s
s->Data = e; //將輸入的元素e存入s的數(shù)據(jù)域
s->Next = p->Next; //s指向第i個結(jié)點
p->Next = s; //i-1結(jié)點指向s地址
return true;
}
}
//打印
void ListPrint_L(LinkList L)
{
Lnode* p = L->Next; //p指向第一個元素
while (p)
{
cout << p->Data << " ";
p = p->Next;
}
cout << endl;
}
//有序表的合并
void MergeList_L(LinkList La, LinkList Lb, LinkList& Lc)
{
Lnode* pa = La->Next;//pa指向La中第一個元素
Lnode* pb = Lb->Next;//pb指向Lb中第一個元素
Lnode* pc = Lc = La;//使用La的頭結(jié)點作為Lc的頭結(jié)點
while (pa && pb) //pa或pb為空時停止循環(huán)
{
//判斷pa的值是否小于等于pb的值,為真插入pa的值,不為真插入pb的值
if (pa->Data <= pb->Data)
{
pc->Next = pa;
pc = pa;
pa = pa->Next;
}
else
{
pc->Next = pb;
pc = pb;
pb = pb->Next;
}
}
pc->Next = pa ? pa : pb; //利用三目運(yùn)算插入pa或pb中剩余內(nèi)容
delete Lb; //釋放Lb頭結(jié)點
}
int main()
{
//1.創(chuàng)建單鏈表La
LinkList La;
Listinit_L(La); //初始話
//將數(shù)組中的數(shù)據(jù)插入La
int arr1[3] = { 1,7,8 };
for (int i = 1; i <= 3; i++)
{
Listinsert_L(La, i, arr1[i-1]);
}
cout << "合并前La中的數(shù)據(jù)為:" << endl;
ListPrint_L(La);
//2.創(chuàng)建單鏈表Lb
LinkList Lb;
Listinit_L(Lb); //初始話
//將數(shù)組中的數(shù)據(jù)插入Lb
int arr2[6] = {2,4,6,8,10,11};
for (int i = 1; i <= 6; i++)
{
Listinsert_L(Lb, i, arr2[i - 1]);
}
cout << "合并前Lb中的數(shù)據(jù)為:" << endl;
ListPrint_L(Lb);
//3.創(chuàng)建Lc,將La與Lb中的值合并到Lc
LinkList Lc;
MergeList_L(La, Lb, Lc);
cout << "合并后Lc的值為:" << endl;
ListPrint_L(Lc);
system("pause");
return 0;
}三、最終結(jié)果

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++實現(xiàn)LeetCode(53.最大子數(shù)組)
這篇文章主要介紹了C++實現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
在 VSCode 中配置 C++ 開發(fā)環(huán)境的詳細(xì)教程
本文詳細(xì)介紹了如何在Visual Studio Code(VSCode)中配置C++開發(fā)環(huán)境,包括安裝必要的工具、配置編譯器、設(shè)置調(diào)試環(huán)境等步驟,通過這些步驟,你可以快速搭建C++開發(fā)環(huán)境,實現(xiàn)高效編程,感興趣的朋友一起看看吧2025-01-01
C++ 內(nèi)存分配處理函數(shù)set_new_handler的使用
這篇文章主要介紹了C++ 內(nèi)存分配處理函數(shù)set_new_handler的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C語言實現(xiàn)兩個遞減數(shù)列中尋找某一個數(shù)
這篇文章主要介紹了C語言實現(xiàn)兩個遞減數(shù)列中尋找某一個數(shù),是一類經(jīng)典的數(shù)組操作算法,需要的朋友可以參考下2014-09-09

