fork download
  1. #include <iostream>
  2. #include <string>
  3.  
  4. template<typename T>
  5. struct snode {
  6. T val;
  7. snode* next;
  8. };
  9.  
  10. template<typename T>
  11. class sorted_list {
  12. typedef snode<T> node;
  13. private:
  14. node* lst;
  15. size_t cnt;
  16. public:
  17. sorted_list(void):lst(NULL), cnt(0){}
  18. ~sorted_list(){
  19. this->clear();
  20. }
  21. public:
  22.  
  23. //вставка
  24. bool add(const T& val){
  25. node* prv = lst, *ptr = lst;
  26.  
  27. while(ptr != NULL){
  28. if(val < ptr->val)
  29. break;
  30. else {
  31. if(val == ptr->val)
  32. break;
  33. }
  34. prv = ptr;
  35. ptr = ptr->next;
  36. }
  37.  
  38. node* p = new (std::nothrow) node();
  39. if(p != NULL){
  40. p->val = val;
  41.  
  42. if(ptr == lst){
  43. p->next = lst;
  44. lst = p;
  45. } else {
  46. p->next = ptr;
  47. prv->next = p;
  48. }
  49. ++cnt;
  50. }
  51. return (p != NULL);
  52. }
  53.  
  54. //удаление по текущей позиции
  55. node* erase(node* pos){
  56. node* prv = lst, *ptr = lst;
  57. while((ptr != pos) && (ptr != NULL)){
  58. prv = ptr;
  59. ptr = ptr->next;
  60. }
  61.  
  62. if(ptr == NULL)
  63. return pos;
  64. else if(ptr == lst)
  65. prv = lst = lst->next;
  66. else {
  67. prv->next = ptr->next;
  68. prv = prv->next;
  69. }
  70. --cnt;
  71. delete pos;
  72. return prv;
  73. }
  74.  
  75. //удаление всех
  76. void clear(void){
  77. node* tmp;
  78. while(lst != NULL){
  79. tmp = lst;
  80. lst = lst->next;
  81. delete tmp;
  82. }
  83. }
  84.  
  85. node* begin(void) { return lst; }
  86. node* begin(void) const { return lst; }
  87. bool empty(void) const { return (lst == NULL); }
  88. size_t size(void) const { return cnt; }
  89. };
  90.  
  91. //персона
  92. struct person {
  93. std::string name;
  94. std::string city;
  95. int age;
  96.  
  97. person(void){}
  98. person(const char* _name, const char* _city, int _age):
  99. name(_name), city(_city), age(_age){}
  100.  
  101. bool operator == (const person& p) const {
  102. return (name == p.name);
  103. }
  104.  
  105. bool operator < (const person& p) const {
  106. return (name < p.name);
  107. }
  108. };
  109.  
  110.  
  111. int main(void){
  112. sorted_list<person> lp;
  113. lp.add( person("Вася", "Самара", 38) );
  114. lp.add( person("Петя", "Киров", 42) );
  115. lp.add( person("Лёха", "Орёл", 30) );
  116. lp.add( person("Витя", "Томск", 27) );
  117. lp.add( person("Саня", "Курган", 33) );
  118. lp.add( person("Толя", "Курск", 45) );
  119. lp.add( person("Стёпа", "Якутск", 31) );
  120.  
  121. snode<person>* p = lp.begin();
  122. while(p != NULL){ // удалить всех старше 40-ка лет
  123. if(p->val.age > 40){
  124. p = lp.erase(p);
  125. continue;
  126. }
  127. p = p->next;
  128. }
  129.  
  130. for(p = lp.begin(); p != NULL; p = p->next){
  131. std::cout << "имя: \t" << p->val.name << std::endl;
  132. std::cout << "город: \t" << p->val.city << std::endl;
  133. std::cout << "возраст: " << p->val.age << std::endl << std::endl;
  134. }
  135. lp.clear();
  136. return 0;
  137. }
  138.  
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
имя: 	Вася
город: 	Самара
возраст: 38

имя: 	Витя
город: 	Томск
возраст: 27

имя: 	Лёха
город: 	Орёл
возраст: 30

имя: 	Саня
город: 	Курган
возраст: 33

имя: 	Стёпа
город: 	Якутск
возраст: 31