64,670
社区成员
发帖
与我相关
我的任务
分享
// C++11
#include <memory>
#include <vector>
#include <iostream>
template <typename T>
class slist {
public:
slist() = default;
slist(const T &data) : data(new T(data)) { }
// ~slist() { std::cout << "destructor" << std::endl; }
std::shared_ptr<T> data;
std::weak_ptr<slist<T>> next;
};
int main(int argc, char *argv[])
{
std::vector<std::shared_ptr<slist<int>>> lvec;
int val, i, line, nextone;
line = 0;
while (true) {
++line;
std::cin >> val >> nextone;
if (!std::cin) {
break;
}
std::shared_ptr<slist<int>> cur, next;
if (line > lvec.size()) {
cur = std::make_shared<slist<int>>(val);
lvec.push_back(cur);
} else {
lvec[line - 1]->data = std::make_shared<int>(val);
}
for (i = lvec.size(); i < nextone; ++i) {
lvec.push_back(std::make_shared<slist<int>>());
}
if (nextone == -1) {
break;
}
lvec[line - 1]->next = lvec[nextone - 1];
}
for (const auto &num : lvec) {
std::cout << *(num->data) << " ";
}
std::cout << std::endl;
if (lvec.empty()) {
return 0;
}
std::shared_ptr<slist<int>> node1 = lvec[0], node2;
if (!node1) {
std::cout << std::boolalpha << false << std::endl;
return 0;
}
if (node2 = node1->next.lock()) {
if (node2 == node1) {
std::cout << std::boolalpha << true << std::endl;
return 0;
}
} else {
std::cout << std::boolalpha << false << std::endl;
return 0;
}
while (true) {
node1 = node1->next.lock();
node2 = node2->next.lock();
if (!node2) {
std::cout << std::boolalpha << false << std::endl;
break;
}
if (node2 == node1) {
std::cout << std::boolalpha << true << std::endl;
break;
}
node2 = node2->next.lock();
if (!node2) {
std::cout << std::boolalpha << false << std::endl;
break;
}
if (node1 == node2) {
std::cout << std::boolalpha << true << std::endl;
break;
}
}
return 0;
}