博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每天一个小算法(2)----合并两个有序链表
阅读量:4482 次
发布时间:2019-06-08

本文共 3331 字,大约阅读时间需要 11 分钟。

每天一个小算法还是有点没时间,尽量抽出时间写一写。

今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来。

代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^。

在Linux/g++下编译运行成功。

合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾。

 

1 #include 
2 #include
3 #include
4 typedef struct Node 5 { 6 int data; 7 Node* next; 8 }Node, *List; 9 10 void sortList(List aList) //对随机数字链表排序 11 { 12 if(aList == NULL) 13 return; 14 15 List pT = aList->next; 16 aList->next = NULL; 17 while ( pT != NULL ) 18 { 19 List pr = pT; 20 List pU = pT; 21 List pN = NULL; 22 while ( pU->next != NULL ) 23 { 24 if ( pr->data <= pU->next->data ) 25 { 26 pN = pU; 27 pr = pU->next; 28 } 29 30 pU = pU->next; 31 } 32 33 if ( pN != NULL ) 34 { 35 pN->next = pr->next; 36 } 37 else 38 { 39 pT = pT->next; 40 } 41 pr->next = aList->next; 42 aList->next = pr; 43 } 44 } 45 46 List createList(int num) //随机生成数字,构造链表 47 { 48 List aList = (List)malloc(sizeof(Node)); 49 aList->next = NULL; 50 aList->data = 0; 51 Node* qT = aList; 52 53 // srand((int)time(0)); 54 for ( int i=0; i< num; ++i) 55 { 56 Node* pTN = (Node*)malloc(sizeof(Node)); 57 pTN->data = rand()%100; 58 pTN->next = NULL; 59 qT->next = pTN; 60 qT = pTN; 61 } 62 sortList(aList); 63 return aList; 64 } 65 66 void printList(List aList) //打印链表 67 { 68 if ( aList == NULL || aList->next == NULL ) 69 return; 70 71 Node* pT = aList->next; 72 printf("element of list:\n\t"); 73 while( pT != NULL ) 74 { 75 printf("%d ", pT->data); 76 pT = pT->next; 77 } 78 79 printf("\n"); 80 } 81 82 void deleteList(List aList) //删除链表 83 {} 84 85 void mergeList(List aList, List bList) //合并链表 86 { 87 if ( aList == NULL || bList == NULL ) 88 return; 89 90 Node* pA = aList->next; 91 Node* pB = bList->next; 92 Node* pT = NULL; 93 Node* pN = bList; 94 bList->next = NULL; 95 delete aList; 96 97 while ( pA != NULL && pB != NULL ) 98 { 99 if ( pA->data < pB->data )100 {101 pT = pA->next;102 pA->next = pN->next;103 pN->next = pA;104 pN = pN->next;105 pA = pT;106 }107 else108 {109 pT = pB->next;110 pB->next = pN->next;111 pN->next = pB;112 pN = pN->next;113 pB = pT; 114 }115 }116 117 if ( pA == NULL )118 {119 pN->next = pB;120 }121 122 if ( pB == NULL )123 {124 pN->next = pA;125 }126 }127 128 int main(int argc, char const *argv[])129 {130 srand((int)time(0));131 List aList = createList(5);132 List bList = createList(7);133 printList(aList);134 printList(bList);135 136 mergeList(aList, bList);137 printList(bList);138 139 deleteList(bList);140 141 return 0;142 }

 

转载于:https://www.cnblogs.com/yrpen/p/3783490.html

你可能感兴趣的文章
属性动画
查看>>
Hadoop集群时钟同步
查看>>
C++二维数组讲解、二维数组的声明和初始化
查看>>
纹理映射和混合
查看>>
PHP获取域名、IP地址的方法
查看>>
php验证复选框的小例子
查看>>
Sql Server 判断表或数据库是否存在
查看>>
计算机网络
查看>>
iOS-浅谈runtime运行时机制
查看>>
数字证书原理 - 转自 http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
查看>>
关于float和margin
查看>>
Python练习-内置函数的应用
查看>>
洛谷P3905 道路重建
查看>>
数据表格 - DataGrid - 行编辑
查看>>
HQL查询语句
查看>>
jsp听课笔记(四)
查看>>
vim
查看>>
数组的键/值操作函数
查看>>
Android单点触控与多点触控切换的问题解决方案
查看>>
JS常用函数与方法
查看>>