实现一个数据结构,维护一张表(最初只有一个元素 1 1)。需要支持下面的操作,其中 � x 和 � y 都是 1 1 到 1 0 6 10 6 范围内的正整数,且保证任何时间表中所有数字均不相同,操作数量不多于 1 0 5 10 5 : 1 x y :将元素 � y 插入到 � x 后面; 2 x :询问 � x 后面的元素是什么。如果 � x 是最后一个元素,则输出 0 0; 3 x:从表中删除元素 � x 后面的那个元素,不改变其他元素的先后顺序。用c++写代码
时间: 2024-03-03 07:52:43 浏览: 213
数据结构是计算机科学的一个重要的分支,c++实现各数据结构代码
以下是使用双向链表实现该数据结构的C++代码:
```c++
#include <iostream>
using namespace std;
struct Node {
int val;
Node* prev;
Node* next;
Node(int v): val(v), prev(nullptr), next(nullptr) {}
};
class Table {
private:
Node* head;
public:
Table() {
head = new Node(1);
head->next = new Node(1);
head->next->prev = head;
}
void insert(int x, int y) {
Node* curr = head;
while (curr != nullptr && curr->val != x) {
curr = curr->next;
}
if (curr == nullptr) {
return;
}
Node* newNode = new Node(y);
newNode->next = curr->next;
newNode->prev = curr;
if (curr->next != nullptr) {
curr->next->prev = newNode;
}
curr->next = newNode;
}
int query(int x) {
Node* curr = head;
while (curr != nullptr && curr->val != x) {
curr = curr->next;
}
if (curr == nullptr || curr->next == nullptr) {
return 0;
}
return curr->next->val;
}
void remove(int x) {
Node* curr = head;
while (curr != nullptr && curr->val != x) {
curr = curr->next;
}
if (curr == nullptr || curr->next == nullptr) {
return;
}
Node* toDelete = curr->next;
curr->next = toDelete->next;
if (toDelete->next != nullptr) {
toDelete->next->prev = curr;
}
delete toDelete;
}
};
int main() {
Table table;
int q;
cin >> q;
while (q--) {
int op;
cin >> op;
if (op == 1) {
int x, y;
cin >> x >> y;
table.insert(x, y);
} else if (op == 2) {
int x;
cin >> x;
int res = table.query(x);
cout << res << endl;
} else if (op == 3) {
int x;
cin >> x;
table.remove(x);
}
}
return 0;
}
```
注意,该实现方式是使用了链表来维护表中的元素,因此相比于使用数组等数据结构,可能具有更好的插入和删除操作的时间复杂度。
阅读全文