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();
       }
   }
};

この記事が気に入ったらサポートをしてみませんか?