Advertisement
Loloped

стр.55-58 - Однонаправленный список общего вида

Jun 15th, 2013
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. //стр.55-58 - Однонаправленный список общего вида - РОЗОВАЯ
  2.  
  3. #include "exception.cpp"
  4. template <class Item>
  5. class List
  6. {
  7. struct Element
  8. {
  9. Item inf;
  10. Element *next;
  11. Element (Item x):inf(x),next(0)
  12. {
  13. }
  14. };
  15. Element *head; //указатель на начало списка
  16. int size; //количество элементов в списке
  17. //возвращает указатель на элемент списка с номером index
  18. Element *Find(int index)
  19. {
  20. if ((index<1)||(index>size)) //если индекс элемента списка находится вне диапазона, то возвращаем NULL
  21. {
  22. return NULL;
  23. }
  24. else //иначе устанавливаем указатель на начало списка
  25. {
  26. Element *cur=head;
  27. for (int i=1; i<index; i++) //и перемещаемся по списку на элемент с номером index
  28. {
  29. cur=cur->next;
  30. }
  31. return cur; //возвращаем указатель на требуемый элемент
  32. }
  33. }
  34. public:
  35. List():head(0),size(0) //конструктор класса
  36. {
  37. }
  38. ~List() //деструктор класса
  39. {
  40. while (!Empty())//пока список не пуст
  41. {
  42. Remove(1); //удаляем первый элемент списка
  43. }
  44. }
  45. bool Empty)_ //проверка пустоты списка
  46. {
  47. return head==0;
  48. }
  49. int GetLength() //возвращает количество элементов в списке
  50. {
  51. return size;
  52. }
  53. //возвращает значение элемента списка по его номеру
  54. Item Get(int index)
  55. {
  56. if ((index<1)||(index>size))
  57. {
  58. throw ListException ("ListException: get - list error");
  59. }
  60. else
  61. {
  62. Element *r=Find(index);
  63. Item i=r->inf;
  64. return i;
  65. }
  66. }
  67. //осуществляет вставку элемента со значением data в позицию index
  68. void Insert (int index, Item data)
  69. {
  70. if ((index<1)||(index>size+1))
  71. {
  72. throw List Exception ("ListException: insert - list error");
  73. }
  74. else
  75. {
  76. //создаём новый элемент
  77. Element *newPtr=new Element (data);
  78. size=GetLength()+1; //увеличиваем размерность списка
  79. if (index==1) //если вставку производим в позицию 1
  80. { //то см. рис. 5.6 на стр. 59 - РОЗОВАЯ
  81. newPrt->next=head;
  82. head=newPtr;
  83. }
  84. else //иначе см. рис. 5.7
  85. {
  86. Element *prev=Find(index-1);
  87. newPtr->next=prev->next;
  88. prev->next=newPtr;
  89. }
  90. }
  91. } //осуществляет удаление элемента из списка с номером index
  92. void Remove (int index)
  93. {
  94. if ((index<1)||(index>size))
  95. {
  96. throw ListException ("ListException: remove - list error");
  97. }
  98. else
  99. Element *cur; //объявляем вспомогательный указатель
  100. -- size; //уменьшаем размерность списка
  101. if (index==1) //если удаляем первый элемент
  102. { //то см. рис. 5.8
  103. cur=head;
  104. head=head->next;
  105. }
  106. else // иначе см. рис. 5.9
  107. {
  108. Element *prev=Find(index-1);
  109. cur=prev->next;
  110. prev->next=cur->next;
  111. }
  112. cur->next=NULL;
  113. delete cur;
  114. }
  115. }
  116. //вывод элементов списка в глобальный поток out
  117. void Print()
  118. {
  119. for (Element *cur = head; cur!=NULL; cur=cur->next)
  120. {
  121. out<<cur->inf<<' ';
  122. }
  123. out<<endl;
  124. }
  125. };
  126.  
  127. /* Замечание: Класс Exception помещён в отдельный файл exception.cpp и выглядит следующим образом:
  128. #include "exception"
  129. #include "string"
  130. using namespace std;
  131. class ListException: public exception
  132. {
  133. public:
  134. LustException(const string & message=""): exception(message.c_str())
  135. {
  136. }
  137. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement