您的位置:首页 > 其它

经典算法之两个有序单链表合并

2017-12-31 17:51 357 查看
/************************
author's email:wardseptember@gmail.com
date:2017.12.31
单链表应用
************************/
/*
A和B是两个单链表(带表头结点),其中元素递增有序。设计一个算法,将A和B归成一
个按元素值非递减有序的链表C,C由A和B中的结点组成。
*/
#include <iostream>
using namespace std;
#define maxSize 10
typedef struct LNode {
int data;
struct LNode *next;
}LNode;
void createListR(LNode *&p, int *a, int n);//尾插法构造单链表
void printList(LNode *p);
void createListF(LNode *&p, int *a, int n);//头插法构造单链表
void bubbleSort(LNode *L);//按结点值的大小冒泡排序,使之呈递增序列
void merge(LNode *A, LNode *B, LNode *&C);//将A和B合并成非递减有序的C,利用尾插法
void main() {
int a[maxSize] = { 15,46,47,29,19,23,68,79,115,784 };
int b[maxSize] = { 45,11,78,49,56,113,456,741,999,35 };
LNode *A,*B,*C;
A = (LNode*)malloc(sizeof(LNode));
A->next = NULL;
B = (LNode*)malloc(sizeof(LNode));
B->next = NULL;
C = (LNode*)malloc(sizeof(LNode));
C->next = NULL;

cout << "头插法结果为:" << endl;
createListF(A, a, maxSize);//头插法
printList(A->next);

cout << "尾插法结果为:" << endl;
createListR(B, b, maxSize);//尾插法
printList(B->next);

cout << "链表A递增排序后为:" << endl;
bubbleSort(A);
printList(A->next);

cout << "链表B递增排序后为:" << endl;
bubbleSort(B);
printList(B->next);

cout << "将A和B合并成非递减有序的C链表后:" << endl;
merge(A, B, C);
printList(C->next);
}
void createListR(LNode *&p, int *a, int n) {//尾插法构造单链表
LNode *s, *r;
int i;
r = p;
for (i = 0; i < n; ++i) {
s = (LNode*)malloc(sizeof(LNode));
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
void printList(LNode *p) {//输出链表
if (p->next == NULL)
cout << "链表为空!" << endl;
else {
while (p != NULL) {
cout << p->data << ' ';
p = p->next;
}
cout << endl;
}
}
void createListF(LNode *&p, int *a, int n) {//头插法构造链表
LNode *s;
int i;
for (i = 0; i < n; ++i) {
s = (LNode*)malloc(sizeof(LNode));
s->data = a[i];
s->next = p->next;
p->next = s;
}
}
void bubbleSort(LNode *L) {
LNode *p, *tail, *next;
int temp;
if (L->next == NULL)
cout << "链表为空!" << endl;
else {
for (p = L->next; p != NULL; p = p->next)    /*尾指针初始化*/
;
tail = p;
while (tail != L->next)
{
for (p = L->next; p->next != tail; p = p->next)
{
next = p->next;
if (p->data > next->data)    /*相邻节点比较,数据交换*/
{
temp = p->data;
p->data = next->data;
next->data = temp;
}
}
tail = p;    /* p->next == tail,即把tail往前移动一位 */
}
}
}
void merge(LNode *A, LNode *B, LNode *&C) {
LNode *p = A->next;   //p来跟踪A的最小值结点
LNode *q = B->next;   //q来跟踪B的最小值结点
LNode *r;             //r始终指向C的终端结点
C = A;                //A的头结点来做C的头结点
//C->next = NULL;
free(B);
r = C;
while (p != NULL&&q != NULL) {//当p、q都不为空时,选取p与q所指结点中的较小者插入C的尾部
//尾插法建立单链表
if (p->data <= q->data) {
r->next = p;
p = p->next;
r = r->next;
}
else
{
r->next = q;
q = q->next;
r = r->next;
}
}

//以下两个if语句将剩余的结点链接在C的尾部
if (p != NULL)
r->next = p;
if (q != NULL)
r->next = q;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  经典算法 单链表