数据结构实验一

这是一个C语言编程实验,旨在复习循环结构、分支结构、数组和链表以及函数调用。实验要求输入两个正整数集合,进行交、并、差运算,并检查元素重复。用户可以通过菜单反复查看结果,输入负数结束程序。提供的代码实现了输入检查、重复元素避免、集合运算函数以及交互式菜单功能。
摘要由CSDN通过智能技术生成

(1)实验目的
通过该实验,让学生复习巩固C语言中的循环结构、循环控制条件、分支结构和数组/链表、函数的调用等有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。
(2)实验内容
通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。
(3)实验要求
从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能,每个集合中不允许有重复的元素。集合可以用数组也可以用链表存储。
实现交、并、差运算时,分别把代码写成函数的形式,即实现交运算的函数,实现并运算的函数,实现差运算的函数,在主函数中分别调用三个函数。
使用菜单形式对应各个操作,应允许用户反复查看结果,想结束程序时,输入负数结束,使其编成一个完整的小软件。菜单参考示例如下:
1—输入集合A和B
2—求集合A交B
3—求集合A并B
4—求集合A-B
退出,输入一个负数!
(4)验收/测试用例
输入: A={1,2,3,4,5} B={3,4,5,6,7}
要注意输入的过程中,每输入一个元素都要检查输入的这个元素是否和前面的元素重复,如果重复,要求用户重新输入当前元素。
验收测试时要测试这种重复的情况。
输出 A交B={3, 4, 5} A并B={1,2,3,4,5,6,7} A-B={1, 2}

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int showMain();

void input(vector<int> &, vector<int> &);
void input(vector<int> &);
bool checkDuplicated(const vector<int> &, int);

void setAnd(const vector<int> &a, const vector<int> &b);
void setIntersaction(const vector<int> &, const vector<int> &);
void SetDifference(const vector<int> &, const vector<int> &);

int main()
{
    vector<int> a, b;
    while (true)
    {
        int opt = showMain();
        if (opt < 0)
            break;
        switch (opt)
        {
        case 1:
            input(a, b);
            break;
        case 3:
            setAnd(a, b);
            break;
        case 2:
            setIntersaction(a, b);
            break;
        case 4:
            SetDifference(a, b);
            break;
        default:
            break;
        }
    }
}
int showMain()
{
    cout << "1---输入集合A和B" << endl
         << "2---求集合A交B" << endl
         << "3---求集合A并B" << endl
         << "4---求集合A-B" << endl;
    int selection;
    cin >> selection;
    return selection;
}

void input(vector<int> &v)
{
    int n = 0;
    while (cin >> n)
    {
        if (n < 0)
            break;
        if (checkDuplicated(v, n))
        {
            cout << "输入的值重复了,请重新输入!" << endl;
            continue;
        }
        v.push_back(n);
    }
    cin.clear();
    cin.sync();
}
void input(vector<int> &a, vector<int> &b)
{
    cout << "请输入集合A:";
    input(a);
    sort(a.begin(), a.end());
    cout << "请输入集合B:";
    input(b);
    sort(b.begin(), b.end());
}
bool checkDuplicated(const vector<int> &v, int n)
{
    for (auto &&i : v)
        if (i == n)
            return true;
    return false;
}
void setAnd(const vector<int> &a, const vector<int> &b)
{
    static vector<int> setAnd;
    size_t i = 0;
    size_t j = 0;
    while (i != a.size() && j != b.size())
    {
        if (a[i] <= b[j])
        {
            setAnd.push_back(a[i]);
            if (a[i] == b[j])
                j++;
            i++;
        }
        else
            setAnd.push_back(b[j++]);
    }
    while (i != a.size())
        setAnd.push_back(a[i++]);
    while (j != b.size())
        setAnd.push_back(b[j++]);

    for (auto &&i : setAnd)
        cout << i << " ";
    cout << endl;
}
void setIntersaction(const vector<int> &a, const vector<int> &b)
{
    static vector<int> setI;

    for (size_t i = 0; i < a.size(); i++)
    {
        for (size_t j = 0; j < b.size(); j++)
        {
            if (a[i] == b[j])
            {
                setI.push_back(a[i]);
                j++;
                break;
            }
        }
    }
    for (auto &&i : setI)
        cout << i << " ";
    cout << endl;
}
void SetDifference(const vector<int> &a, const vector<int> &b)
{
    static vector<int> setD;
    for (size_t i = 0; i < a.size(); i++)
        if (!checkDuplicated(b, a[i]))
            setD.push_back(a[i]);
    for (auto &&i : setD)
        cout << i << "  ";
    cout << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值