前提条件:
单链表La和Lb均按值非递减排列,归并为单链表Lc也是按照值非递减排列。
思路:
比较La和Lb中的值,非大的值先插入到Lc中,然后输出检验。
代码如下:
头文件和宏定义(保存为constant.h):
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
函数实现(包括遍历、逆序创建单链表、归并;保存为header.h):
#include"constant.h"
typedef struct LNode
{
ElemType data;
LNode *next;
}LNode,*LinkList;
//遍历:顺序输出单链表
Status ListTraverse(LinkList &L)
{
LinkList p;
p = L->next;
while(p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
return OK;
}
//逆序创建线性单链表
void CreatList(LinkList &L)
{
int n,i;
cout << "输入单链表长度n:";
cin >> n;
cout << endl;
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
cout << "逆序输入要建立的单链表:" << endl;
for (i = n; i > 0; --i)
{
p = (LinkList)malloc(sizeof(LNode));
cin >> p->data;
p->next = L->next;
L->next = p;
}
cout << "现在顺序输出单链表:" << endl;
ListTraverse(L);
}
//两个有序单链表合并为一个单链表
//已知单链线性表La和Lb的元素按照值非递减排列
//归并La和Lb得到新的单链线性表Lc的元素也是按照值非递减排列
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
Lc = pc = La; //用La的头结点作为Lc的头结点
while (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; //插入剩余段
free(Lb); //释放Lb的头结点
typedef struct LNode
{
ElemType data;
LNode *next;
}LNode,*LinkList;
//遍历:顺序输出单链表
Status ListTraverse(LinkList &L)
{
LinkList p;
p = L->next;
while(p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
return OK;
}
//逆序创建线性单链表
void CreatList(LinkList &L)
{
int n,i;
cout << "输入单链表长度n:";
cin >> n;
cout << endl;
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
cout << "逆序输入要建立的单链表:" << endl;
for (i = n; i > 0; --i)
{
p = (LinkList)malloc(sizeof(LNode));
cin >> p->data;
p->next = L->next;
L->next = p;
}
cout << "现在顺序输出单链表:" << endl;
ListTraverse(L);
}
//两个有序单链表合并为一个单链表
//已知单链线性表La和Lb的元素按照值非递减排列
//归并La和Lb得到新的单链线性表Lc的元素也是按照值非递减排列
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
Lc = pc = La; //用La的头结点作为Lc的头结点
while (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; //插入剩余段
free(Lb); //释放Lb的头结点
主函数:
#include "stdafx.h"
#include "header.h"
int main()
{
LinkList La, Lb, Lc;
CreatList(La);
CreatList(Lb);
MergeList(La, Lb, Lc);
cout << "输出合并后的链表:" << endl;
ListTraverse(Lc);
return 0;
}
#include "header.h"
int main()
{
LinkList La, Lb, Lc;
CreatList(La);
CreatList(Lb);
MergeList(La, Lb, Lc);
cout << "输出合并后的链表:" << endl;
ListTraverse(Lc);
return 0;
}