Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - agrichi

#1
Programación C/C++ / Ayuda con lista enlazada
24 Diciembre 2017, 10:30 AM
Hola!. Hice una lista simplemente enlazada y no me funciona en algunas partes.
No logro ver donde están los errores
Cuando ingreso un nodo al final de la lista (líneas 89 a 93), el programa se cuelga.
Cuando ingreso un dato que no existe para verlo (lineas 122 a 125), en lugar de mostrar el mensaje de que el dato no se encontró, también se cuelga.
Idem anterior cuando quiero eliminar un dato e ingreso uno que no existe (lineas 186 a 190)
Aquí está el código
Gracias!!


/ Lista simplemente enlazada que permite ingresar el nombre y la edad de personas
// Va ingresando los datos ordenados de menor a mayor según la edad de la persona
// Ademas el programa permite mostrar los datos de todas las personas o de una en particular,
// eliminar una determinada persona o a todas

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct nodo{
        char nombre[40];
        int edad;
struct nodo *siguiente;
           };

void IngresarUno(struct nodo **);
void MostrarUno(struct nodo**);
void MostrarTodos(struct nodo **);
void EliminarUno(struct nodo **);
void EliminarTodos(struct nodo **);

int main()
{
int opcion;
struct nodo *p;
p=NULL;
do{
system("cls");
printf("Ingrese la opcion\n\n1:Ingresar datos de una persona\n\n2:Ver datos de una persona\n\n");
printf("3:Mostrar todas las personas\n\n4:Borrar una persona\n\n5:Eliminar todas las personas\n\n6:Salir del programa\n\n");
scanf("%d",&opcion);
switch(opcion)
{
case 1:IngresarUno(&p);
    break;
case 2:MostrarUno(&p);
    break;
case 3:MostrarTodos(&p);
    break;
case 4:EliminarUno(&p);
        break;
case 5:EliminarTodos(&p);
    break; 
case 6:system("cls");
    exit(0);
}
   }while((opcion>=1)&&(opcion<=6));
system("cls"); 
printf("Opcion incorrecta\n\nEl programa terminara\n\n\n");
return 0;
}

void IngresarUno(struct nodo **principio)
{
system("cls");
struct nodo *anterior,*actual,*nuevo;
nuevo=(struct nodo *)malloc(sizeof(struct nodo));
if(!nuevo)
{
  printf("Error al reservar memoria\n\n");
  printf("Presione una tecla para salir\n\n");
  getch();
  exit(1);
  }
printf("Ingrese el nombre: ");
fflush(stdin);
gets(nuevo->nombre);
printf("\n\nIngrese la edad: ");
scanf("%d",&(nuevo->edad));
if(!(*principio)) // Si no hay ningún nodo en la lista, creo el primero
{
  (*principio)=nuevo;
  nuevo->siguiente=NULL;
}
else
{
  anterior=(*principio);
  actual=(*principio);
  while(((nuevo->edad)>(actual->edad))&&(actual)) //Mientras la edad del nodo nuevo sea mayor que la del nodo actual y mientras
  {                                                //no haya llegado al final de la lista, me voy desplazando por la lista
   anterior=actual;                                //actualizando los punteros para evaluar el siguiente nodo
   actual=(actual->siguiente);                     //Cuando salga del while tendre el lugar donde tengo que ubicar el nuevo nodo, y
  }                                                //puede ser al principio de la lista, al final, o entre dos nodos         
  if(anterior==actual)  //Si el nuevo nodo va al principio de la lista, los punteros son iguales
  {
   (*principio)=nuevo;
   (nuevo->siguiente)=actual;
  }
  else if(!actual) //Si llegue al final de la lista(el puntero actual apunta a NULL), entonces el elemento nuevo sera
  {                //el último elemento de la lista
   (anterior->siguiente)=nuevo;
   (nuevo->siguiente)=NULL;
  }
  else //Si no es ninguno de los casos anteriores, entonces el nuevo elemento va entre otros dos
  {   
   (anterior->siguiente)=nuevo;
   (nuevo->siguiente)=actual;
  }
}
printf("\n\n\nPresione una tecla para salir\n\n\n");
getch();
return;
}

void MostrarUno(struct nodo **principio)
{
struct nodo *actual;
int a;
actual=(*principio);
system("cls");
if(!(*principio))
{
  printf("Lista vacia\n\nPresione una tecla para salir\n\n\n");
  getch();
}
else
{
  printf("Ingrese la edad a buscar: ");
  scanf("%d",&a);
  while((a!=(actual->edad))&&actual) //Mientras no coincida la edad que busco con la del nodo, actualizo el puntero para leer el siguiente
   actual=actual->siguiente;
  if(!actual) //Si llegué al final de la lista, entonces no encontré la edad buscada
  {
   printf("\nNo se encontró la edad buscada\n\nPresione una tecla para salir\n\n\n");
   getch();
  }
  else
  {
   printf("\n\nLos datos son:\n\n\n");
   printf("Nombre: ");
   puts(actual->nombre);
   printf("\nEdad: %d\n\n",actual->edad);
   printf("Presione una tecla para salir\n\n\n");
   getch();
  }
}
return;
}

void MostrarTodos(struct nodo **principio)
{
struct nodo *actual;
actual=(*principio);
system("cls");
if(!(*principio))
{
  printf("Lista vacia\n\nPresione una tecla para salir\n\n\n");
  getch();
}
else
{
  while(actual)
  {
   printf("Nombre: ");
   puts(actual->nombre);
   printf("\nEdad: %d\n\n\n",actual->edad);
   actual=actual->siguiente;
  }
  printf("Presione una tecla para salir\n\n\n");
  getch();
}
return;
}

void EliminarUno(struct nodo **principio)
{
struct nodo *actual,*anterior;
int a;
system("cls");
if(!(*principio))
{
  printf("Lista vacia\n\nPresione una tecla para salir\n\n\n");
  getch();
}
else
{
  actual=(*principio);
  anterior=(*principio);
  printf("Ingrese la edad a eliminar: ");
  scanf("%d",&a);
  while((a!=(actual->edad))&&actual) //Mientras no coincida la edad que busco con la del nodo, actualizo el puntero para leer el siguiente
  {
   anterior=actual;
   actual=actual->siguiente;
  }
  if(!actual) //Si llegué al final de la lista, entonces no encontré la edad buscada
  {
   printf("\nNo se encontró la edad buscada\n\nPresione una tecla para salir\n\n\n");
   getch();
  }
  else if(anterior==actual)  //Si los punteros son iguales, entonces el nodo a eliminar es el primero
  {
   (*principio)=((*principio)->siguiente);
   free(actual);
   actual=NULL;
   printf("\n\nPresione una tecla para salir\n\n\n");
   getch();
  }
  else  // Si no es el primero, entonces es cualquiera de los demás
  {
   (anterior->siguiente)=(actual->siguiente);
   free(actual);
   actual=NULL;
  }
}
return;
}

void EliminarTodos(struct nodo **principio)
{
struct nodo *actual;
system("cls");
if(!(*principio))
{
  printf("Lista vacia\n\nPresione una tecla para salir\n\n\n");
  getch();
}
else
{
  actual=(*principio);
  while(actual)
  {
   (*principio)=((*principio)->siguiente);
   free(actual);
   actual=(*principio);
  }
  printf("La lista fue eliminada\n\n\nPresione una tecla para salir\n\n\n");
  getch();
  return;
}
}

#2
Programación C/C++ / Re: Matriz dinámica
18 Diciembre 2017, 15:36 PM
Es verdad, me había olvidado!
#3
Programación C/C++ / Re: Matriz dinámica
18 Diciembre 2017, 12:13 PM
Al fin lo conseguí
Este es el programa


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
int **punmem,i,j,k,filas,columnas;
printf("Ingrese la cantidad de filas: ");
scanf("%d",&filas);
punmem=(int **)malloc(filas*sizeof(int *));
if(punmem==NULL)
{
  printf("Error al reservar memoria\n\n");
  printf("Presione una tecla para salir\n\n");
  getch();
  exit(1);
}
for(i=0;i<filas;i++)
{
  printf("\n\nCantidad de elementos de la fila %d: ",i+1);
  scanf("%d",&columnas);
  *(punmem+i)=(int *)malloc(columnas*sizeof(int));
  if(*(punmem+i)==NULL)
  {
   printf("Error al reservar memoria\n\n");
   printf("Presione una tecla para salir\n\n");
   getch();
   exit(1);
  } 
  for(j=0;j<columnas;j++)  
  {
   printf("Elemento[%d][%d]: ",i+1,j+1);
   scanf("%d",((*(punmem+i))+j));         // LINEA MODIFICADA               
  }
  printf("\nElementos de la fila %d:\n",i+1);
  for(k=0;k<columnas;k++)
   printf("%d ",*(k+(*(punmem+i))));     // LINEA MODIFICADA
}
printf("\n\n\n");
for(i=0;i<filas;i++)
  free(*(punmem+i));
for(i=0;i<filas;i++)
  (*(punmem+i))=NULL;
free(punmem);
punmem=NULL;
return 0;
}




He modificado dos líneas, la 33 y la 37, ahora funciona
Gracias a todos por los aportes!!
#4
Programación C/C++ / Re: Matriz dinámica
16 Diciembre 2017, 20:30 PM
Aquí pongo el programa con los números de línea
Cuando ejecuto el programa va todo bien pero al final me aparece un mensaje que dice que se escribió fuera de la zona de memoria del buffer "heap"
¿Donde está el error en el co´digo?
Gracias!!


// Programa que reserva memoria dinámicamente para una matriz de X filas, y para cada fila Y columnas

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
int **punmem,i,j,k,filas,columnas;
printf("Ingrese la cantidad de filas: ");
scanf("%d",&filas);
punmem=(int **)malloc(filas*sizeof(int));
if(punmem==NULL)
{
  printf("Error al reservar memoria\n\n");
  printf("Presione una tecla para salir\n\n");
  getch();
  exit(1);
}
for(i=0;i<filas;i++)
{
  printf("\n\nCantidad de elementos de la fila %d: ",i+1);
  scanf("%d",&columnas);
  *(punmem+i)=(int *)malloc(columnas*sizeof(int));
  if(*(punmem+i)==NULL)
  {
   printf("Error al reservar memoria\n\n");
   printf("Presione una tecla para salir\n\n");
   getch();
   exit(1);
  } 
  for(j=0;j<columnas;j++)  
  {
   printf("Elemento[%d][%d]: ",i+1,j+1);
   scanf("%d",((*punmem)+i*columnas+j));
  }
  printf("\nElementos de la fila %d:\n",i+1);
  for(k=0;k<columnas;k++)
   printf("%d ",(*((*punmem)+i*columnas+k)));
}
printf("\n\n\n");
for(i=0;i<filas;i++)
  free(*(punmem+i));
for(i=0;i<filas;i++)
  (*(punmem+i))=NULL;
free(punmem);
punmem=NULL;
return 0;
}


#5
Hola
Tengo un par de dudas cuando edito un mensaje.
Cuando copio un código de programa y lo pego aquí, no se me agrega la numeración de
cada línea del código. Tengo puesta la opción de código GeSHi
Y cuando quiero insertar una imagen, voy al icono de insertar imagen pero solo me
aparece [jmg][/jmg]
¿Cómo se hace?
Gracias
#6
Programación C/C++ / Matriz dinámica
15 Diciembre 2017, 18:19 PM
Hola, Hice un programa que reserva memoria dinamicamente para una matriz, funciona bien hasta el final, ahí da error. Alguien sabe donde está el problema?
¿Está bien hecha la liberación de memoria al final del programa??
Gracias!!



#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
int **punmem,i,j,k,filas,columnas;
printf("Ingrese la cantidad de filas: ");
scanf("%d",&filas);
punmem=(int **)malloc(filas*sizeof(int*));
if(punmem==NULL)
{
printf("Error al reservar memoria\n\n");
printf("Presione una tecla para salir\n\n");
getch();
exit(1);
}
for(i=0;i<filas;i++)
{
printf("\n\nCantidad de elementos de la fila %d: ",i+1);
scanf("%d",&columnas);
*(punmem+i)=(int *)malloc(columnas*sizeof(int));
if(*(punmem+i)==NULL)
{
printf("Error al reservar memoria\n\n");
printf("Presione una tecla para salir\n\n");
getch();
exit(1);
}
for(j=0;j<columnas;j++)   
{
printf("Elemento[%d][%d]: ",i+1,j+1);
scanf("%d",((*punmem)+i*columnas+j)); // Se puede poner &punmem[j]
}
printf("\nElementos de la fila %d:\n",i+1);
for(k=0;k<columnas;k++)
printf("%d ",(*((*punmem)+i*columnas+k)));
}
printf("\n\n\n");
for(i=0;i<filas;i++)
free(*(punmem+i));
for(i=0;i<filas;i++)
(*(punmem+i))=NULL;
free(punmem);
punmem=NULL;
return 0;
}
#7
Hola!
Quiero reservar memoria para un entero con calloc y me da error
¿Que está mal?

#include <stdio.h>
#include <stdlib.h>

int main()
{
int *punmem;
punmem=(int *)calloc(1,sizeof(int));
if(*punmem==NULL)
  printf("Error al reservar memoria");
else
{
  *punmem=5;
  printf("%d",*punmem);
}
free(punmem);
return 0;
}
#8
Programación C/C++ / Ayuda con mi programa
9 Diciembre 2017, 15:34 PM
Buenos días, a ver si me pueden ayudar con este simple programita
Quiero inicializar una matriz usando aritmética de punteros pero me da error en esta linea   (*(*(p+i)+j))=k;

¿Que está mal?

Gracias!!


#include <stdio.h>
#define FILAS 2
#define COLUMNAS 2

int main()
{

int m[FILAS][COLUMNAS];
int *p,i,j,k=1;
p=*m;
printf("%d   %d",&m[0][0],p);

for(i=0;i<FILAS;i++)
  for(j=0;j<COLUMNAS;j++)
  {
   (*(*(p+i)+j))=k;
   k++; 
  }
for(i=0;i<FILAS;i++)
  for(j=0;j<COLUMNAS;j++)
   printf("%d ",m[j]);    
return 0;
}
#9
Programación C/C++ / Ayuda con mi programa
15 Noviembre 2017, 15:59 PM
Hola, alguien me puede decir que está mal en este programa?
Gracias!!

/* Programa que calcula 2^1+2^2+2^3+...+2^n */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
double num,resultado=0;
int i;
printf("Ingrese el valor de \"n\"\n\n");
scanf("%d",&num);
for(i=1;i<=num;i++)
  resultado+=pow(2,(double)i);
system("cls");
printf("El resultado es:  %f\n\n",resultado);
return 0;
}


MOD: Etiqueta GeSHi