Как упорядочивание с insert sort соединенного списка c ++

У меня есть программа в c ++, в котором я хочу манипулировать методом распоряжения InsertSort.

Я прошу, чтобы данные с одним он женил в файле main.cpp для после в файле Lista.cpp мочь показывать его, где вводить это, в этом случае у меня есть insertaInicio.

case 1:
        cout << "Codigo: ";
        cin >> codigoDistribuidora;
        nuevo.guardaNombre(codigoDistribuidora);
        cout << "Nombre: ";
        cin.ignore();
        getline(cin, nombreDistribuidora);
        nuevo.guardaNombre(nombreDistribuidora);
        cout << "Domicilio: ";
        getline(cin, domicilioDistribuidora);
        nuevo.guardaNombre(domicilioDistribuidora);
        cout << "Telefono: ";
        cin >> telefonoDistribuidora;
        nuevo.guardaNombre(telefonoDistribuidora);
        cout << "Nombre del gerente: ";
        cin.ignore();
        getline(cin, nombreGerente);
        nuevo.guardaNombre(nombreGerente);
        l.insertaInicio(nuevo);
        break;

и введи начало он этот:

void Lista::insertaInicio(Distribuidora dato) {
Nodo *tmp = new Nodo;
Nodo *aux = inicio;
tmp->guardaObjeto(dato);

tmp->guardaNodoSig(NULL);

bool nada = vacia();
if (nada) {
    inicio = tmp;
}
else {
    tmp->sig = aux;
    inicio = tmp;
}
string nombreDistribuidora = dato.damenombreDistribuidora();
string codigoDistribuidora = dato.damecodigoDistribuidora();
cout << "Has agregado la Distruibuidora con el nombre: '" << nombreDistribuidora << "' y codigo '" << codigoDistribuidora << "'" << endl;
}

Поскольку он был бы способом использовать InsertSort, и что упорядочил их, в момент которого ты вводишь их. Я надеюсь понять себя спасибо.

2
задан 04.04.2016, 10:55
2 ответа
case 1:
    cout << "Codigo: ";
    cin >> codigoDistribuidora;
    nuevo.guardaNombre(codigoDistribuidora);
    cout << "Nombre: ";
    cin.ignore();
    getline(cin, nombreDistribuidora);
    nuevo.guardaNombre(nombreDistribuidora);
    cout << "Domicilio: ";
    getline(cin, domicilioDistribuidora);
    nuevo.guardaNombre(domicilioDistribuidora);
    cout << "Telefono: ";
    cin >> telefonoDistribuidora;
    nuevo.guardaNombre(telefonoDistribuidora);
    cout << "Nombre del gerente: ";
    cin.ignore();
    getline(cin, nombreGerente);
    nuevo.guardaNombre(nombreGerente);
    l.insertaInicio(nuevo);
    break;

Предыдущий код был бы должен идти в независимой функции. Помимо улучшения непомерно читабельности кода нужно иметь в виду, что решения switch они могут быть достаточно опасными, если он скрывает один break или если этот проскальзывает мимо до времени. Он высоко рекомендуемый иметь case самые простые.

С другой стороны, и ввиду того, что ты не включаешь полное осуществление Lista, я комментирую тебе, чем в функции insertaInicio у тебя может быть проблема:

void Lista::insertaInicio(Distribuidora dato) {
  Nodo *tmp = new Nodo;
  Nodo *aux = inicio; // <<--- AQUI!!!
}

Что происходит, если список пустой и, как следствие, inicio обозначься в nullptr? Ввиду того, что ты делаешь копию inicio в aux он не стоит изменять адрес, указанный из-за aux, так как в этом случае inicioон не будет узнавать.

И хороший, говоря уже о твоей проблеме, что ты должен делать, состоит в том, чтобы находить в какой точке списка ты должен вводить в новый элемент. Таким образом, список будет всегда аккуратным. То, чего тебе не хватает, состоит в том, чтобы определять способ упорядочивать список:

  • Из-за кода распределителя?
  • По имени распределителя?
  • Из-за номера телефона?

Если мы понимаем, что ты выбираешь первый выбор алгоритм, и что порядок возрастающий, чтобы определять положение нового элемента, она была бы следующей:

  1. Если inicio он nullptr список пустой, потом inicio укажи на новый элемент и мы закончились
  2. В противоположном случае пробегать элементы списка до того, чтобы находить код, который был бы большим, чем тот элемента, чтобы добавлять. Новый элемент должен будет быть введенным между этим узлом и предыдущим.

Выражение с кодом могло бы быть чем-то таким, что я схватил:

Nodo* nuevo = new Nodo;
// falta la inicialización del nodo

if( inicio == nullptr )
  inicio = nuevo;
else
{
  Nodo* previo = inicio;

  Nodo* siguiente = inicio->sig;

  while ( siguiente != nullptr && siguiente->damecodigoDistribuidora() < nuevo->damecodigoDistribuidora() )
  {
    previo = siguiente;
    siguiente = previo->sig;
  }

  // Podemos llegar a este punto desde dos caminos diferentes
  // 1. El código de siguiente es mayor que el del nuevo elemento
  // 2. Hemos llegado al final de la lista
  // En cualquier caso la operativa es exactamente la misma:
  // Insertar el nodo entre previo y siguiente
  previo->sig = nodo;
  nodo->sig = siguiente;
}

Приветствие.

2
ответ дан 24.11.2019, 14:38
  • 1
    То, что он перемещает, что aux я это использую вместо того, чтобы использовать начало, только я считаю это очевидным таково из-за, тот, что преподаватель, который просит это такое у нас, как он попросил это у нас, если список функционирует правильно. только у метода распоряжения не было идеи как мочь вводить это. Спасибо за твой ответ. Я хочу упорядочить это из-за кода, что мне не хватало этой части включать ее. – Eduardo Javier Maldonado 06.04.2016, 21:28

Как кажется, ты работаешь с просто соединенным списком, что делает процесс вставления, упорядоченного слегка сложнее.

В этом типе списков, аккуратный процесс вставления разделяется в:

  1. Обнаруживать точку вставления: пробеги узлы с твоего корня до последнего узла (верха) сравнивая стоимость ввода с хранением; тогда, когда стоимость ввода была меньше в хранение (или ты достиг верха) habrás найденный точка вставления.
  2. Создавать новый узел: ты должен соединять это в узел точки вставления (первый, который содержит стоимость, превосходящую стоимость ввода или верха).
  3. Пере-соединять узлы: узел, предыдущий точке вставления должен указывать на новый созданный узел.

Nodo *anterior = inicio;
Nodo *punto_insercion = anterior->sig;

while (punto_insercion  && (punto_insercion->dato > dato))
{
    anterior = punto_insercion;
    punto_insercion = punto_insercion->sig;
}

// Una vez superado el bucle, punto_insercion apunta
// al nodo inmediatamente superior al actual o al tope

anterior->sig = new Nodo(dato, punto_insercion);

В коде предыдущего примера я беру на себя ответственность:

  • Список не является пустым.
  • Nodo он располагает строителем, который получает dato и узел на который указывать.
  • dato чтобы сравнивать он располагает оператором большим, который >.

Имей в виду, что то, что я написал, является путеводителем, ты должен приспосабливать это к твоей необходимости и иметь в виду, что я не протестировал псевдо-код

1
ответ дан 24.11.2019, 14:38