Sumar los elementos de dos listas enlazadas en una tercera lista

La idea es representar una suma de tres dígitos

   6  8  9  <---- valores de lista 1.
   5  7  4   <----- valores lista 2.
 -------------
 1 2  6  3   <------ valores lista 3.

Hasta ahora obtengo el resultado de la suma, pero tomando los valores de izquierda a derecha.

  6 8 9
  5 7 4
_________
1 4 6 1  ---> regresa el resultado de sumar ( 986 + 474 )

Ya intente ingresar los datos en orden contrario en las dos primeras listas y nada.

Les muestro el código:

#include "iostream"
using namespace std;

struct nodo
{
 int numero;
 struct nodo* sig;
 struct nodo* ant;  
};
typedef struct nodo*Lista;

void insertarValores(Lista &lista,int digito)
{
Lista nuevo;
nuevo = new(struct nodo);
nuevo ->numero=digito;
    if(lista==NULL){
        lista=nuevo;
        lista->sig=NULL;
        lista->ant=NULL;    
    }
    else
    {
        nuevo->sig=lista;
        nuevo->ant=lista->ant;
        lista->ant=nuevo;
        lista=nuevo;
    }   

}
void insertarFinal(Lista & lista,int digito)
{
 Lista nuevo,aux =lista;    
 nuevo = new(struct nodo);
 nuevo->numero=digito;
 nuevo->sig=NULL;
 if(aux==NULL)
 {
    lista=nuevo;
 }
 else
   {
       while(aux->sig!=NULL)
       aux=aux->sig;   
       aux->sig=nuevo;

   }

}

void mostrar(Lista lista)
{

Lista aux =new (struct nodo);

aux=lista;
cout<<"\n";
    while(aux!=NULL){
    cout<<"   "<<aux->numero;
        aux=aux->sig;

    }   
}

void sumar(Lista &lista1,Lista &lista2,Lista &listaResultado)
 {
 Lista l1=lista1, l2=lista2;
  int acarreo=0;
   while (l1 != NULL && l2 != NULL)
  {
   int suma = l1->numero + l2->numero+acarreo;
   if(suma>=10)
     {
      insertarFinal(listaResultado, suma%10);
      acarreo=1;
     }
    else 
    {
    insertarFinal(listaResultado, suma%10);
    acarreo=0;  
    }
    l1 = l1->sig;
    l2 = l2->sig;
  }
  insertarFinal(listaResultado,acarreo);
}

int main(){
Lista arriba=NULL;
Lista abajo=NULL;
Lista resultado=NULL;
int L1,L2;
cout<<"Ingrese los valores a sumar de la lista 1 (arriba)"<<endl;
for(int i=0;i<3;i++)
{   cout<<"Lista 1.\n\tValor "<<i+1<<" ";
    cin>>L1;
    //insertarValores(arriba,L1);
    insertarFinal(arriba,L1);
    mostrar(arriba);
        cout<<"\n";
}
system("cls");
cout<<"Ingrese los valores a sumar de la lista 2 (abajo)"<<endl;
for(int i=0;i<3;i++)
{   cout<<"Lista 2.\n\tValor "<<i+1<<" ";
    cin>>L2;
    //insertarValores(abajo,L2);
insertarFinal(abajo,L2);
mostrar(abajo);
cout<<"\n";
}

system("cls");
mostrar(arriba); 
cout<<"\n+ ";
mostrar(abajo);
cout<<"\n___________________";

sumar(arriba,abajo,resultado);
mostrar(resultado);
}
1
задан 15.12.2016, 03:27
3 ответа

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

Предложение

Я советовал бы тебе перемещать список в число и после позволять, чтобы это была система, которая берется за перевозки и избытки; функция, чтобы происходить ты Lista в число он был бы:

int lista_a_numero(const Lista &lista)
{
    int resultado{}, arrastre{1};

    for (const nodo *actual = ultimo(lista); actual; actual = actual->ant)
    {
        resultado += (actual->numero * arrastre);
        arrastre *= 10;
    }

    return resultado;
}

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

const nodo *ultimo(const nodo *actual)
{
    if (actual->sig)
        return ultimo(actual->sig);

    return actual;
}

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

int valor1 = lista_a_numero(lista1);
int valor2 = lista_a_numero(lista2);
Lista listaSuma = numero_a_lista(valor1 + valor2);

Функция для trasnformar с числа до списка была бы нечто похожим:

Lista numero_a_lista(int numero)
{
    nodo *resultado = new nodo{numero % 10};
    numero /= 10;

    while (numero)
    {
        resultado = new nodo{numero % 10, resultado};
        resultado->sig->ant = resultado;
        numero /= 10;
    }

    return resultado;
}

