La、Lb线性链表升序排列,将结果放在Lc链表里。之前有文章写过两个有序链表的合并

区别在于,前面的做法是保留La的头节点,free掉Lb的头节点,将余下节点串起来。这种方法是面向过程编程

而现在讨论的做法,是单独建立一个Lc链表,利用一些已经写好的基本操作函数来完成,这种模块化编程做法实际上还简单些。不光模块函数里写不了几行,在调用这些函数时减少了不必要的琐碎过程的思考时间。

该做法的核心思想:将每轮比较过后偏小的那个节点从相应链表中删除(这是头节点的指针不会指向该节点了,但该节点的空间依旧保留),append(附加)到Lc链表。pa、pb始终指向当前La、Lb链表的第一个节点(头节点后面那个),最后会free掉La、Lb的头节点

代码如下:

#define ERROR 0
#define OK 1
typedef int Status;
typedef struct LNode
{ElementType data;struct LNode *next;
} *PtrToNode;typedef struct //查下struct的格式
{PtrToNode head,tail;int len;
}LinkList;Status initList(LinkList &L) {//申明结构体变量要不要malloc?L.len = 0;L.head = L.tail = (struct LinkList *)malloc(sizeof(struct LinkList));//shi bu shi struct LinkList    return OK;
}int getCurElem(PtrToNode p) {return p->data;
}PtrToNode getHead(LinkList &L) {return L.head;
}PtrToNode NextPos(LinkList &L,PtrToNode node) {return node->next;
}void delFirst(LinkList &L,PtrToNode q) {head = getHead(L);q = head->next;head->next = head->next->next;
}void append(LinkList &L,PtrToNode q) {L.tail->next = q;L.tail = q;
}void freeNode(PtrToNode node) {free(node);
}Status MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) {PtrToNode p;int a,b;if(!initList(Lc)) return ERROR;PtrToNode ha = getHead(La);PtrToNode hb = getHead(Lb);PtrToNode pa = NextPos(La,ha);PtrToNode pb = NextPos(Lb,hb);while(pa && pb) {a = getCurElem(pa);b = getCurElem(pb);if(a <= b) {delFirst(La,q);//将首节点删除,并将地址赋给q
            append(Lc,q);pa = NextPos(La,ha);} else {delFirst(Lb,q);append(Lc,q);pb = NextPos(Lb,hb);}}if(pa) {append(Lc,pa);} else {append(Lc,pb);}freeNode(ha); freeNode(hb);return OK;
}

View Code

转载于:https://www.cnblogs.com/gabygoole/p/5554866.html

利用线性链表基本操作完成两个有序线性表的合并相关推荐

  1. 两个有序顺序表的合并

    顺序表合并 存储结构 typedef struct{ElemType *elem; int Length; int ListSize; }SqList; 1.初始化线性表La,Lb,Lc 2.设置变量 ...

  2. 两个有序顺序表合并成一个有序顺序表

    一 概述 将两个有序顺序表合并为一个新的有序表,并由函数返回结果顺序表.实际过程中应该不断取下两个顺序表表头较小的结点存在新的顺序表中,然后,将其中某个表中的剩余数据直接加到新的顺序表后面. 二 代码 ...

  3. 将两个有序顺序表合并为一个新的有序顺序表

    将两个有序顺序表合并为一个新的有序顺序表 题目要求 基本思想 核心代码 完整代码(C++) 题目要求 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回合并后的顺序表. 基本思想 非常经典的题目, ...

  4. 将两个有序顺序表合并为一个新的有序顺序表MergeList_Sq

    将两个有序顺序表合并为一个新的有序顺序表,输出合并后的顺序表的所有数据元素: #include<stdio.h> #include<stdlib.h> #define LIST ...

  5. 两个有序顺序表la,lb合并为lc(不删除重复)。

    两个有序顺序表la,lb合并为lc(不删除重复). #include<stdio.h> struct LNode {int data[30];int last; }; int main() ...

  6. 顺序表之两个有序顺序表合并

    (2.2.4-7)将两个有序顺序表合并为一个新的有序顺序表. 思路:两个有序表分别从头开始比较,将较小值放入新表:如果一个顺序表已经到底另外一个还有,直接将还有值的那个表所有尾插入新表. 代码如下: ...

  7. ¥1-1 SWUST oj 941: 有序顺序表的合并操作的实现

    有序顺序表的合并操作的实现 题目描述 源代码 题目描述 源代码 #include<iostream> #include<malloc.h> using namespace st ...

  8. 数据结构——有序顺序表的合并

    以下是数据结构中关于有序顺序表的合并的基础操作(编程风格参考严蔚敏版数据结构). 头文件及宏 #include<iostream> #include<stdio.h> usin ...

  9. 链表之打印两个有序链表的公共部分

    题目:打印两个有序链表的公共部分 package com.chenyu.zuo.linkedList; /*** 打印有序链表的公共部分* @author 陈喻*题目:给定两个有序链表的头指针head ...

最新文章

  1. android的UDC功能,Android实现搜索历史功能
  2. qtdesigner怎么实现菜单栏跳转_3种公众号菜单栏设置类型,手把手教你做,不会的话那就再看一遍...
  3. 如何通过“流量线索”进行恶意程序感染分析
  4. flashcache mysql_flashcache的实现与分析
  5. Kotlin优雅的使用sp(SharedPreferences)
  6. 下方向键_Bash使用$#x27;...#x27;来捕获方向键
  7. PyTorch Hub发布!一行代码调用最潮模型,图灵奖得主强推
  8. php 自定义加密算法,php自定义加密函数、解密
  9. Phoenix 关联映射 Hbase表 获取不到数据,upsert hbase 列名为16进制字符
  10. Chromium Embedded Framework中文文档之(基本使用)
  11. python省市区三级联动_Ajax实现省市区三级级联详解
  12. c语言自动按次序创建文件,读取文件建立顺序表实现增,删,查,取(C语言)...
  13. [USACO13OPEN]Fuel Economy【贪心】
  14. 我用过了TensorFlow、PyTorch等好几种框架,为什么还是吃不透深度学习算法?
  15. 基于物理的渲染详尽指南 卷1光与介质:基于物理的渲染和着色理论
  16. backup exec linux卸载,Symantec Backup Exec 2012 Agent for Linux 卸载
  17. python爬取酷狗音乐源码_python爬虫教程:爬取酷狗音乐
  18. 罗振宇2021跨年演讲4:为什么这一代理科生机会特别好?
  19. Android Base64编码算法
  20. easyui主界面布局easyui-layout用法一例

热门文章

  1. HttpServletResponse对象介绍
  2. Java之强引用、 软引用、 弱引用、虚引用
  3. 面向站长和网站管理员的Web缓存加速指南
  4. ISA2006标准版无人值守安装
  5. 英特尔软件学院与中国一起迎接2008
  6. PHP7添加opcache.so模块
  7. Vue—基础概念—指令
  8. Springboot搭建个人博客系列
  9. Flutter混合开发:Android中如何启动Flutter
  10. Java基础(39)Arrays.binarySearch方法