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);
}
Я вижу, что ты используешь список вдвойне соединенная, так что у тебя не была бы должна бы быть какая-либо проблема в пробегании чисел менее значительного в более значительный.
Я советовал бы тебе перемещать список в число и после позволять, чтобы это была система, которая берется за перевозки и избытки; функция, чтобы происходить ты 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);
Привет я думаю, что ты впутался немного в ней 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: Не забывай освободить память.
главным образом ты создаешь список 3 и вводишь узлы обоих списков с примитивными ввождения списка в третьем списке