у меня однонаправленный список, как мне поменять местами максимальный и первый элемент?

158
24 июня 2018, 19:00

макс элемент нашел, а как переприсвоить не знаю

void List::Zamena() {
  element *max = Head;
  element *temp = Head;
  max = temp->x;
  while (temp != NULL) {
    if (max->x < temp->x) {
      max = temp;
      temp = temp->Next;
    }
  }
}
Answer 1

Ну начнем с того, что максимальный элемент вы находите неправильно.

Далее, кроме максимального, нужно еще найти элемент, стоящий перед максимальным

void List::Zamena() {
  // Если список пустой, то выходим
  if (Head == NULL)
    return;
  element *max = Head;
  element *temp = Head;
  element *prev = NULL;
  element *prevMax = prev;
  while (temp != NULL) {
    // Если нашли элемент больший, чем текущий максимальный
    if (max->x < temp->x) {
      // то переприсваиваем максимальный и предыдущий перед максимальным
      max = temp;
      prevMax = prev;
    }
    // В любом случае переходим на следующий элемент
    prev = temp;
    temp = temp->Next;
  }
  // Если максимальный элемент первый, то выходим
  if (max == Head)
    return;
  // Элемент перед максимальным указывает на первый элемент
  prevMax->next = Head;
  // сохраняем второй элеммент
  temp = Head->next;
  // бывший первый элемент указывает на элемент за максимальным
  Head->next = max->next;
  // максимальный элемент указывает на сохраненный второй
  max->next = temp;
  // первый элемент стал максимальным
  Head = max;
}

Если же нужно поменять только значения узлов, ко код сильно упрощается

void List::Zamena() {
  // Если список пустой, то выходим
  if (Head == NULL)
    return;
  element *max = Head;
  element *temp = Head;
  while (temp != NULL) {
    // Если нашли элемент больший, чем текущий максимальный
    if (max->x < temp->x) {
      // то переприсваиваем максимальный
      max = temp;
    }
    // В любом случае переходим на следующий элемент
    temp = temp->Next;
  }
  // Если максимальный элемент первый, то выходим
  if (max == Head)
    return;
  // сохраняем значение первого элемента
  int tempX = Head->x;
  // присваиваем первому элементу значение из максимального
  Head->x = max->x;
  // присваиваем максимальному элементу сохраненное значение из первого
  max->x = tempX;
}
READ ALSO
почему компилятор ругается на fscanf? Выдает ошибку clang: error: linker command failed with exit code 1 (use -v to see invocation)

почему компилятор ругается на fscanf? Выдает ошибку clang: error: linker command failed with exit code 1 (use -v to see invocation)

//Из текстового файла вводится символьная строка, состоящая из чисел, //разделенных пробеломСоставить программу, которая вводит строку, организует...

211
Сравнение структур yaml файлов с++

Сравнение структур yaml файлов с++

Нужно с использованием библиотеки yamlh написать код для сравнения yaml файлов

187
Цикл для школьной задачи

Цикл для школьной задачи

Допустим, что задача звучит следующим образом:

213