Inicio
Buscar
Ingresar
Registrarse
Starfield: el juego que revolucionará el espacio y la tecnología
Hack x Crack - Comunidad de Seguridad informática
»
Programación
»
C / C++
»
Lista enlazada simple – borrar nodo [Lenguaje C]
Imprimir
Páginas: [
1
]
Ir Abajo
Autor
Tema: Lista enlazada simple – borrar nodo [Lenguaje C] (Leído 12008 veces)
Pino1952
Visitante
Lista enlazada simple – borrar nodo [Lenguaje C]
«
en:
Junio 20, 2015, 07:20:48 pm »
Hola a todos.
Estoy renegando mucho con esto de aprender las listas ligadas simples en lenguaje c, leí muchísimas páginas con ej. pero casi todos están por separados y la vez que encuentro uno que parece sencillo le falta la función para borrar un elemento, me rompí el marote tratando de aplicar la función borrar_elemento de otros programas pero definitivamente me doy por vencido.-
Si alguien es tan amable y desea ayudarme lo que necesitaría es que me escriban la función aplicada al programa que dejo a continuación.-
Código: C
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
struct
_agenda
{
char
nombre
[
30
]
;
char
telefono
[
12
]
;
struct
_agenda
*
siguiente
;
}
;
struct
_agenda
*
primero
,
*
ultimo
;
void
mostrar_menu
(
)
;
void
agregar_elemento
(
)
;
void
mostrar_lista
(
)
;
int
main
(
void
)
{
char
opcion
,
ch
;
primero
=
(
struct
_agenda
*
)
NULL
;
ultimo
=
(
struct
_agenda
*
)
NULL
;
do
{
mostrar_menu
(
)
;
opcion
=
getchar
(
)
;
while
(
(
ch
=
getchar
(
)
)
!=
EOF
&&
ch
!=
'
\n
'
)
;
switch
(
opcion
)
{
case
'1'
:
agregar_elemento
(
)
;
break
;
case
'2'
:
printf
(
"No disponible todavía!
\n
"
)
;
break
;
case
'3'
:
mostrar_lista
(
primero
)
;
break
;
case
'4'
:
exit
(
1
)
;
default
:
printf
(
"Opción no válida
\n
"
)
;
break
;
}
}
while
(
opcion
!=
'4'
)
;
getchar
(
)
;
return
0
;
}
void
mostrar_menu
(
)
{
system
(
"CLS"
)
;
printf
(
"
\n
\n
===== Menu ====="
)
;
printf
(
"
\n
\n
1 - Agregar elemento"
)
;
printf
(
"
\n
2 - Borrar elemento"
)
;
printf
(
"
\n
3 - Mostrar elementos"
)
;
printf
(
"
\n
4 - Salir"
)
;
printf
(
"
\n
\n
Escoge una opcion......: "
)
;
}
/* Con esta función añadimos un elemento al final de la lista */
void
agregar_elemento
(
)
{
struct
_agenda
*
nuevo
;
/* reservamos memoria para el nuevo elemento */
nuevo
=
(
struct
_agenda
*
)
malloc
(
sizeof
(
struct
_agenda
)
)
;
if
(
nuevo
==
NULL
)
{
printf
(
"
\n
No hay memoria disponible"
)
;
}
printf
(
"
\n
===== Nuevo elemento ====="
)
;
printf
(
"
\n
Nombre.....:"
)
;
gets
(
nuevo
->
nombre
)
;
printf
(
"
\n
Telefono...:"
)
;
gets
(
nuevo
->
telefono
)
;
/* el campo siguiente va a ser NULL por ser el último elemento*/
nuevo
->
siguiente
=
NULL
;
/* ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista */
/* comprobamos si la lista está vacía. si primero==NULL es que no
hay ningún elemento en la lista. también vale ultimo==NULL */
if
(
primero
==
NULL
)
{
printf
(
"
\n
Primer elemento"
)
;
primero
=
nuevo
;
ultimo
=
nuevo
;
}
else
{
/* el que hasta ahora era el último tiene que apuntar al nuevo */
ultimo
->
siguiente
=
nuevo
;
/* hacemos que el nuevo sea ahora el último */
ultimo
=
nuevo
;
}
}
void
mostrar_lista
(
)
{
struct
_agenda
*
auxiliar
;
/* lo usamos para recorrer la lista */
int
i
=
0
;
auxiliar
=
primero
;
printf
(
"
\n
Mostrando la lista completa:
\n
"
)
;
while
(
auxiliar
!=
NULL
)
{
printf
(
"
\n
Nombre: %s, Telefono: %s"
,
auxiliar
->
nombre
,
auxiliar
->
telefono
)
;
auxiliar
=
auxiliar
->
siguiente
;
i
++;
}
if
(
i
==
0
)
{
printf
(
"
\n
La lista esta vacia!!
\n
"
)
;
}
getchar
(
)
;
}
Desde ya muchas gracias.-
Daniel
En línea
stakewinner00
{ L7 } Juanker
Mensajes: 1010
Re:Lista enlazada simple – borrar nodo [Lenguaje C]
«
Respuesta #1 en:
Junio 20, 2015, 07:56:48 pm »
Si ya entendiste como añadir un elemento no creo que sea muy difícil borrar uno. Simplemente lo haces lo contrario que la función de añadir pero sin olvidar de liberar la memoria usando la función free ( que antes reservaste usando malloc)
En línea
Pino1952
Visitante
Re:Lista enlazada simple – borrar nodo [Lenguaje C]
«
Respuesta #2 en:
Junio 20, 2015, 08:53:07 pm »
Hola.
Se dice que los foros están creados para ayudar, la verdad tu post más que ayudarme me confunde aún más, igual muchas gracia por la intención.-
Saludos.
Daniel
En línea
stakewinner00
{ L7 } Juanker
Mensajes: 1010
Re:Lista enlazada simple – borrar nodo [Lenguaje C]
«
Respuesta #3 en:
Junio 20, 2015, 09:07:17 pm »
Si, pero no entendí bien tu duda. Lo que tu dijiste si entendí bien es "hacerme esto", pero no se que duda tienes con esto.
Ya te dije la parte importante que mucha gente suele descuidarse, que es liberar la memoria, pero no se que duda más tienes al respecto para poder ayudarte. Si pusieras lo que probaste se podría ver más claramente que es lo que no quedo del todo claro para ayudar.
«
Última modificación: Junio 20, 2015, 09:08:50 pm por stakewinner00
»
En línea
Pino1952
Visitante
Re:Lista enlazada simple – borrar nodo [Lenguaje C]
«
Respuesta #4 en:
Junio 20, 2015, 09:28:35 pm »
Hola.
Ok, con "hacerme esto" ya me das a entender tu criterio, de verdad no tengo ningún avance porque no sé por dónde empezar y es por eso que pedía una función eliminar_nodo como ej. de mi parte voy a dar este post como cerrado porque si seguimos con esto yo no voy a llegar a nada y peligra que escriba algo “desubicado” y no pueda volver a efectuar consultas y realmente con mis 63 años y siendo un autodidacta no me queda otra que solicitar ayuda en los foros, esta vez no conseguí evacuar mi duda, otra vez seguramente será.-
Una pequeña sugerencia, no hubiese resultado más practico que me pusieras la función (no creo que ocupe más de 5 o 6 líneas de código) y yo me haga cargo de discernir si eso de copiar y pegar me sirve o me perjudica?, nunca voy a terminar de entender ese pre juicio de los moderadores/administradores de los foros.-
Saludos.
Daniel
En línea
ravenheart
{ L7 } Juanker
Mensajes: 1359
Todos mis mensajes están bajo la licencia WTFPL v2
Re:Lista enlazada simple – borrar nodo [Lenguaje C]
«
Respuesta #5 en:
Junio 21, 2015, 01:23:16 am »
Depende de lo que quieras hacer. La operación de borrado es sencilla; el problema real está en definir las operaciones según tus necesidades.
Si te vale con borrar por el final, es trivial: te vas al penúltimo elemento, liberas el puntero al siguiente elemento, y lo pones a NULL.
Si quieres borrar un elemento arbitrario, empiezan las complicaciones. Lo más sencillo es tener una lista doblemente enlazada (con un puntero al elemento siguiente y otro puntero al elemento anterior). Para borrar el nodo de la posición N, tienes que hacer que el puntero "siguiente" del nodo N-1 apunte a N+1, y que el nodo anterior de N+1 apunte a N-1.
Borrar de una lista enlazada simple es algo más complicado, porque tienes que hacer que el puntero "siguiente" del nodo N-1 apunte al nodo N+1, pero no tienes acceso a N-1.
Lo normal es borrar por valor (el primer elemento que se encuentre, o todos los que coincidan con el valor especificado, según necesidades), y recorrer la lista entera (o hasta encontrar el elemento, según).
En línea
You do not need hope if you have drama to back you up.
Imprimir
Páginas: [
1
]
Ir Arriba
Hack x Crack - Comunidad de Seguridad informática
»
Programación
»
C / C++
»
Lista enlazada simple – borrar nodo [Lenguaje C]
Va un mudo y le dice a un sordo: Hack x Crack usa cookies. Pues eso...
OK
Learn more