1. c语言中链表合并怎么弄详解
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(datafields)和一或两个用来指向上一个/或下一个节点的位置的链接("links")。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。
以上是对链表的一个概述,说的其实很全面了。我们应用链表就是为了克服顺序表(数组)必须在内存中连续分配相邻地址的束缚,更好的应用内存空间(很多破碎不连贯空间)。
你可以把链表类比成货运火车,火车的每一节车皮就是链表的每一个结点(一般用link表示),每个结点实际上有两个部分,一个部分是装货的空间就是链表的数据存储部分(一般用link—>data表示),另一部分就是与下一节车厢的连接部分就是链表的指针部分(用link—>next表示,指向下一个结点)。那么我们平时怎样管理火车呢?记住火车的第一节车皮即可,顺着第一节就能找到找到所有的车皮。链表也是如此,有了头结点(一般用head表示)就能找到所有的结点。这里缺点就来了,比如一共100节车皮,我让你找49节车皮,那你就必须从第一节车皮开始找,否则你没办法确定哪个是第49节。链表也是如此,必须从头结点开始找起,这也就是为什么要记住头结点的原因之一。相比数组直接按照序号访问,链表的访问要麻烦很多。同样我们也需要记住尾结点,就好像我们在一列长火车的尾部插一面小红旗,那么列车工人就能方便找到车尾,把需要的车皮挂载到这列火车上;链表同样如此,我们用tail来标记尾结点,直接把需要增加的结点加载到链表上即可,否则没有尾结点,那我们就要从头开始找到尾,很麻烦啊。
链表合并其实很简单,只要是两个结点数据类型相同(不同也可以),把其中一个的结点的头结点连接到另一个的尾结点就可以了。就是让其中一个的尾结点的指针tail->next=head(另一个结点的头结点)当然这是无序链表。如果是有序链表,比如结点数据时按照从大到小排列的,那首先就需要找到插入位置,读取每一个结点的数据,然后比较。找到插入位置之后按照下图进行的方式即可: