面向对象程序设计——判断两个数据集是否相同(C++)_c++

题目描述

从标准输入中读入两个整数集,整数集中数据无序,且可能有重复数据。当两个数据集中数据完全相同(数据相同,数据若重复,重复个数也相同,顺序不一定相同),则两个数据集相同。编写一程序判断输入的两数据集是否相同:用1表示相同,用0表示不同。

【输入形式】

先输入第一组整数集的个数(大于等于1,小于等于20),然后输入第一组整数(以一个空格分隔);再输入第二组整数集的个数(大于等于1,小于等于20),并输入第二组整数(以一个空格分隔)。

【输出形式】

若两数据集相同,则输出1,否则输出0,然后按照从小到大的顺序分行输出第一个数据集中的数据及重复个数(以一个空格分隔数据和重复个数)。

【样例输入1】

10
100 56 7 89 -12 100 7 -12 100 56
10
-12 7 7 56 100 -12 100 56 89 100

【样例输出1】

1
-12 2
7 2
56 2
89 1
100 3

【样例输入2】

10
56 70 -12 100 7 89 -12 100 56 1001
9
1001 56 70 89 -12 100 7 -12 100

【样例输出2】

0
-12 2
7 1
56 2
70 1
89 1
100 2
1001 1

【样例说明】

样例1中输入的两个数据集的数据和各个数据的重复个数都完全相同,所以输出1,然后按从小到大的顺序输出第一个数据集中的数据及重复个数(即:有2个-12,2个7,2个56,1个89,3个100)。
样例2中输入的两个数据集中的数据相同,但第一个数据集中有2个56,而第二个数据集中有1个56,所以两个数据集不同,输出0,并按从小到大的顺序输出第一个数据集中的数据及重复个数。

【评分标准】

该题要求判断两数据集是否相同。上传C语言文件名为same.c或same.cpp。

解题思路

这道题的题目挺好理解的,但是处理起来,操作可能比较复杂。在这里,用数组的话,从数的读取开始,到后来的统计、排序操作就比较复杂了。因此这里选用了链表的形式存储数据。
在读取数据的时候,就统计数字出现次数并按照从小到大的顺序插入链表中。因此,构造好插入函数之后,该题基本就解决了。代码如下图所示:

#include <iostream>
#include<malloc.h>
using namespace std;

typedef struct Node{//定义节点
    int num;//数值
    int counts;//数量
    Node* next;
}*node,MyNode;

void insertNode(int tem,node head){ //插入函数
    node last_node = head;
    node next_node = head->next;
    if(next_node != NULL){ //判断链表是否为空
        while(next_node != NULL){//不为空时,遍历链表,找到合适的插入位置
            if(next_node->num > tem){ //当找到第一个大于待插入节点时,即插在该节点前面
                node tem_node = (node)malloc(sizeof(MyNode));
                tem_node->num = tem;
                tem_node->counts = 1;
                tem_node->next = next_node;
                last_node->next = tem_node;
                break;
            }
            else if(next_node->num == tem){//当找到值相同的节点时,直接将该节点的值加1
                next_node->counts = next_node->counts+1;
                break;
            }
            last_node = next_node;
            next_node = next_node->next;
        }
        if(next_node == NULL){ //若循环结束未找到大于待插值的节点,则插在链表末端
            node tem_node = (node)malloc(sizeof(MyNode));
            tem_node->num = tem;
            tem_node->counts = 1;
            tem_node->next = next_node;
            last_node->next = tem_node;
        }
    }
    else{ //若链表为空,则直接将该值插在头节点之后
        node tem_node = (node)malloc(sizeof(MyNode));
        tem_node->num = tem;
        tem_node->counts = 1;
        tem_node->next = NULL;
        last_node->next = tem_node;
    }

}

int main()
{
    int n1,n2;
    cin>>n1;
    node head1 = (node)malloc(sizeof(MyNode));
    node head2 = (node)malloc(sizeof(MyNode));
    node tem_node1;
    node tem_node2;
    head1->next = NULL;
    head2->next = NULL;
    int i;
    int tem;
    int flag=1;//标志两组数是否相同
    for(i=0;i<n1;i++){//构建两链表
        cin>>tem;
        insertNode(tem,head1);
    }
    cin>>n2;
    for(i=0;i<n2;i++){
        cin>>tem;
        insertNode(tem,head2);
    }
    tem_node1 = head1->next;
    tem_node2 = head2->next;
    if(n1 != n2){//若两组数数量不等,则直接输出0 
        flag = 0;
    }
    else {
        while(tem_node1 != NULL && tem_node2 !=NULL){ 
            if(tem_node1->num != tem_node2->num || tem_node1->counts != tem_node2->counts){//判断是否每个数和数量均相同
                flag=0;
                break;
            }
            tem_node1 = tem_node1->next;
            tem_node2 = tem_node2->next;
        }

    }
    cout<<flag;
    tem_node1 = head1->next;
    while(tem_node1 != NULL){ //输出链表1
        cout<< endl<<tem_node1->num<<' '<<tem_node1->counts;
        tem_node1 = tem_node1->next;
    }
    return 0;
}