elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  listas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: listas  (Leído 2,181 veces)
johrdy

Desconectado Desconectado

Mensajes: 7


Ver Perfil
listas
« 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;
}


En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: listas
« Respuesta #1 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.


En línea

johrdy

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: listas
« Respuesta #2 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;
}
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: listas
« Respuesta #3 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|.

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
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listas
PHP
Darksurgeon13 1 2,047 Último mensaje 19 Diciembre 2009, 19:28 pm
por Og.
Uso de Listas: Subprograma que lea 2 listas y forme una.
Dudas Generales
hbenitez 2 3,272 Último mensaje 8 Agosto 2010, 20:11 pm
por hbenitez
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 5,096 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
Listas en C++
Programación C/C++
farresito 4 3,114 Último mensaje 10 Marzo 2011, 12:54 pm
por farresito
Problemilla maquetando con listas <ul>
Desarrollo Web
soru13 2 1,453 Último mensaje 20 Marzo 2013, 20:00 pm
por soru13
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines