数据结构链表操作C语言

题目描述

本题要求使用自定义链表或使用STL之list完成。

输入n个正整数,建立单链表L,要求链表中每个结点之后所有结点的数据域值都不是该结点数据域值的倍数,输出链表L中的结点个数及各个数据域值,然后将链表L逆置并输出。

输入格式:

首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。对于每组测试数据,输入2行,第一行输入数据个数n,第二行输入n个正整数。

输出格式:

对于每组测试,输出3行,第一行是链表L的数据结点个数,第二行是链表L中各个结点的数据域值,第三行是链表L逆置后的结果。每行的每两个数据之间留一个空格。

输入样例:

10

21 30 14 55 32 63 11 30 55 30

输出样例:

6

21 30 14 55 32 11

11 32 55 14 30 21

源代码

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

// 判断是否为倍数
bool isMultiple(int value, const list<int>& lst) {
    for (int num : lst) {
        if (value % num == 0) {
            return true;
        }
    }
    return false;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        list<int> lst;
        for (int i = 0; i < n; i++) {
            int value;
            cin >> value;
            if (!isMultiple(value, lst)) {
                lst.push_back(value);
            }
        }

        // 输出链表节点个数
        cout << lst.size() << endl << endl;

        // 输出链表节点的数据域值
        int count = 0;
        for (int num : lst) {
            count++;
            cout << num;
            if (count != lst.size()) {
                cout << " ";
            }
        }
        cout << endl;

        // 逆置链表并输出
        lst.reverse();
        count = 0;
        for (int num : lst) {
            count++;
            cout << num;
            if (count != lst.size()) {
                cout << " ";
            }
        }
        cout << endl;
        if (T != 0) {
            cout << endl;
        }
    }
    return 0;
}

在这个示例代码中,我们使用STL的list容器来代替自定义的链表。首先,我们定义了一个isMultiple()函数,用于判断一个值是否为链表中任意节点数据域值的倍数。

在主函数中,我们首先读取测试数据的组数T,并使用循环处理每组测试数据。对于每组测试数据,我们首先读取数据个数n,然后使用循环读取n个正整数。在读取过程中,我们使用isMultiple()函数判断当前值是否为链表中任意节点数据域值的倍数,如果不是,则将其插入到链表中。

接下来,我们输出链表节点个数,并使用范围for循环输出链表节点的数据域值。然后,我们调用reverse()函数逆置链表,并再次使用范围for循环输出逆置后的链表。

请注意,在每组测试数据处理完后,STL的list容器会自动释放内存,无需手动释放。

 

© 版权声明
THE END
喜欢就支持一下吧
点赞15赞赏 分享