Code
// テンプレートクラスの宣言
template <typename T>
class List {
// ノード構造体の宣言
struct Node {
T data; // データ
Node* next; // 次のノードへのポインタ
// コンストラクタ
Node(T d, Node* n = nullptr) {
data = d;
next = n;
}
};
Node* head; // 先頭ノードへのポインタ
int size; // リストのサイズ
public:
// コンストラクタ
List() {
head = nullptr;
size = 0;
}
// デストラクタ
~List() {
clear();
}
// リストが空かどうかを返す
bool isEmpty() {
return head == nullptr;
}
// リストのサイズを返す
int getSize() {
return size;
}
// リストの先頭にデータを追加する
void addFirst(T data) {
head = new Node(data, head);
size++;
}
// リストの末尾にデータを追加する
void addLast(T data) {
if (isEmpty()) {
addFirst(data);
} else {
Node* p = head;
while (p->next != nullptr) {
p = p->next;
}
p->next = new Node(data);
size++;
}
}
// リストの指定された位置にデータを挿入する
void insert(int index, T data) {
if (index < 0 || index > size) {
throw std::out_of_range("index out of range");
}
if (index == 0) {
addFirst(data);
} else {
Node* p = head;
for (int i = 0; i < index - 1; i++) {
p = p->next;
}
p->next = new Node(data, p->next);
size++;
}
}
// リストの先頭のデータを削除する
void removeFirst() {
if (isEmpty()) {
throw std::runtime_error("list is empty");
}
Node* p = head;
head = head->next;
delete p;
size--;
}
// リストの末尾のデータを削除する
void removeLast() {
if (isEmpty()) {
throw std::runtime_error("list is empty");
}
if (head->next == nullptr) {
removeFirst();
} else {
Node* p = head;
Node* q = head->next;
while (q->next != nullptr) {
p = q;
q = q->next;
}
p->next = nullptr;
delete q;
size--;
}
}
// リストの指定された位置のデータを削除する
void remove(int index) {
if (index < 0 || index >= size) {
throw std::out_of_range("index out of range");
}
if (index == 0) {
removeFirst();
} else {
Node* p = head;
for (int i = 0; i < index - 1; i++) {
p = p->next;
}
Node* q = p->next;
p->next = q->next;
delete q;
size--;
}
}
// リストの指定された位置のデータを返す
T get(int index) {
if (index < 0 || index >= size) {
throw std::out_of_range("index out of range");
}
Node* p = head;
for (int i = 0; i < index; i++) {
p = p->next;
}
return p->data;
}
// リストの全てのデータを削除する
void clear() {
while (!isEmpty()) {
removeFirst();
}
}
// リストの内容を表示する
void print() {
Node* p = head;
while (p != nullptr) {
std::cout << p->data << " ";
p = p->next;
}
std::cout << std::endl;
}
};
// Listのテンプレートクラスは前の回答と同じなので省略します
// Managerクラスの宣言
template <typename T>
class Manager {
std::vector<List<T>> lists; // T型のListのベクター
public:
// コンストラクタ
Manager() {
lists.clear(); // ベクターを空にする
}
// デストラクタ
~Manager() {
lists.clear(); // ベクターを空にする
}
// 新しいListを追加する
void addList() {
List<T> list; // 空のListを作る
lists.push_back(list); // ベクターに追加する
}
// 指定されたインデックスのListにデータを追加する
void addData(int index, T data) {
if (index < 0 || index >= lists.size()) {
throw std::out_of_range("index out of range");
}
lists[index].addLast(data); // Listの末尾にデータを追加する
}
// 指定されたインデックスのListのデータを削除する
void removeData(int index, T data) {
if (index < 0 || index >= lists.size()) {
throw std::out_of_range("index out of range");
}
int pos = -1; // データの位置を探す
for (int i = 0; i < lists[index].getSize(); i++) {
if (lists[index].get(i) == data) {
pos = i;
break;
}
}
if (pos == -1) {
throw std::runtime_error("data not found");
}
lists[index].remove(pos); // Listの指定された位置のデータを削除する
}
// 指定されたインデックスのListの内容を表示する
void printList(int index) {
if (index < 0 || index >= lists.size()) {
throw std::out_of_range("index out of range");
}
lists[index].print(); // Listの内容を表示する
}
// 全てのListの内容を表示する
void printAll() {
for (int i = 0; i < lists.size(); i++) {
std::cout << "List " << i << ": ";
lists[i].print();
}
}
};
この記事が気に入ったらサポートをしてみませんか?