struct Spis2
{
int info;
Spis2 *next, *prev;
};
В списке нужно поменять местами второй элемент и максимальный.Я сделал, но надо упростить код.Нужна помощь!Непосредственно код программы:
struct Spis2 {
int info;
Spis2 *next, *prev;
};
void create(Spis2 **b, Spis2 **e)
{
Spis2 *t = new Spis2;
int in;
cout << "Input value - ";
cin >> in;
t->info = in;
t->next = NULL;
if (*b == NULL) {
t->prev = t->next = NULL;
*b = *e = t;
} else {
t->next = NULL;
t->prev = *e;
(*e)->next = t;
(*e) = t;
}
}
void view(Spis2 *begin, Spis2 *end)
{
Spis2 *t;
int d;
if (begin == NULL) {
cout << "Queue is empty!" << endl;
return;
}
cout << "Select way to view queue: \n1 - from start \n2 - from end" << endl;
cin >> d;
switch (d) {
case 1:
t = begin;
cout << "Queue: " << endl;
while (t != NULL) {
cout << t->info << endl;
t = t->next;
}
break;
case 2:
t = end;
cout << "Queue: " << endl;
while (t != NULL) {
cout << t->info << endl;
t = t->prev;
}
break;
}
cout << endl;
}
Spis2 *max(Spis2 *begin)
{
int maks = begin->info;
Spis2 *t = begin, *max = begin;
while (t != NULL) {
if (t->info > maks) {
max = t;
maks = t->info;
}
t = t->next;
}
return max;
}
Spis2* exchange(Spis2 *begin, Spis2 *max, Spis2 **end) {
Spis2 *p = begin->next;
if (max == p)
{
cout << "Second element is biggest!" << endl;
return begin;
}
Spis2 *tmp;
if (p->next == NULL)
{
begin->next = NULL;
p->prev = NULL;
p->next = begin;
begin->prev = p;
*end = begin;
return p;
}
if (max == begin)
{
tmp = p->next;
tmp->prev = begin;
begin->next = tmp;
p->next = begin;
begin->prev = p;
p->prev = NULL;
return p;
}
if (max->next == NULL)
{
max->prev->next = p;
p->prev->next = max;
p->next->prev = max;
tmp = max->prev;
max->prev = begin;
p->prev = tmp;
max->next = p->next;
p->next = NULL;
*end = p;
return begin;
}
if (max == p->next)
{
max->next->prev = p;
max->prev->next = max -> next;
p->prev->next = max;
p->next = max->next;
p->prev = max;
max->prev = begin;
begin->prev = NULL;
return begin;
}
max->next->prev = p;
max->prev->next = p;
p->prev->next = max;
p->next->prev = max;
tmp = max->next;
max->next = p->next;
p->next = tmp;
tmp = p->prev;
p->prev = max->prev;
max->prev = begin;
return begin;
}
int main() {
srand(time(NULL));
int n, y;
Spis2 *begin = NULL, *end = NULL, *begin1 = NULL, *end1 = NULL;
cout << "Input queue size: ";
cin >> n;
for (int i = 0; i < n; i++) create(&begin, &end);
view(begin, end);
begin = exchange(begin, max(begin), &end);
view(begin, end);
system("pause");
return 0;
}
P.S.Менять нужно именно так(меняя связи указателей),просто поменять сами значения нельзя! P.P.S Не знаю куда уж подробней,но постараюсь:есть двунаправленный список,с указателям соответственно на предыдущий и следующий элементы.Нужно поменять второй элемент списка и максимальный, не трогая их значений,а двигая связи, используя при этом как можно меньше временных переменных(в моем случае p,tmp) и желательно еще сократить код.Как-то так ,откликнитесь ребята очень нужна помощь.
о мои глоза! зачем стандартную библиотеку завезли? смотрите <algorithm>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как правильно сравнить данные массиваУ меня есть массив с тремя подмассивами: