数据结构~~~线性表复习2(动态链表的合并)

// 线性表(链表).cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"iostream"
using namespace std;

template<class T>
struct Node
{
    T data;
    Node *next;
};
template<class T>
class listNode
{
private:
    Node<T> *Head;
public:
    listNode();
    void insert(T e);
    void Delete(T e);
    void display();
    void mergelist(listNode<T>& Lb, listNode<T>& Lc);
    void UniqueMerge(listNode<T>& Lb );
};

template<class T>
listNode<T>::listNode()//初始化链表
{
    Head = new Node<T>;
    Head->next = NULL;
}

template<class T>
void listNode<T>::insert(T e)//插入元素
{
    Node<T>*q, *p=Head->next;
    q = Head;
    Node<T>*node = new Node<T>;
    node->data = e;
    node->next = NULL;
    if (p == NULL)
    {
        Head->next= node;
    }
    else
    {
        while (p)
        {

            if (p->data > e)
            {

                node->next=p;
                q->next = node;
                return;
            }
            else
            {
                q = p;
                p = p->next;
            }
        }
        q->next = node;
    }
}

template<class T>
void listNode<T>::Delete(T e)//删除指定值
{
    Node<T>*p = Head->next;
    Node<T>*q = Head;
    while (p)
    {
        if (p->data == e)
        {
            q->next = p->next;
            delete p;
            return;
        }
        else
        {
            q = p;
            p = p->next;
        }
    }
}

template<class T>
void listNode<T>::display()//输出链表中的值
{
    Node<T> *p = Head->next;
    while (p)
    {
        cout << p->data << " ";
        p = p->next;
    }

    cout << endl;
}
template<class T>
void listNode<T>::mergelist(listNode<T> &Lb, listNode<T> &Lc)//合并两个链表
{
    Node<T>*pa, *pb, *pc;
    pa =Head->next;
    pb = Lb.Head->next;
    pc = Lc.Head;
    while (pa&&pb)
    {
        if (pa->data > pb->data)
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
        else
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
    }
    if (pa) pc->next = pa;
    else pc->next = pb;
}

template<class T>
void listNode<T>::UniqueMerge(listNode<T>& Lb)//无重数合并
{
    Node<T>*pa, *pb,*pc;
    pa = Head->next;
    pb = Lb.Head->next;
    pc = Head;
    while (pa&&pb)
    {
        if (pa->data > pb->data)
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
        else if(pa->data==pb->data)
        {
            pb = pb->next;
            Lb.Delete(pa->data);
        }
        else
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
    }
    if (pa)pc->next = pa;
    else pc->next = pb;
}

int main()
{
    listNode<int> s1,s2,s3;
    int n;
    int e;
    cout << "请输入s1链表中要输入的数据的个数" << endl;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> e;
        s1.insert(e);
    }
    cout << "s1表:" << endl;
    s1.display();
    cout << "请输入s2链表中要输入的数据的个数" << endl;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> e;
        s2.insert(e);
    }
    cout << "s2表:" << endl;
    s2.display();
    cout << "合并两个链表" << endl;
    s1.UniqueMerge(s2);
    cout << "合并后:" << endl;

    s1.display();
    return 0;
}
无重数合并

无脑合并

原文地址:https://www.cnblogs.com/Disyushen666/p/9379790.html

时间: 2024-10-17 13:11:02

数据结构~~~线性表复习2(动态链表的合并)的相关文章

数据结构&gt;&gt;线性表【注意】--&gt;链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目 * A.B是两个递增有序的单链表,元素个数分别是m和n,求 * 集合A-B,并将结果保存在A中,且仍然保持递增有序. * converge_ab */ #include <iostream.h> using namespace std; typedef struct lnode{ int data; struct lnode * next; }lnode; int main(){ lnode * create_chain(int num,int interval,int s

数据结构~~~线性表复习(栈的应用)

// 线性表(栈的应用).cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include"iostream" #include"string" using namespace std; template <class T> class Stack { private: int top; T * S; int size; public: Stack(); Stack(int x); void pu

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

小猪的数据结构辅助教程——2.2 线性表中的单链表

小猪的数据结构辅助教程--2.2 线性表中的单链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.理解顺序表以及单链表各自的有点以及缺点! 2.熟悉单链表的形式,对于头指针,头结点,尾结点,数据域和指针域这些名词要知道是什么! 3.熟悉单链表的结点结构 4.区分头指针与头结点! 5.熟悉创建单链表的两种方式:头插法和尾插法 6.了解单链表12个基本操作的逻辑 7.有趣的算法题:查找单链表的中间结点~ 1.单链表的引入(顺序表与单链表的PK) 2.单链表的结构图以及一些名

《数据结构 - 线性表》链式存储 (单链表)

一:线性表定义 -<数据结构 - 线性表>顺序存储结构 二:为什么要 链式存储 线性表? - 因为在使用 顺序结构 存储方式存储的时候,每次进行 插入/删除 都需要大量移动元素的位置. - 所以设计出一种 存储空间不连续 的存储结构. - 这个线性表可能是这样的(存储位置不固定) -  三:链式存储 定义 -  因为链式存储,不是连续空间,所以需要两个信息 - 一个用于 存储数据元素,也叫做 数据域 - 一个用于 指向 下一个位置 的 指示信息,叫做指针域. - 指针域中存储的信息叫指针/链

数据结构——线性表

提示:以下内容不适合零基础人员,仅供笔者复习之用. 一.线性结构的基本特征: 1.集合中必存在唯一的一个"第一元素": 2.集合中必存在唯一的一个 "最后元素": 3.除最后元素在外,均有 唯一的后继: 4.除第一元素之外,均有 唯一的前驱. 如:java中的List接口,就是线性表.ArrayList就是顺序线性表,LinkedList就是链表线性表. 二.线性表的基本操作: 1.InitList(*L): 初始化操作,建立一个空的线性表L. 2.ListEmpt

数据结构-线性表(2)

线性表定义: 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构. 存储空间是否连续: 一.顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