Miércoles 20 de Noviembre de 2024, 12:28
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
[resuelto] Problema con violacion de segmento
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: [resuelto] Problema con violacion de segmento (Leído 2786 veces)
Miguel Ruiz
Nuevo Miembro
Mensajes: 1
[resuelto] Problema con violacion de segmento
«
en:
Sábado 31 de Marzo de 2018, 08:56 »
0
Hola a todos. Lo que pasa es que estoy trabajando con listas ligadas, el programa que estoy haciendo ya realiza algunas funciones, pero en la que me marca el error de violacion de segmento es cuando doy la opcion de realizar un recorrido del grafo y no se porque, las funciones que utilizo son unas que hice llamadas void recorrido() y void visitado(). en esa parte supongo que debe estar el error, una disculpa por poner el codigo completo pero es por si lo quieren correr. El error esta en la linea 344 en adelante que es donde hago mi funcion recorrido()
pd. El codigo esta sin terminar porque me atore en esta parte
Modifico el post ya que ya corregi el problema que tenia, el fallo estaba en que hacia operaciones con direcciones invalidas(Si alguien quiere el codigo me lo puede decir)
Código: C
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FALSO 0
typedef
struct
grafo
{
struct
grafo
*
vertice
;
struct
vertad
*
verticead
;
char
nombre
[
10
]
;
int
vis
;
}
elemento_grafo
;
typedef
struct
vertad
{
struct
vertad
*
verticead
;
char
nombre
[
10
]
;
int
vis
;
}
elemento_vert
;
typedef
struct
pilas
{
struct
pilas
*
sig
;
char
nombre
[
10
]
;
}
pila
;
void
menu
(
int
*
op
)
;
elemento_grafo
*
Crearnodo
(
)
;
elemento_grafo Creararco
(
)
;
elemento_grafo
*
Agregarvertice
(
elemento_grafo
*
cabeza
)
;
elemento_grafo
*
buscar
(
elemento_grafo
*
cabeza
,
char
nom
[
10
]
)
;
void
Mostrargrafo
(
elemento_grafo
*
cabeza
)
;
void
Calculargrado
(
elemento_grafo
*
cabeza
)
;
elemento_grafo
*
Eliminarvertice
(
elemento_grafo
*
cabeza
,
char
nom
[
10
]
)
;
void
Recorrido
(
elemento_grafo
*
cabeza
)
;
void
Limpiar
(
elemento_grafo
*
cabeza
)
;
void
visitado
(
elemento_grafo
*
cabeza
,
char
nom
[
10
]
)
;
pila
*
empilar
(
pila
*
inicio
,
elemento_vert
*
tem
,
char
nom
[
10
]
)
;
pila
*
desempilar
(
pila
*
inicio
,
char
nom
[
10
]
)
;
FILE
*
arch
;
int
cont
=
0
;
int
main
(
)
{
elemento_grafo
*
cabeza
;
int
op
;
char
nom
[
10
]
;
arch
=
fopen
(
"datos.txt"
,
"r+b"
)
;
cabeza
=
NULL
;
if
(
arch
!=
NULL
)
{
printf
(
"
\n
Programa de grafos con listas de adyacencia"
)
;
do
{
menu
(
&
op
)
;
getchar
(
)
;
printf
(
"
\n
\n
"
)
;
switch
(
op
)
{
case
1
:
cabeza
=
Agregarvertice
(
cabeza
)
;
cont
++;
break
;
case
2
:
Creararco
(
cabeza
)
;
break
;
case
3
:
if
(
cabeza
!=
NULL
)
{
Mostrargrafo
(
cabeza
)
;
}
else
{
printf
(
"
\n
Grafo no existe"
)
;
}
break
;
case
4
:
if
(
cabeza
==
NULL
)
printf
(
"
\n
No hay grafo que evaluar"
)
;
else
Calculargrado
(
cabeza
)
;
break
;
case
5
:
if
(
cabeza
!=
NULL
)
{
printf
(
"
\n
Si"
)
;
printf
(
"
\n
Ingrese el vertice que quiere eliminar:
\t
"
)
;
scanf
(
"%s"
,
nom
)
;
cabeza
=
Eliminarvertice
(
cabeza
,
nom
)
;
}
else
printf
(
"
\n
No existe grafo"
)
;
break
;
case
6
:
if
(
cabeza
==
NULL
)
printf
(
"
\n
Grafo vacio"
)
;
else
Recorrido
(
cabeza
)
;
break
;
default
:
break
;
}
}
while
(
op
!=
9
)
;
}
fclose
(
arch
)
;
}
void
menu
(
int
*
op
)
{
char
local
;
printf
(
"
\n
1> Ingresar vertice"
)
;
printf
(
"
\n
2> Ingresar arco"
)
;
printf
(
"
\n
3> Mostrar grafo"
)
;
printf
(
"
\n
4> Mostrar grado de grafo"
)
;
printf
(
"
\n
5> Eliminar vertice"
)
;
printf
(
"
\n
6> Mostrar recorrido del grafo"
)
;
printf
(
"
\n
7> Mostrar arbol de expansion minima"
)
;
printf
(
"
\n
8> Mostrar arbol de camino mas corto"
)
;
printf
(
"
\n
9> Salir"
)
;
printf
(
"
\n
Seleccione una opcion:
\t
"
)
;
do
{
local
=
getchar
(
)
;
if
(
(
isdigit
(
local
)
==
FALSO
)
&&
(
local
!=
'
\n
'
)
)
{
printf
(
"
\n
Ingrese una opcion valida.
\n
"
)
;
printf
(
"
\n
1> Ingresar vertice"
)
;
printf
(
"
\n
2> Ingresar arco"
)
;
printf
(
"
\n
3> Mostrar grafo"
)
;
printf
(
"
\n
4> Mostrar grado de grafo"
)
;
printf
(
"
\n
5> Eliminar vertice"
)
;
printf
(
"
\n
6> Mostrar recorrido del grafo"
)
;
printf
(
"
\n
7> Mostrar arbol de expansion minima"
)
;
printf
(
"
\n
8> Mostrar arbol de camino mas corto"
)
;
printf
(
"
\n
9> Salir"
)
;
printf
(
"
\n
Seleccione una opcion:
\t
"
)
;
//printf("\t");
}
}
while
(
isdigit
(
(
unsigned
char
)
local
)
==
FALSO
)
;
*
op
=
(
int
)
local
-
'0'
;
}
elemento_grafo
*
Crearnodo
(
)
{
elemento_grafo
*
nuevo
;
char
nom
[
10
]
;
printf
(
"
\n
Ingrese el nombre del vertice:
\t
"
)
;
//getchar();
scanf
(
"%s"
,
nom
)
;
nuevo
=
(
struct
grafo
*
)
malloc
(
sizeof
(
elemento_grafo
)
)
;
nuevo
->
vertice
=
NULL
;
nuevo
->
verticead
=
NULL
;
nuevo
->
vis
=
0
;
strcpy
(
nuevo
->
nombre
,
nom
)
;
return
nuevo
;
}
elemento_grafo
*
Agregarvertice
(
elemento_grafo
*
cabeza
)
{
elemento_grafo
*
nuevo
,*
i
;
if
(
cabeza
==
NULL
)
{
nuevo
=
Crearnodo
(
)
;
fputs
(
nuevo
->
nombre
,
arch
)
;
return
nuevo
;
}
else
{
nuevo
=
Crearnodo
(
)
;
for
(
i
=
cabeza
;
i
->
vertice
!=
NULL
;
i
=
i
->
vertice
)
;
i
->
vertice
=
nuevo
;
fputs
(
nuevo
->
nombre
,
arch
)
;
return
cabeza
;
}
}
elemento_grafo
*
buscar
(
elemento_grafo
*
cabeza
,
char
nom
[
10
]
)
{
elemento_grafo
*
aux
,*
temp
;
//char nom[10];
int
f
=
0
;
//printf("\n Ingrese los nodos:\n ");
//getchar();
//fgets(nom,10,stdin);
//printf("\n %s",nom);
temp
=
NULL
;
aux
=
cabeza
;
while
(
f
==
0
)
{
if
(
strcmp
(
aux
->
nombre
,
nom
)
==
0
)
{
//printf("/ Vertice encontrado");
temp
=
aux
;
f
=
1
;
}
else
aux
=
aux
->
vertice
;
if
(
aux
==
NULL
)
f
=
1
;
}
return
temp
;
}
elemento_grafo Creararco
(
elemento_grafo
*
cabeza
)
{
elemento_grafo
*
ori
,*
des
;
elemento_vert
*
nuevo1
,*
nuevo2
,*
i
;
char
nom
[
10
]
;
int
f
=
0
;
if
(
cabeza
!=
NULL
)
{
printf
(
"
\n
Ingrese el nodo origen:
\t
"
)
;
scanf
(
"%s"
,
nom
)
;
ori
=
buscar
(
cabeza
,
nom
)
;
//printf("\n Si");
if
(
ori
!=
NULL
)
{
printf
(
"
\n
Ingrese el nodo destino:
\t
"
)
;
scanf
(
"%s"
,
nom
)
;
des
=
buscar
(
cabeza
,
nom
)
;
if
(
des
!=
NULL
)
{
nuevo1
=
(
struct
vertad
*
)
malloc
(
sizeof
(
elemento_vert
)
)
;
nuevo1
->
verticead
=
NULL
;
nuevo1
->
vis
=
1
;
nuevo2
=
(
struct
vertad
*
)
malloc
(
sizeof
(
elemento_vert
)
)
;
nuevo2
->
verticead
=
NULL
;
nuevo2
->
vis
=
1
;
strcpy
(
nuevo2
->
nombre
,
ori
->
nombre
)
;
strcpy
(
nuevo1
->
nombre
,
des
->
nombre
)
;
if
(
ori
->
verticead
==
NULL
)
ori
->
verticead
=
nuevo1
;
else
{
for
(
i
=
ori
->
verticead
;
i
->
verticead
!=
NULL
;
i
=
i
->
verticead
)
;
i
->
verticead
=
nuevo1
;
}
if
(
des
->
verticead
==
NULL
)
des
->
verticead
=
nuevo2
;
else
{
for
(
i
=
des
->
verticead
;
i
->
verticead
!=
NULL
;
i
=
i
->
verticead
)
;
i
->
verticead
=
nuevo2
;
}
}
else
{
printf
(
"
\n
El nodo destino no existe"
)
;
}
}
else
{
printf
(
"El nodo origen no existe"
)
;
}
}
else
{
printf
(
"
\n
No hay suficientes vertices para crear arco"
)
;
}
}
void
Mostrargrafo
(
elemento_grafo
*
cabeza
)
{
elemento_grafo
*
i
,*
aux
;
elemento_vert
*
j
,*
tem
;
aux
=
cabeza
;
int
f
=
0
,
b
=
0
;
while
(
f
==
0
)
{
printf
(
"%s"
,
aux
->
nombre
)
;
tem
=
aux
->
verticead
;
while
(
tem
!=
NULL
)
{
printf
(
" -> %s"
,
tem
->
nombre
)
;
tem
=
tem
->
verticead
;
}
aux
=
aux
->
vertice
;
if
(
aux
==
NULL
)
f
=
1
;
printf
(
"
\n
"
)
;
}
}
void
Calculargrado
(
elemento_grafo
*
cabeza
)
{
elemento_grafo
*
aux
,
*
i
;
elemento_vert
*
tem
;
int
f
=
0
,
cont
=
0
,
b
=
0
,
grado
=
0
;
aux
=
cabeza
;
while
(
f
==
0
)
{
cont
=
0
;
b
=
0
;
tem
=
aux
->
verticead
;
while
(
b
==
0
)
{
if
(
tem
==
NULL
)
{
b
=
1
;
}
else
{
cont
++;
tem
=
tem
->
verticead
;
}
}
aux
=
aux
->
vertice
;
if
(
cont
>=
grado
)
{
grado
=
cont
;
}
if
(
aux
==
NULL
)
{
f
=
1
;
}
}
printf
(
"
\n
El grado del grafo es: %d"
,
grado
)
;
}
elemento_grafo
*
Eliminarvertice
(
elemento_grafo
*
cabeza
,
char
nom
[
10
]
)
{
elemento_grafo
*
pos
,*
aux
,*
i
;
elemento_vert
*
tem
,*
j
;
int
f
=
0
,
b
=
0
;
printf
(
"
\n
%s"
,
nom
)
;
pos
=
buscar
(
cabeza
,
nom
)
;
if
(
pos
!=
NULL
)
{
aux
=
cabeza
;
if
(
pos
==
aux
)
{
aux
=
aux
->
vertice
;
cabeza
=
aux
;
}
else
if
(
pos
->
vertice
==
NULL
)
{
while
(
aux
->
vertice
!=
pos
)
aux
=
aux
->
vertice
;
aux
->
vertice
=
NULL
;
}
else
{
while
(
aux
->
vertice
!=
pos
)
aux
=
aux
->
vertice
;
i
=
aux
->
vertice
;
i
=
i
->
vertice
;
aux
->
vertice
=
i
;
//return cabeza;
}
}
aux
=
cabeza
;
while
(
aux
!=
NULL
)
{
printf
(
"
\n
Entra"
)
;
b
=
0
;
tem
=
aux
->
verticead
;
if
(
tem
!=
NULL
)
while
(
tem
!=
NULL
)
{
if
(
strcmp
(
tem
->
nombre
,
nom
)
==
0
)
{
if
(
tem
->
verticead
==
NULL
&&
aux
->
verticead
==
tem
)
aux
->
verticead
=
NULL
;
else
if
(
tem
->
verticead
==
NULL
)
{
j
=
aux
->
verticead
;
while
(
j
->
verticead
!=
NULL
)
j
=
j
->
verticead
;
j
->
verticead
=
NULL
;
}
else
if
(
aux
->
verticead
==
tem
)
{
tem
->
verticead
;
aux
->
verticead
=
tem
;
}
else
if
(
tem
->
verticead
==
NULL
)
{
j
=
aux
->
verticead
;
while
(
j
->
verticead
!=
tem
)
j
=
j
->
verticead
;
tem
=
tem
->
verticead
;
j
->
verticead
=
tem
;
}
}
tem
=
tem
->
verticead
;
}
aux
=
aux
->
vertice
;
}
return
cabeza
;
}
void
Recorrido
(
elemento_grafo
*
cabeza
)
{
char
nom
[
10
]
;
int
nodos
=
cont
;
elemento_grafo
*
aux
,*
final
;
elemento_vert
*
tem
,*
j
,*
i
;
pila
*
dir
,*
inicio
=
NULL
;
printf
(
"
\n
Desde que nodo desea realizar el recorrido:
\t
"
)
;
scanf
(
"%s"
,
nom
)
;
aux
=
buscar
(
cabeza
,
nom
)
;
if
(
aux
==
NULL
)
{
printf
(
"
\n
El vertice dado no existe"
)
;
}
else
{
int
f
=
0
,
b
=
0
;
printf
(
"
\n
%d"
,
cont
)
;
while
(
f
==
0
)
{
if
(
nodos
>=
0
)
{
printf
(
"%s"
,
aux
->
nombre
)
;
printf
(
"->"
)
;
}
tem
=
aux
->
verticead
;
b
=
0
;
while
(
b
==
0
)
{
if
(
tem
->
vis
==
1
)
tem
=
tem
->
verticead
;
else
{
j
=
tem
;
strcpy
(
nom
,
tem
->
nombre
)
;
while
(
j
!=
NULL
)
{
if
(
strcmp
(
nom
,
j
->
nombre
)
>
0
&&
j
->
vis
!=
1
)
{
printf
(
"(%s)>(%s)"
,
nom
,
j
->
nombre
)
;
strcpy
(
nom
,
j
->
nombre
)
;
i
=
j
;
j
=
j
->
verticead
;
}
else
j
=
j
->
verticead
;
}
b
=
1
;
}
//tem = tem->verticead;
//if( tem->verticead == NULL || tem == NULL)
//b = 1;
}
visitado
(
cabeza
,
nom
)
;
aux
=
buscar
(
cabeza
,
nom
)
;
nodos
--;
if
(
nodos
==
0
)
f
=
1
;
}
printf
(
"
\n
%d"
,
nodos
)
;
}
}
pila
*
empilar
(
pila
*
inicio
,
elemento_vert
*
tem
,
char
nom
[
10
]
)
{
}
pila
*
desempilar
(
pila
*
inicio
,
char
nom
[
10
]
)
{
}
void
visitado
(
elemento_grafo
*
cabeza
,
char
nom
[
10
]
)
{
elemento_grafo
*
aux
;
elemento_vert
*
tem
;
int
f
=
0
,
b
=
0
;
aux
=
cabeza
;
while
(
aux
!=
NULL
)
{
if
(
strcmp
(
nom
,
aux
->
nombre
)
==
0
)
{
aux
->
vis
=
1
;
aux
=
aux
->
vertice
;
}
tem
=
aux
->
verticead
;
while
(
tem
!=
NULL
)
{
if
(
strcmp
(
nom
,
tem
->
nombre
)
==
0
)
{
tem
->
vis
=
1
;
tem
=
tem
->
verticead
;
}
else
tem
=
tem
->
verticead
;
}
aux
=
aux
->
vertice
;
}
}
Tweet
«
última modificación: Lunes 30 de Abril de 2018, 10:34 por Eternal Idol
»
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re:[resuelto] Problema con violacion de segmento
«
Respuesta #1 en:
Lunes 30 de Abril de 2018, 10:35 »
0
Tenes que depurarlo, no te queda otra.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
[resuelto] Problema con violacion de segmento