fork download
  1. #include <iostream>
  2.  
  3. template<class T>
  4. struct Node
  5. {
  6. T data;
  7. Node* previous = nullptr;
  8. Node* next = nullptr;
  9. Node(const T &data) : data(data) {}
  10. };
  11.  
  12. template<class T>
  13. class LinkedListD
  14. {
  15. private:
  16. Node<T> *head = nullptr;
  17. Node<T> *last = nullptr;
  18. public:
  19. Node<T>* addToEnd(const T &info);
  20. Node<T>* addNodeBeforeTo(Node<T> *before, const T &info);
  21. void print() const;
  22. };
  23.  
  24. template<class T>
  25. Node<T>* LinkedListD<T>::addToEnd(const T &info) {
  26. Node<T>** n = ( last ) ? &(last->next) : &head;
  27. Node<T>* newNode = new Node<T>( info );
  28. *n = newNode;
  29. newNode->previous = last;
  30. last = newNode;
  31. return newNode;
  32. }
  33.  
  34. template<class T>
  35. Node<T>* LinkedListD<T>::addNodeBeforeTo(Node<T> *before, const T &info) {
  36. if ( !before ) return nullptr;
  37. Node<T>* newNode = new Node<T>( info );
  38. newNode->previous = before->previous;
  39. newNode->next = before;
  40. if ( before->previous )
  41. before->previous->next = newNode;
  42. before->previous = newNode;
  43. if ( before == head )
  44. head = newNode;
  45. return newNode;
  46. }
  47.  
  48. template<class T>
  49. void LinkedListD<T>::print() const {
  50. Node<T>* curr = head;
  51. while (curr) {
  52. std::cout << curr->data << ' ';
  53. curr = curr->next;
  54. }
  55. std::cout << std::endl;
  56. }
  57.  
  58. int main() {
  59. LinkedListD<int> l;
  60.  
  61. l.addToEnd(10);
  62. l.addToEnd(15);
  63. Node<int>* n = l.addToEnd(20);
  64. l.addToEnd(12);
  65.  
  66. l.print();
  67.  
  68. l.addNodeBeforeTo(n, 30);
  69.  
  70. l.print();
  71.  
  72. return 0;
  73. }
Success #stdin #stdout 0s 4720KB
stdin
Standard input is empty
stdout
10 15 20 12 
10 15 30 20 12