fork download
  1. #include <cstddef>
  2. #include <iostream>
  3. #include <string>
  4.  
  5. // ------ Grocery.hpp ------
  6.  
  7. struct Grocery
  8. {
  9. std::string name;
  10. std::size_t quantity;
  11. Grocery* next;
  12.  
  13. Grocery(std::string name, std::size_t quantity)
  14. : name(name)
  15. , quantity(quantity)
  16. {}
  17. };
  18.  
  19. namespace
  20. {
  21. std::ostream& operator<<(std::ostream& out, Grocery const& obj)
  22. {
  23. return out << obj.name << ", " << obj.quantity;
  24. }
  25. }
  26.  
  27. // ------ GroceryList.hpp ------
  28.  
  29. class LinkedGroceryList
  30. {
  31. private:
  32. Grocery* head;
  33. Grocery* tail;
  34. std::size_t numGroceries;
  35. std::size_t quantitySum;
  36.  
  37. public:
  38. LinkedGroceryList();
  39. ~LinkedGroceryList();
  40. void addGrocery(Grocery const& grocery);
  41. void removeGrocery(Grocery const& grocery);
  42. std::size_t different() const { return numGroceries; }
  43. std::size_t total() const { return quantitySum; }
  44. bool empty() const { return quantitySum == 0; }
  45. friend std::ostream& operator<<(std::ostream& out, LinkedGroceryList const& obj);
  46. };
  47.  
  48. // ------ GroceryList.cpp ------
  49.  
  50. LinkedGroceryList::LinkedGroceryList()
  51. : head(nullptr)
  52. , tail(nullptr)
  53. , numGroceries(0)
  54. , quantitySum(0)
  55. {}
  56.  
  57. LinkedGroceryList::~LinkedGroceryList()
  58. {
  59. Grocery *predPtr = head;
  60. Grocery *nextGrocery;
  61.  
  62. while (predPtr)
  63. {
  64. nextGrocery = predPtr->next;
  65. delete predPtr;
  66. predPtr = nextGrocery;
  67. }
  68. }
  69.  
  70. void LinkedGroceryList::addGrocery(Grocery const& grocery)
  71. {
  72. Grocery* newGrocery = new Grocery(grocery.name, grocery.quantity);
  73. newGrocery->next = nullptr;
  74.  
  75. if (empty())
  76. {
  77. head = tail = newGrocery;
  78. }
  79. else
  80. {
  81. tail->next = newGrocery;
  82. tail = newGrocery;
  83. }
  84.  
  85. numGroceries++;
  86. quantitySum += grocery.quantity;
  87. }
  88.  
  89. void LinkedGroceryList::removeGrocery(Grocery const& grocery)
  90. {
  91. if (!head) return;
  92.  
  93. Grocery* groceryPtr;
  94.  
  95. if (head->name == grocery.name)
  96. {
  97. groceryPtr = head;
  98. head = groceryPtr->next;
  99.  
  100. quantitySum -= grocery.quantity;
  101. if (grocery.quantity == groceryPtr->quantity)
  102. numGroceries--;
  103. else
  104. {
  105. groceryPtr->quantity -= grocery.quantity;
  106. return;
  107. }
  108.  
  109. delete groceryPtr;
  110. }
  111. else
  112. {
  113. Grocery* predPtr = nullptr;
  114. groceryPtr = head;
  115.  
  116. while (groceryPtr && groceryPtr->name != grocery.name)
  117. {
  118. predPtr = groceryPtr;
  119. groceryPtr = groceryPtr->next;
  120. }
  121.  
  122. if (groceryPtr)
  123. {
  124. quantitySum -= grocery.quantity;
  125. if (grocery.quantity == groceryPtr->quantity)
  126. numGroceries--;
  127. else
  128. {
  129. groceryPtr->quantity -= grocery.quantity;
  130. return;
  131. }
  132.  
  133. predPtr->next = groceryPtr->next;
  134. delete groceryPtr;
  135. }
  136. }
  137. }
  138.  
  139. std::ostream& operator<<(std::ostream& out, LinkedGroceryList const& obj)
  140. {
  141. for (Grocery* grocery = obj.head; grocery; grocery = grocery->next)
  142. {
  143. out << *grocery << "\n";
  144. }
  145.  
  146. return out;
  147. }
  148.  
  149. // ------ Driver ------
  150.  
  151. int main()
  152. {
  153. LinkedGroceryList meats;
  154. meats.addGrocery(Grocery("steak", 5));
  155. meats.addGrocery(Grocery("chicken", 3));
  156. meats.addGrocery(Grocery("pork", 2));
  157.  
  158. std::cout << meats;
  159. std::cout << "\nDifferent items: " << meats.different() << "\n";
  160. std::cout << "Total items: " << meats.total();
  161.  
  162. std::cout << "\n\nRemoving 1 pork...\n\n";
  163. meats.removeGrocery(Grocery("pork", 1));
  164.  
  165. std::cout << meats;
  166. std::cout << "\nDifferent items: " << meats.different() << "\n";
  167. std::cout << "Total items: " << meats.total();
  168. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
steak, 5
chicken, 3
pork, 2

Different items: 3
Total items: 10

Removing 1 pork...

steak, 5
chicken, 3
pork, 1

Different items: 3
Total items: 9