ayuda con un problema de segmentación en mi programa
Publicado por diego (1 intervención) el 01/01/2019 16:24:22
La funcion me sirve bien al usarla sin el switch y el do-while, pero al meterlo me da problema de segmentación, ayuda por favor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
struct Disco {
char titulo[20];
char artista[20];
int fecha;
char formato[3];
float precio;
struct Disco *siguiente;
};
//struct Disco *primero, *ultimo; //variables globales que cambiaran cada vez que utilicemos el programa, necesitamos tener la direccion del primer nodo y el ultimo para luego recorrer la lista
void agregar(struct Disco **lista, struct Disco **primero) { //añadir nodos al final de la lista
struct Disco *nuevo; //nodo a agregar que declaramos como una variable local
struct Disco *ultimo;
nuevo = (struct Disco *) malloc (sizeof(struct Disco)); //reservamos la memoria del nodo, que tendra el mismo almacenamiento de su estructura
if (nuevo==NULL){
printf( "No hay memoria disponible.\n");
}
printf("Dame el titulo del disco:\n");
scanf(" %s", &nuevo->titulo);
printf("Dame el nombre del artista:\n");
scanf(" %s", &nuevo->artista);
printf("Dame la fecha:\n");
scanf(" %d", &nuevo->fecha);
printf("Dame el formato:\n");
scanf(" %s", &nuevo->formato);
printf("Dame el precio:\n");
scanf(" %f", &nuevo->precio);
nuevo->siguiente = NULL; //cada nodo a agregar apuntura a NULL para agregarse al final de la lista
if (*primero==NULL) { //verificamos si la lista esta vacia o no, entonces al agregar el nuevo nodo aqui justificamos que es el primero y ultimo en la lista
*primero = nuevo;
ultimo = nuevo;
}
else {//en el caso de tener nodos previos
ultimo=*lista;
ultimo->siguiente = nuevo; //el ultimo nodo ubicado en la lista apuntura al nuevo que agregamos
ultimo = nuevo; //indicamos que el nuevo nodo es el ultimo en la lista
}
*lista=ultimo;
return;
}
void todos(struct Disco **primero) {
struct Disco *aux; //declaro una variable local para mostar cada nodo
char op;
aux = *primero;
if(aux==NULL) printf("\nla lista esta vacia");
else{
do{
while (aux!=NULL) {//pongo como limite que aux sea diferente de NULL porque al cumplirse significara que llego al limite de la lista
printf("\n> Titulo: %s\n", aux->titulo);
printf("> Artista: %s\n", aux->artista);
printf("> Fecha: %d\n", aux->fecha);
printf("> Formato: %s\n", aux->formato);
printf("> Precio: %f\n", aux->precio);
printf("Ver los datos de otro disco? (s/n)\n");
scanf(" %c",&op);
op = toupper(op);
if(op=='S'){
aux = aux->siguiente;
}
else if(op=='N'){
aux = NULL;
}
}
}while(op!='S' && op!='N');}
return;
}
int confirmar(){
char respuesta;
do{
printf("¿Seguro que desea salir del programa (s/n):");
scanf(" %c",&respuesta);
if((respuesta== 's')||(respuesta== 'S')){
printf("Ha seleccionado \"Sí\"\n");
return 1;
}
if ((respuesta== 'n')||(respuesta== 'N')){
printf("Ha seleccionado \"No\"\n");
return 0;
}} while ((respuesta!= 'n')||(respuesta!= 'N')||(respuesta!= 's')||(respuesta!= 'S'));
return 0;
}
int main(){
int op,x=0;
struct Disco *lista;
struct Disco *primero;
primero=NULL;
do{
printf("escoga una opcion:\n1-agregar\n2-todo\n3-eliminar\n4-salir\n");
scanf("%i",&op);
lista=NULL;
switch(op){
case 1:
agregar(&lista,&primero);
break;
case 2:
todos(&primero);
break;
case 3:
eliminar(&primero);
break;
case 4:
x=confirmar();
break;
default:
printf("no escogio ninguna de las anteriores");
break;
}
}while(x==0);
printf("\n\nsalio");
return 0;
}
Valora esta pregunta


0