将两个数组中的元素有序存入到一个链表中(C语言)
2016-01-18 19:05
706 查看
思路:
1、现将数组元素排序
2、再将数组中的元素分别存入链表中
3、合并两个链表
代码实现:
1、现将数组元素排序
2、再将数组中的元素分别存入链表中
3、合并两个链表
代码实现:
</pre><pre code_snippet_id="1558992" snippet_file_name="blog_20160118_6_8274283" name="code" class="cpp">
#include <stdio.h> #include <time.h> #include <stdlib.h> #define N 10 typedef struct LNode { int key; struct LNode*next; } LNode; void printList(LNode *head) /*打印链表元素*/ { while(head) { printf("%5d",head->key); head = head->next; } printf("\n"); } int partition(int *a, int low, inthigh) //快排划分元 { int key =a[low]; while (low< high) { while(high > low && a[high] >= key) --high; if (low< high) a[low++] = a[high]; while(high > low && a[low] <= key) ++low; if (low< high) a[high--] = a[low]; } a[low] = key; return low; } void Qsort(int *a, int low, inthigh) //快排 { if (low>= high || a == NULL) return; int mid =partition(a, low, high); Qsort(a, low, mid - 1); Qsort(a, mid + 1, high); } LNode *merge(LNode*h1, LNode *h2) //合并 { LNode head; LNode *p = &head; while (h1&& h2) { if(h1->key <= h2->key) { p->next = h1; h1 = h1->next; } else { p->next = h2; h2 = h2->next; } p = p->next; } p->next = h1 ? h1 : h2; returnhead.next; } void destroy(LNode *head) //销毁链表 { LNode *p = NULL; while(head) { p = head->next; free(head); head = p; } } void printArray(int *a, int len) //打印数组 { int i; for (i = 0;i < len; ++i) printf("%5d",a[i]); printf("\n"); } LNode *buildList(int *a, int len) //将数组a中的元素存入链表 { LNode head; LNode *p = &head; LNode *q = NULL; int i = 0; for (i =0;i < len; ++i) { q = (LNode*) malloc(sizeof(LNode)); q->key = a[i]; q->next = NULL; p->next=q; p = q; } returnhead.next; } int main(int argc,char* argv[]) { int a ,b ; int i; srand((unsigned)time(NULL)); for (i = 0;i < N; ++i) { a[i] = rand() % 100; b[i] = rand() % 100; } printf("输出随机产生a数组的个数"); printArray(a, N); printf("输出随机产生b数组的个数"); printArray(b, N); Qsort(a, 0, 9); Qsort(b, 0, 9); printf("输出排好序的a数组的个数"); printArray(a, N); printf("输出排好序的b数组的个数"); printArray(b, N); LNode *h1 = buildList(a, N); printf("输出排好序的a链表\n"); printList(h1); LNode *h2 = buildList(b, N); printf("输出排好序的b链表\n"); printList(h2); LNode *p = merge(h1, h2); printf("输出排好序的链表\n"); printList(p); destroy(p); system("pause"); return 0; }
相关文章推荐
- C++学习之继承篇二(隐藏篇)
- C语言 位运算
- C语言 内存四大存储区域
- iOS 学习第十天 C语言 全局变量和局部变量
- C++ primer 学习笔记(第一章)
- C#调用C++Dll
- 【C++探索之旅】第一部分第五课:简易计算器
- 【C++探索之旅】第一部分第五课:简易计算器
- C++ Builder 将数据库数据导出到Excel中总结3
- C++写错误日志函数
- c语言实现二分查找算法
- c++中编译器的作用
- C++学习笔记(四)--编程练习第七章
- C语言【顺序表】顺序表的初始化,头插,尾插,头删,尾删,增删查改,全删
- C++编程中队内联函数的理解和使用
- C语言【顺序表】冒泡排序,一次选出最大最小的数据,二分查找,初始化顺序表
- vs查找内存泄漏
- [置顶]C++ 引用计数技术及智能指针的简单实现
- [置顶]C++对象模型详解
- [置顶]C++ 异常机制分析