Сортировка линейного списка. Формирование линейного списка для группы студентов, содержащего информацию: номер группы, ФИО студента и средний балл за сессию, страница 2

};

LineList.cpp

#include "stdafx.h"

//#include "LinearList.h"

LineList::LineList(void)

{

       size = 0;

       head = new LNode();

       tail = new LNode();

       //inic. head

       head->SetNext(tail);

       head->SetPrev(NULL);

       //inic. tail

       tail->SetPrev(head);

       tail->SetNext(NULL);

}

void LineList::Add(Students n_inform)

{

       AddAt(n_inform, size);

}

void LineList::AddAt(Students n_inform, unsigned int index)

{

       LNode* prev = GetPrevIndex(index);

       LNode* newnode = new LNode(n_inform, prev, prev->GetNext());

       prev->SetNext(newnode);

       prev->GetNext()->SetPrev(newnode);

       size++;

}

LNode* LineList::GetPrevIndex(unsigned int index)

{

       LNode* prev = head;

       for(int i=0; i<index; i++)

             prev = prev->GetNext();

       return prev;

}

Students& LineList::GetAtIndex(unsigned int index)

{

       return GetPrevIndex(index)->GetNext()->GetInform();

}

unsigned int LineList::Size()

{

       return size;

}

LineList::~LineList(void)

{     

       LNode* next = head->GetNext();

       delete head;

       for(int i=0; i<size; i++)

       {

             LNode* next4next = next->GetNext();

             delete next;

             next = next4next;

       }

       delete tail;

}

ConsoleApplication57.cpp

#include "stdafx.h"

// сравнение элементов списка, cond - сравнение в lisp

// возвращаем булевое значение

bool cond_number_groop(Students l,Students r)

{

       return (l.get_namber_groop()>r.get_namber_groop());

}

bool cond_ball( Students l, Students r)

{

       return (l.get_ball()>r.get_ball());

}

bool cond_name( Students l, Students r)

{

       return (l.get_name()>r.get_name());

}

void sort(LineList& list,bool (*compare)( Students l, Students r) )     // сортировка списка пузырьком

{

       for(int i = 0; i<list.Size(); i++)

             for(int j=0; j<list.Size()-1; j++)

                    if( compare(list.GetAtIndex(j),list.GetAtIndex(j+1)))      // сравнение строк

                    {

                          Students temp = list.GetAtIndex(j);

                          list.GetAtIndex(j)=list.GetAtIndex(j+1);

                          list.GetAtIndex(j+1)=temp;

                    }

}

void main()

{

       setlocale(LC_ALL, "Russian");

       LineList list;

       Students Students(1,"вася",5.0);

       list.Add(Students);

       Students.ReBuild(2,"петя",4.9);

       list.Add(Students);

       Students.ReBuild(3, "коля",4.8);

       list.Add(Students);

       cout<<"До сортировки:\n";

       for(int i=0; i<list.Size(); i++)

       {            cout<<i+1<<": "<<list.GetAtIndex(i)<<".\n";

       }

       for(int option=0; option<4; option++)

       {

             cout<<endl;

             switch(option)

             {

             case 0:

                    cout<<"Метод сортировки: по Номеру группы\n";

                    sort(list,cond_number_groop);

                    break;

             case 1:

                    cout<<"Метод сортировки: по Баллу\n";

                    sort(list,cond_ball);

                    break;

             case 2:

                    cout<<"Метод сортировки: по Имени\n";

                    sort(list,cond_name);

                    break;

             default:

                    cout<<"Метод сортировки: по Автору\n";

                    sort(list,cond_name);

                    break;

             }

             for(int i=0; i<list.Size(); i++)

             {

                    cout<<i+1<<": "<<list.GetAtIndex(i)<<".\n";

             }

       }

       system("pause");

}