listas

Iniciado por johrdy, 3 Marzo 2012, 23:30 PM

0 Miembros y 1 Visitante están viendo este tema.

johrdy

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;
}

Ferno

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.

johrdy

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;
}

rir3760

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|.

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:
int main()
{
   struct nodo *inicio = NULL, *aux, *aux2;
   int opcion, n, a = 4;
   int ch;
   
   /* ... */
   
   if (opcion == 1) {
      printf ("¿cuantos nombres y montos va a agregar? : \n");
      scanf ("%d", &n);
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
     
      while (n > 0) {
         if (inicio == NULL) {
            inicio = malloc (sizeof (struct nodo) );
            gets (inicio->nombre);
            scanf ("%d", &inicio->monto);
            inicio->sgte = NULL;
         }else {
            aux = malloc (sizeof (struct nodo) );
            gets (aux->nombre);
            scanf ("%d", &aux->monto);
            aux->sgte = inicio;
            inicio = aux;
         }
         
         while ((ch = getchar()) != EOF && ch != '\n')
            ;
         
         n--;
      }
   }
   
   /* ... */


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language