经典算法之两个有序单链表合并
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; }
相关文章推荐
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 经典算法——合并两个有序链表
- 经典算法学习——合并两个有序链表
- 数据结构——算法之(033)(两个有序单链表合并为一个有序的单链表)
- 算法--合并两个有序数组
- 单链表------合并两个有序链表Ha、Hb到Hc
- 合并两个有序单链表
- 算法题:合并两个有序列表
- [数据结构]单链表 合并两个非递减有序表成新表也是非递减表
- 将两个有序单链表合并
- 基础算法之三: 合并两个有序数组
- 两个有序单链表的合并
- 合并两个有序单链表
- 实现两个有序单链表的合并。要求:随机创建两个单链表,实现单链表的排序,再对两个有序单链表进行合并。
- C++实现两个有序链表合并(17)---《那些奇怪的算法》
- 合并两个有序链表的算法
- 【简单算法】31.合并两个有序数组
- 不开辟新空间,两个有序单链表合并为一个有序单链表
- 算法面试题:找出由两个有序列表合并而成的新列表中的第n个元素
- 【合并两个有序的子数组】算法实现