利用链表求集合的差集

news/2024/7/3 1:45:11

  1. 内容:如果以单链表表示集合,假设集合A用单链表LA表示,集合B用单链表LB表示,设计算法求两集合的差,即A-B。用C语言实现程序解决问题。
  2. 算法分析:由集合运算的规则可知,集合的差A-B中包含所有属于集合A而不属于集合B的元素。具体做法是,对于集合A中的每一个元素,在集合B的链表LB中进行查找,若存在与A中元素相同的元素,则在LA中将其删除。

    首先需要定义链表结点的结构类型,然后选择使用两个while循环遍历这两个单链表,用pre和q存储相应的结点和待删除的节点,pa和pb分别用来遍历这两个单链表。

    编写测试代码,假设A集合为{1,2,3,4,5,6},B集合为{1,2,3,4},则A-B集合为{5,6}。

  3. 概要设计:使用C语言,其中设置了以下函数

  4. 程序运行流程图如下:

     

     

     

  5.  测试(设计测试用例或测试代码的设计与实现,测试结果截屏)测试案例如图

     

     

  6. 测试结果如图所示:

 

                                                                                                                                                                                                                                                                                                                                                                                                                  测试结果显示输入字母求差集存在问题,故进行调试代码。测试代码时,当输入字母形式的集合时,会出现错误,显示“a was not declared in this scope”,主要原因在于定义data的数据类型时,定义的是int型,当输入字符型常量时,程序就会报错,因此将int data;改为char data;这时当输入字母集合时,程序正常运行,输出的是字母的ASCII码值,调试成功如图所示

 

 

 

 

 

源代码如下:

#include<iostream>
#include<assert.h>
using namespace std;
//定义链表结点的结构类型 
struct Node
{
    int elem;
    Node*next;

    Node(char data)
        :elem(data)
        , next(NULL)
    {}
};
//利用函数完成集合的差运算 
void Different(Node**LA, Node*LB)
{
    Node*pa = *LA;  //遍历A链表
    //Node*pb = LB;//遍历B链表
    Node *pre = NULL;//用来保存删除后结点能连接起来
    Node*q;//待删除的结点 
    while (pa)
    {
        Node*pb = LB;
        while (pb&&pa->elem != pb->elem)
            pb = pb->next;//
        if (pb)//两个结点的值相等
        {
            if (!pre)
            {
                *LA = pa->next;//指向下一个结点 
            }
            else//第一个结点相等
            {
                pre->next = pa->next;//指向相等结点的后一个
            }
            q = pa;//释放结点 
            pa = pa->next;
            free(q);
        }
        //链表B已遍历完
        else
        {
            //更新结点的位置
            pre = pa;
            pa = pa->next;
        }
    }
}
void Printf(Node*L)
{
    Node*cur = L;
    while(cur)
    {
        cout << cur->elem << " ";
        cur = cur->next;
    }
    cout << endl;
}
//测试代码 
void Test()
{
    Node*n1 = new Node('a');
    Node*n2 = new Node('b');
    Node*n3 = new Node('c');
    Node*n4 = new Node('d');
    Node*n5 = new Node('e');
    Node*n6 = new Node('f');

    n1->next = n2;
    n2->next = n3;
    n3->next = n4;
    n4->next = n5;
    n5->next = n6;
    cout << "链表A" << endl;
    Printf(n1);

    Node*m1 = new Node('a');
    Node*m2 = new Node('e');
    Node*m3 = new Node('f');
    Node*m4 = new Node('g');

    m1->next = m2;
    m2->next = m3;
    m3->next = m4;
    cout << "链表B" << endl;

    Printf(m1);
    cout << "链表的差集" << endl;

    Different(&n1, m1);
    Printf(n1);
}

int main()
{
    Test();
    system("pause");
    return 0;
}


http://www.niftyadmin.cn/n/2249232.html

相关文章

numpy nan的判定 和 处理

目录np.nan的判定np.nan处理 将当前列的nan位置用平均数进行代替jupyter notebook源码np.nan的判定 np.nan处理 将当前列的nan位置用平均数进行代替 jupyter notebook 源码 def fill_ndarray(t1):for i in range(t1.shape[1]): # 遍历每一列temp_col t1[:, i] # 当前的一列…

代码质量优先——《编写高质量代码:改善c程序代码的125个建议》

高质量的代码不但可以促进团队合作、减少bug处理、降低维护成本&#xff0c;对程序员自身的成长也是至关重要的。很难想象一个参考《如何编写无法维护的代码》写代码的程序员技术成长的上限有多么低。为了写出高质量的代码&#xff0c;我们需要听取过来人的改善代码质量的经验&…

顺序表的逆置

1.内容: 用顺序表作为存储结构&#xff0c;实现将线性表就地逆置的操作&#xff0c;所谓“就地”&#xff0c;指辅助空间应为O(1)。 2.算法分析 利用顺序表实现线性表就地逆置操作&#xff0c;其基本思想为将顺序表的第一个元素与最后一个元素进行互换&#xff0c;将第二个元…

小巧的HTTP Server[C语言]

2019独角兽企业重金招聘Python工程师标准>>> 六款小巧的HTTP Server[C语言] 1、micro_httpd - really small HTTP server 特点&#xff1a; 支持安全的 .. 上级目录过滤 支持通用的MIME类型 支持简单的目录 支持目录列表 支持使用 index.html 作…

有技术也有趋势,2017百度云智峰会免费参会邀约

9 月 2 日&#xff0c;期待已久的第二届百度云智峰会即将开幕&#xff0c;本届峰会依然以人工智能、大数据和云计算为主旋律。不过&#xff0c;不同于往届概念性的阐述和展望&#xff0c;今年峰会似乎更加注重“实践”与“融合”&#xff0c;大会着力强调“Innovation”&#x…

线性链表的分割

1.内容:已知一个线性链表表示的线性表中含有三类字符的数据元素&#xff08;如字母字符&#xff0c;数字字符和其它字符&#xff09;&#xff0c;试编写算法将该线性链表分割为三个循环链表&#xff0c;其中每个循环链表表示的线性表中均只含有一类字符。 2.算法分析 首先建立…

十进制整数转换为任意进制数

内容: 将十进制整数num转换为r进制数&#xff0c;其转换方法为辗转相除法。要求用链栈实现。 步骤&#xff1a; 算法分析 本题需要将十进制整数num转换为任意进制数&#xff0c;要求使用链栈实现转换。程序中设计了四个函数&#xff0c;(1)函数InitStack()用来初始化一个顺序…

scala 编译机制 反编译案例

目录scala底层的编译机制源码类反编译class文件得到的demo01_test反编译class文件得到的demo01_test$反编译class文件得到的Workerscala底层的编译机制 源码类 package com.xcu.chapter06object demo01_test {def main(args: Array[String]): Unit {var worker new Worker…