Двухнаправленный список

203
21 апреля 2017, 21:16
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) и желательно еще сократить код.Как-то так ,откликнитесь ребята очень нужна помощь.

Answer 1

о мои глоза! зачем стандартную библиотеку завезли? смотрите <algorithm>

READ ALSO
FadeIn текста в slick каруселе

FadeIn текста в slick каруселе

Доброй ночи, дорогие друзьяИспользую slick carousel

298
Определить что это за кодировка. %s216%t198

Определить что это за кодировка. %s216%t198

Есть строка в javascript файле

204
Как сравнить подмассивы?

Как сравнить подмассивы?

Как правильно сравнить данные массиваУ меня есть массив с тремя подмассивами:

208