Пример выполнения работы. Объект списка- сотрудник (поля: ФИО, дата приема на работу, должность, базовый оклад)

Условие задачи:

Объект списка- сотрудник (поля: ФИО, дата приема на работу, должность, базовый оклад). Сортировка по полю «оклад» методом прямого выбора.

Для решения задачи в среде Microsoft Visual Studio 2013 было создано стандартное консольное приложение (проект типа Win32 Console Application) с установленным свойством «пустой проект» (Empty project). В проект добавлен файл с расширением .cpp, исходный код которого приведен ниже.

Листинг программы с комментариями:

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

struct Sotr // Сотрудник

{

char fio[64]; // ФИО

char date[16]; // Дата рождения

char dolg[32]; // Должность

double okl; // Оклад

};

 

struct List // Список

{

Sotr sotr; // Инф поле

List *pNext; // Указательна следующий элемент

};

 

// Функция добавления элемента в начало списка

void addFirst(List *& pF, // Указатель на начало списка

List* p) // Указатель на добавляемый элемент

{

p->pNext = pF;

pF = p;

}

// Удаление элемента из начала списка

List * delFirst(List *&pF) // Функция возвращает указатель на удаляемый элемент

{

if (pF == 0) return 0;

List *p = pF;

pF = pF->pNext;

return p;

 

}

// Добавление элемента перед заданным

bool add(List *&pF, List * pZad, List *p)

{

// Функция возвращает true при нормальном завершении и false в случае ошибки

if (pZad == pF) // Элемент будет первым

{

p->pNext = pF;

pF = p;

return true;

}

 

List *pPred = pF; // Указатель на предыдущий элемент перед pZad

while (pPred->pNext != pZad && pPred->pNext)

pPred = pPred->pNext;

if (pPred->pNext == 0) return false; // Элемента pZad нет в списке

p->pNext = pZad;

pPred->pNext = p;

return true;

}

// Удаление любого элемента p из списка

List * del(List*& pF, List *p) // Функция возвращает указатель на удаленный элемент

{

if (pF == 0) return 0;

if (pF == p) // Удаляем первый элемент

{

pF = pF->pNext;

return p;

}

else

{

List *pPred = pF; // Указатель на предыдущий элемент перед p

while (pPred->pNext != p && pPred->pNext)

pPred = pPred->pNext;

if (pPred->pNext == 0) return 0; // Элемента p нет в списке

pPred->pNext = p->pNext;

return p;

}

while (delFirst(pF)); // Очистка списка

}

 

int main(int argc, char* argv[])

{

List *pF = 0; // Список пуст

List *p;

// Ввод списка

char Ch; // Переменная для ввода условия продолжения ввода

do

{

p = (List *)malloc(sizeof(List)); // Выделяем память под элемент

printf("\nFIO: ");

fflush(stdin); gets_s(p->sotr.fio);

printf("Date: ");

fflush(stdin); gets_s(p->sotr.date);

printf("Dolg: ");

fflush(stdin); gets_s(p->sotr.dolg);

printf("Okl=");

fflush(stdin); scanf_s("%lf", &p->sotr.okl);

addFirst(pF, p); // Добавляем элемент в начало списка

printf("For continue press Y or y else any key! ");

Ch = _getche(); // Чтение кода клавиши с печатью символа

} while (Ch == 'Y' || Ch == 'y');

// Вывод спика

for (List *pi = pF; pi; pi = pi->pNext) // Просмотр списка

printf("\n%s %s %s oklad=%.2f", pi->sotr.fio, pi->sotr.date,

pi->sotr.dolg, pi->sotr.okl);

 

// Сортировка списка

for (List *pi = pF; pi->pNext;)

{

// Ищем минимальный элемент в списке

double min = pi->sotr.okl;

List *pmin = pi;

for (List *pj = pi->pNext; pj; pj = pj->pNext)

if (pj->sotr.okl<min)

{

min = pj->sotr.okl;

pmin = pj;

}

if (pi != pmin) // Минимальный элемент делаем первым, он будет перед pi

{

del(pF, pmin);

add(pF, pi, pmin);

}

else pi = pi->pNext;

}

// Печать списка после сортировки

printf("\nSrting:");

for (List *pi = pF; pi; pi = pi->pNext) // Просмотр списка

printf("\n%s %s %s oklad=%.2f", pi->sotr.fio, pi->sotr.date,

pi->sotr.dolg, pi->sotr.okl);

printf("\nFor exit press any key ");

system("pause"); // Останавливаем программу, ждем нажатия любой клавиши

return 0;

}