С этим предложением код остался бы таким:

int main()
{
    Lista lista1 = numero_a_lista(689);
    Lista lista2 = numero_a_lista(574);

    int valor1 = lista_a_numero(lista1);
    int valor2 = lista_a_numero(lista2);
    Lista listaSuma = numero_a_lista(valor1 + valor2);

    std::cout << valor1 << " + " << valor2 << " = ";

    for (nodo *actual = listaSuma; actual; actual = actual->sig)
        std::cout << actual->numero;

    return 0;
}

[Вывод которой]:

689 + 574 = 1263

Советы

В C ++ он не необходим предпочитать struct чтобы относиться к структуре; так что у твоего узла был бы этот аспект:

struct nodo
{
 int numero;
 nodo* sig;
 nodo* ant;
};

Начиная с C ++ 11 ты можешь использовать единообразную инициализацию, чтобы давать стоимость членам твоей структуры в том же сайте, который они высказываются, так уберегаешься создавать строитель и убеждаешься, что они получают проконтролированную стоимость:

struct nodo
{
 int numero = 0;
 nodo* sig = nullptr;
 nodo* ant = nullptr;
};

Чтобы создавать иначе типов, typedef у него есть смущенный синтаксис, начиная с C ++ 11 ты можешь упрощать прозвище с инструкцией using:

using Lista = nodo *;

Восходите расскажи, что также он не требует struct перед nodo.

Относительно этого прозвища, это ужасная, злосчастная, ужасная, неадекватная, несвойственная, нелогичная идея и много других отрицательных определений. Один nodo это не одна Lista, концептуально это отличные вещи... он как будто ты говорил, что свеча - машина; создай объект Lista не говори, что один nodo это одна Lista.

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

// mostrar una lista no requiere modificarla
void mostrar(const Lista lista);
// no se requiere modificar lista1 ni lista2 para sumar
void sumar(const Lista &lista1, const Lista &lista2, Lista &listaResultado);
1
ответ дан 24.11.2019, 12:05
  • 1
    Спасибо действительно он я был очень ú til и прежде всего он был очень ясный, где он не удавался. Tambié n большое спасибо советами ты имеешь всю razó n и как хорошо, что возьми ее время ориентирования меня на это чувство. –  tpmtu 31.12.2016, 03:36

Привет я думаю, что ты впутался немного в ней funciГіn сумма () уже он должен бы быть проще, asГ - что я дал себе задание изменить немного твой код

void sumar(Lista &lista1, Lista &lista2, Lista &listaResultado){    
Lista l1=lista1, l2=lista2;

while (l1 != NULL && l2 != NULL) {

    int suma = l1->numero + l2->numero;
    insertarFinal(listaResultado, suma);
    l1 = l1->sig;
    l2 = l2->sig;
  }
}

Main

int main() {

    Lista lista1 = NULL, lista2 = NULL,listaSuma=NULL;
    int n;

   //Llenamos primer lista
    for (int i = 0; i < 3; i++) {
       cout << "Ingrese el valor lista 1 " << endl;
       cin >> n;
       insertarFinal(lista1, n);
    }
    cout << endl;

    //Llenamos segunda lista
    for (int i = 0; i < 3; i++) {
       cout << "Ingrese el valor lista 2" << endl;
       cin >> n;
       insertarFinal(lista2, n);
    }
    cout << endl;

    sumar(lista1, lista2, listaSuma);
    mostrar(listaSuma);

   cin.get();
   cin.get();
   return 0;
}

PD: Не забывай освободить память.

0
ответ дан 24.11.2019, 12:05
  • 1
    Спасибо за давание тебе времени ответа. Ты имеешь razó n funció n сумма была слишком запутанной. Способ, в котором ты это упрощаешь эту очень хорошо, но só я это добавил часть, что faltó перевозка в единицах. Но проблема остается :(... перевозка делает это левой стороной до правой стороны. –  tpmtu 15.12.2016, 03:18

главным образом ты создаешь список 3 и вводишь узлы обоих списков с примитивными ввождения списка в третьем списке

0
ответ дан 24.11.2019, 12:05
  • 1
    Я верю в то, что эта ló gica она была ясной в вопросе. ¿ Podrí схвати расширять твой ответ, чтобы объяснять có mo serí в? Фрагмент có я говорю ayudarí чтобы в понимать то, что está s отвечая –  Mariano 19.12.2016, 18:10

Теги

Похожие вопросы