Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <conio.h>
- using namespace std;
- class symbollist{
- //Variables
- char val;//собственно, буква
- long long int freq;//сколько раз повторяется
- symbollist *next;//указатель на следующий элемент
- //Methods
- public:
- symbollist(){
- val=0;
- freq=0;
- next=NULL;
- }
- symbollist *add(char c){//создает новый элемент в списке
- symbollist *current=this, *t=new symbollist;
- t->val=c;//записываем новый символ
- while(current->next!=NULL)
- current=current->next;
- current->next=t;
- t->next=NULL;
- return t;
- }
- void increase(char c){//ищем символ в списке и увеличиваем freq
- symbollist *current=this;
- while(current!=NULL){
- if(c==current->val){
- current->freq++;
- return ;
- }
- current=current->next;
- }//если не нашли элемент и не ушли из ф-ции при return ;
- this->add(c)->freq++;//создаем новый эл-т
- }
- int slength(){//считает кол-во зафиксированных символов
- symbollist *current=this;
- int i=1;
- while(current->next!=NULL){
- i++;
- current=current->next;
- }
- return i;
- }
- symbollist *operator[](int a){//пока нигде не используется, но вернет указатель на n-ный элемент при записи L[n]
- symbollist *current=this;
- for(int i=0;i<a;i++)
- if(current->next!=NULL)//если n>кол-во эл-тов то вернем указатель на последний элемент
- current=current->next;
- return current;
- }
- void swap(symbollist *current){
- std::swap(current->freq, current->next->freq);
- std::swap(current->val, current->next->val);
- }
- void sort(){//сортировка пузырьком
- symbollist *current=this, *subptr=this;
- while(current->next!=NULL){
- subptr=this;
- while(subptr->next!=NULL){
- if((subptr->freq) < (subptr->next->freq))
- this->swap(subptr);
- subptr=subptr->next;
- }
- current=current->next;
- }
- }
- void printlist(){
- symbollist *current=this;
- while(current->next!=NULL){
- cout<<current->val<<" : "<<current->freq<<endl;
- current=current->next;
- }
- }
- };
- int main(int argc, char **argv){
- symbollist *L=new symbollist;
- ifstream input;
- input.open("input.txt", ifstream::binary);//вместо имени файла argv[1] чтобы можно было дропнуть любой файл на этот exeшник и не парится с воодом пути и имени
- char c;
- while(!input.eof()){
- input.get(c);
- L->increase(c);
- }
- L->sort();
- L->printlist();
- getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment