PinkSide

C++ - Task_8 on Lists

Mar 6th, 2014
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. class List
  8. {
  9.     // Структура элмента - "узла списка". Заточена под опрделенную задачу
  10.     struct Node
  11.     {
  12.         // Слово из текста
  13.         string word;
  14.         // Частота появлеения
  15.         unsigned int freq;
  16.         // Указатели на предыдущий и следующий элементы - двунаправленный список
  17.         Node *next;
  18.         Node *prev;
  19.          
  20.         Node(string _data)
  21.         {
  22.             word = _data;
  23.             freq = 1;
  24.         }
  25.     }*pBeg, *pEnd; // Указатли на начало и конец списка
  26.    
  27. public:
  28.     List(string data)
  29.     {
  30.         pBeg = new Node(data);
  31.        
  32.         pBeg->prev = NULL;
  33.         pBeg->next = NULL;
  34.         pEnd = pBeg;
  35.     }
  36.     // Деструктор, в котором производтся освобождние памяти
  37.     ~List()
  38.     {
  39.         do
  40.         {
  41.             pBeg = pBeg->next;
  42.             if(pBeg->prev)
  43.                 delete pBeg->prev;
  44.            
  45.         } while(pBeg != pEnd);
  46.  
  47.         if(pBeg == pEnd)
  48.             delete pEnd;
  49.        
  50.     }
  51.     // Добавление в конец списка
  52.     void Add(string data)
  53.     {
  54.         Node *newNode = new Node(data);
  55.        
  56.         newNode->next = NULL;
  57.        
  58.         pEnd->next = newNode;
  59.         newNode->prev = pEnd;
  60.         pEnd = newNode;    
  61.     }  
  62.    
  63.     // Процедура добавления c автосортировкой
  64.     void AddSorted(string data)
  65.     {
  66.         Node * toAdd = new Node(data);
  67.        
  68.         Node *counter = pBeg;
  69.         bool placed = false;
  70.         while((!placed) && (counter))
  71.         {
  72.             int comparision = toAdd->word.compare(counter->word);
  73.            
  74.             if(!comparision)
  75.             {
  76.                 counter->freq ++;
  77.                 delete toAdd;
  78.                 placed = true;
  79.             }
  80.             if((comparision < 0) && (!placed))         
  81.             {  
  82.                 toAdd->next = counter;
  83.                 toAdd->prev = counter->prev;
  84.                 if(counter->prev)
  85.                     (counter->prev)->next = toAdd;
  86.                 counter->prev = toAdd;
  87.                         if(counter == pBeg)
  88.                         {
  89.                                 pBeg = toAdd;
  90.                        
  91.                 newNode->next = NULL;
  92. }
  93.                 placed = true;
  94.             }
  95.                 if((counter == pEnd) && (!placed))
  96.                     {  
  97.                         Add(data);
  98.                         placed = true;
  99.                     }
  100.             counter = counter->next;
  101.         }
  102.     }
  103.     // Печать списка: слева слово, справа частота появления. Каждый элемент на новой строке
  104.     void Print()
  105.     {
  106.         Node * counter = pBeg;
  107.         while(counter)
  108.         {
  109.             cout << counter->word << " " << counter->freq << endl;
  110.             counter = counter->next;
  111.         }
  112.         cout << endl;
  113.     }
  114. };
  115.  
  116. int main()
  117. {      
  118.     fstream file;
  119.     file.open("input.txt", ios::in)
  120.    
  121.     file.close();
  122.     nL.Print();
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment