Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: johrdy en 3 Marzo 2012, 23:30 pm



Título: listas
Publicado por: johrdy en 3 Marzo 2012, 23:30 pm
me pueden ayudar con este codigo en C, no se xq me sale violacion de segmento, gracias de antemano

#include<stdio.h>
#include<stdlib.h>
int main(){
typedef struct lista{
 char nombre[30];
 int monto;
 struct lista *puntero;
}Nodo;
   int opcion,i=5;
   Nodo *l1,*l2,*l3;   
   l2=l1;
   l3=l1;
   while(opcion!=5){
      printf("1.- Insertas nuevos nombres y montos\n");
      printf("2.- Eliminar nombres y montos\n");
      printf("3.- Imprimir nombres y montos\n");
      printf("4.- Ordenar por montos\n");
      printf("5.- Salir\n");
      scanf("%d",&opcion);
      if(opcion==1){
         while(i>0){
            gets(l1->nombre);
            scanf("%d",&l1->monto);
            l1->puntero = (Nodo*) malloc(sizeof(Nodo));
            l1=l1->puntero;
            i--;
         }
      }
      if(opcion==2){
      }
      if(opcion==3){
         while(l3->puntero != NULL){
            printf("%s      %d",l3->nombre,l3->monto);
            l3=l3->puntero;
         }
         l3=l2;
      }
      if(opcion==4){
      }
   }
return 0;
}


Título: Re: listas
Publicado por: Ferno en 3 Marzo 2012, 23:40 pm
Porque, así como pides memoria mediante la función malloc() para el puntero dentro de tu struct, también debes pedir memoria para el struct en sí.
Estás declarando un puntero y no le estás reservando memoria en donde escribir.


Título: Re: listas
Publicado por: johrdy en 4 Marzo 2012, 18:14 pm
ya arregle un poco mi codigo, ahora se me presenta otro problema... cuando trato de imprimir los valores ingresados debajo de los nombres ymontos se me aparece una especie de codigo de numeros...a ver si me hechan una manito

struct nodo{
char nombre[30];
int monto;
struct nodo *sgte;
};
#include<stdio.h>
#include <stdlib.h>
int main(){
struct nodo *inicio=NULL,*aux,*aux2;
int opcion,n,a=4;
while(a==4){
printf("1.- Insertar nombres y montos\n");
printf("2.- Eliminar nombres y montos\n");
printf("3.- Ordenar nombres y montos\n");
printf("4.- Imprimir nombres y montos\n");
printf("5.- Salir\n");
scanf("%d",&opcion);
if(opcion==1){
printf("¿cuantos nombres y montos va a agregar? : \n");
scanf("%d",&n);
while(n>0){
if(inicio==NULL){
inicio=malloc(sizeof(struct nodo));
gets(inicio->nombre);
scanf("%d",&inicio->monto);
inicio->sgte=NULL;
}
if(inicio!=NULL){
aux=malloc(sizeof(struct nodo));
gets(aux->nombre);
scanf("%d",&aux->monto);
aux->sgte=inicio;
inicio=aux;
}
n--;
}
}
if(opcion==2){
}
if(opcion==3){
}
if(opcion==4){
aux2=inicio;
while(aux2!=NULL){
printf("%s         %d\n",aux2->nombre,aux2->monto);
aux2=aux2->sgte;
}
}
if(opcion==5){
break;
}
}
return 0;
}


Título: Re: listas
Publicado por: rir3760 en 5 Marzo 2012, 00:35 am
Primero: debes ayudarnos, facilitarnos la tarea de revisar tu programa y para ello debes utilizar las etiquetas de código y utilizar indentacion ya que así se facilita su lectura. Por favor revisa los temas fijos del foro.

El error en el programa se debe a que estas intercalando llamadas a scanf y gets. El problema con ello es que la primera usualmente ignora el espacio blanco mientras que la segunda no. Y debes evitar el uso de gets, por favor lee |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Para solucionarlo hay que eliminar el resto de la linea después de las llamadas a scanf utilizando "%d" dentro del bucle. También se deben cambiar los dos "if" por un "if ... else ..." ya que tal como esta se esta pidiendo un registro de mas.

Los cambios al bucle son:
Código
  1. int main()
  2. {
  3.   struct nodo *inicio = NULL, *aux, *aux2;
  4.   int opcion, n, a = 4;
  5.   int ch;
  6.  
  7.   /* ... */
  8.  
  9.   if (opcion == 1) {
  10.      printf ("¿cuantos nombres y montos va a agregar? : \n");
  11.      scanf ("%d", &n);
  12.      while ((ch = getchar()) != EOF && ch != '\n')
  13.         ;
  14.  
  15.      while (n > 0) {
  16.         if (inicio == NULL) {
  17.            inicio = malloc (sizeof (struct nodo) );
  18.            gets (inicio->nombre);
  19.            scanf ("%d", &inicio->monto);
  20.            inicio->sgte = NULL;
  21.         }else {
  22.            aux = malloc (sizeof (struct nodo) );
  23.            gets (aux->nombre);
  24.            scanf ("%d", &aux->monto);
  25.            aux->sgte = inicio;
  26.            inicio = aux;
  27.         }
  28.  
  29.         while ((ch = getchar()) != EOF && ch != '\n')
  30.            ;
  31.  
  32.         n--;
  33.      }
  34.   }
  35.  
  36.   /* ... */

Un saludo