Другие языки программирования и технологии

/*разработать программу для создания и работы с двусвязным списком, состоящим из структур.

Master 999
Master 999
588
ну так на скорую руку в полусонном состоянии

#include "stdlib.h"
#include "conio.h"

struct human { //структура
char surname [16]; //фамилия
unsigned int year; //год рождения
human* next; //ссылка на следующий
human* back; //ссылка на предыдущий
};

void NewRecord (human* &first, human* &last) //добавление новой записи (без учёта сортировки)
{
char sn_buf [16]; //ввод данных
unsigned int y_buf;
printf ("Input surname (15 symbols max):\n");
scanf ("%s", sn_buf);
printf ("Input birth year:\n");
scanf ("%d", &y_buf);
if (first==NULL) { //если список пуст
first = new human; //создаём первый элемент
first->year = y_buf;
strcpy (first->surname, sn_buf);
first->next = NULL; //других элементов нет - ссылки на нули
first->back = NULL;
last = first; //ссылка на последний тоже ссылается на первый
} else { //элементы уже есть
human* tmp = new human; //создаём новый объект
tmp->year = y_buf;
strcpy (tmp->surname, sn_buf);
tmp->next = NULL; //он будет последним - дальше 0
tmp->back = last; //предыдущий - бывший последний
last->next = tmp; //у бывшего последнего настраиваем ссылку на следующий
last = tmp; //сохраняем ссылку на последний
}
printf ("\nSuccessfully added\n");
}

void PrintList (human* first) //распечатка списка
{
printf ("\nList:\n");
human* cur = first; //начинаем с первого
while (cur!=NULL) { //пока есть элемент
printf ("s %d\n", cur->surname, cur->year); //выводим его
cur = cur->next; //переходим на следующий
}
}

void ExchangeElements (human* &el1, human* &el2) //обмен элементов списка
{
human* b_el1 = el1->back; //сохраним предыдущий и следующие элементы в списке относительно двух обмениваемых
human* b_el2 = el2->back;
human* n_el1 = el1->next;
human* n_el2 = el2->next;
//нужно переставить ссылки так, чтобы элемент el2 указывал на элементы перед и после el1 вместо el2 и наоборот
//только в условии надо учесть, что если будут обмениваться соседние элементы в списке, то нельзя просто
//перекопировать ссылки друг у друга (элемент будет указывать сам на себя и список зациклится)
if (b_el2!=el1) el1->back = b_el2;
else el1->back = el2;
if (n_el2!=el1) el1->next = n_el2;
else el1->next = el2;
if (b_el1!=el2) el2->back = b_el1;
else el2->back = el1;
if (n_el1!=el2) el2->next = n_el1;
else el2->next = el1;
//когда мы выправляем ссылки для элементов, окружающих обмениваемые, надо проверить существование этих элементов
//во избежание ошибки (например, у первого элемента списка не будет предыдущего, а у последнего - следующего)
if (b_el1!=NULL && b_el1!=el2) b_el1->next = el2;
if (b_el2!=NULL && b_el2!=el1) b_el2->next = el1;
if (n_el1!=NULL && n_el1!=el2) n_el1->back = el2;
if (n_el2!=NULL && n_el2!=el1) n_el2->back = el1;
}

void SortList (human* &first, human* &last) //сортировка списка
{
human *cur_i, *cur_j, *min, *cur;
//сортировка методом прямого выбора
for (cur_i=first; cur_i->next!=NULL;) { //идём от первого до предпоследнего
min = cur_i; cur = cur_i; //берём текущий за минимальный, сохраняем текущий
for (cur_j = cur_i->next; cur_j!=NULL; cur_j = cur_j->next) //идём от следующего до конца
if (cur_j->year < min->year) min = cur_j; //ищем минимальный из оставшихся
cur_i = cur_i->next; //переводим ссылку внешнего цикла во избежание её потери
if (cur->year!=min->year) { //если элементы менять надо
if (cur->back==NULL) first = min; //проверяем, не первый ли это
if (min->next==NULL) last = cur; //и не последний ли
ExchangeElements (cur, min); //меняем местами, т.е. ставим меньший наверх
}
}
}

void InsertIntoSorted (human* &first, human* &last) //вставка элемента в сортированный список
{
char sn_buf [16]; //ввод
unsigned int y_buf;
printf ("Input surname (15 symbols max):\n");
scanf ("%s", sn_buf);
printf ("Input birth year:\n");
scanf ("%d", &y_b
Евгений Енин
Евгений Енин
1 142
Лучший ответ
таких есть достаточно много в сети. только с более широким функционалом. ту задачу что ты описал - это написать программу ради самой программы и процесса написания.