Hola, necesito una ayuda , non puedo sumar los valores de una lista enlazada simple la cual tiene un apuntador de inicio, dejo al estructura y la funcion recursiva que logre hasta ahora
typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
};
int sumar(tlista lista)
{
pnodo i;
if(lista.inicio==NULL){
return 0;
}
else{
return lista.inicio->dato+sumar(i=i->sig);
}
}
;-)
Directamente no se puede hacer: tlista solo tiene un miembro que apunta a un pnodo, por tanto desde un tlista pasado como argumento no se puede ir al siguiente. Se me ocurre que con algo de trabajo y variables static podría ser, pero es hacer un código muy feo.
Lo mejor sería hacer algo así:
static int sumar_interno(pnodo nodo) {
if(!nodo)
return 0;
else
return nodo->dato + sumar_interno(nodo->sig);
}
int sumar(tlista *lista) {
if(!lista)
return 0;
else
return sumar_interno(lista->inicio);
}
Esto haría que la interfaz fuera sumar, pero ésta llamaría a sumar_interno quien haría realmente todo el trabajo; y esta sí puede iterar sobre sí misma pues un pnodo sí forma realmente la lista.
Habian explicado en clase una forma que era ir disminuyendo el tamaño de la lista y sumando cada dato a otra variable de tipo int suma todo con una sola funcion/procedimiento pero no me acuerdo solo tengo eso
Lo acabo de solucionar era que necesitaba el nodo cabeza que esta en la estructura lista "pnodo inicio", ahi va el codigo completo ;-)
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
};
void inicia(tlista &lista);
void crear(pnodo &nuevo);
void agregar_final(tlista &lista, pnodo nuevo);
int sumar_nodos(pnodo inicio);
void mostrar(tlista lista);
int main()
{
tlista milista;
pnodo nodo;
int opcion, suma=0;
inicia(milista);
do{
system("cls");
cout << "1. Iniciar lista" << endl;
cout << "2. Agregar elementos a la lista" << endl;
cout << "3. Sumar elementos" << endl;
cout << "4. Mostrar lista" << endl;
cout << "5. Salir" << endl;
cin >> opcion;
switch(opcion){
case 1: inicia(milista); break;
case 2: crear(nodo); if(nodo!=NULL){agregar_final(milista,nodo);}; break;
case 3: suma=sumar_nodos(milista.inicio); cout << "SUMA: " << suma << endl; break;
case 4: cout << "***LISTA***" << endl; mostrar(milista); break;
case 5: cout << "FIN DEL PROGRAMA" << endl; break;
default: cout << "Opcion incorrecta" << endl;
}
system("pause");
}while(opcion!=5);
}
void inicia(tlista &lista)
{
lista.inicio=NULL;
}
void crear(pnodo &nuevo)
{
nuevo=new tnodo;
if(nuevo!=NULL){
cout << "Ingrese valor: "; cin >> nuevo->dato;
nuevo->sig=NULL;
}
else{
cout << "MEMORIA INSUFICIENTE" << endl;
}
}
void agregar_final(tlista &lista, pnodo nuevo)
{
pnodo i;
if(lista.inicio==NULL){
lista.inicio=nuevo;
}
else{
for(i=lista.inicio;i->sig!=NULL;i=i->sig);
i->sig=nuevo;
}
}
int sumar_nodos(pnodo inicio)
{
if(inicio==NULL){
return 0;
}
else{
return inicio->dato+sumar_nodos(inicio->sig);
}
}
void mostrar(tlista lista)
{
pnodo i;
if(lista.inicio!=NULL){
for(i=lista.inicio;i!=NULL;i=i->sig){
cout << "Nodo: " << i->dato << endl;
}
cout << endl;
}
else{
cout << "LISTA VACIA" << endl;
}
}
::) ::) ::)
;-) ;-) ;-)
Mod: Prohibido el doble o triple post. Usa el botón "Modificar".
2 ideas para optimizar lo que ya tienes:
Si guardas la suma total en la struct lista y la actualizas cada vez que insertas un elemento, no necesitas iterar o hacer recursion.
Si guardas un puntero al ultimo nodo y lo actualizas cada vez que insertas al final, no necesitas iterar hasta el final cada vez que insertas.
Y si el ejercicio se hace con una pila en vez de una lista se hace casi todo de forma automática.
La profe dijo que ya esta bien, igual gracias
Tengo una funcion que suma los elementos de un vector recursion en su estado mas puro espero te sirva saludos!
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <ctime>
using namespace std;
void cargar (int arreglo[],int n);
void mostrar (int arreglo[],int num2,int n);
int sumavector (int num1,int arreglo[],int num2,int n);
int main (){
int n,suma;
cout<<"ingrese la longitud del vector: ";cin>>n;
int arreglo[n];
cargar (arreglo,n);
mostrar (arreglo,0,n);
suma =sumavector(0,arreglo,0,n);
cout<<"\nla suma es: "<<suma<<endl;
getch();
return 0;
}
int sumavector (int num1,int arreglo[],int num2,int n){
if (n==num2){//caso base elemental mi querdo watson :D
return num1;
}else{
num1=num1+arreglo[num2];
return sumavector(num1,arreglo,num2+1,n);}
}
void cargar (int arreglo[],int n){//en el siguiente metodo le pasado el vector y el indice que comienza en cero = num2
if (n>0){ //num2 debe ir aumentando de 1 en 1
srand(time(0)); //el srand sirve para sincronizar el rand con el reloj del pc
cargar(arreglo,n-1); //llamamos a la misma funcion cargar pero menos el ultimo dato n-1
arreglo[num2]=1+rand()% 10;}
}
void mostrar (int arreglo[],int num2,int n){
if (n>0){
mostrar(arreglo,num2+1,n-1);
cout<<arreglo[num2]<<" ";}
}
Mod: Obligatorio el uso de etiquetas GeSHi para códigos.
Hola Elias, que bien que curso estas haciendo? interesante tu funcion
Yo haria algo asi con sumar recursivamente un arreglo de enteros, donde n es el tamaño maximo del arreglo
int sumar(arreglo a, int n)
{
if(n==-1)
return 0;
else
return a[n]+sumar(a,n-1);
}
Estoy en la "U" 3 semestre :D recien comenzando, todo lo que avanzo de programacion y logica lo subo al foro para poder orientarme mas adelante si olvido algo, ademas es mi aporte a la comunidad EL CONOCIMIENTO ES LIBRE PARA TODOS
Que bueno, yo recien acabo de empezar el secundario primer año