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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


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

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Lista enlazada en c
« en: 9 Febrero 2022, 18:50 pm »

 ::) Buenos días, tengo un problema con el funcionamiento de este código, lo llevo en un curso y recientemente nos han enseñado C en Linux, el detalle que tengo es que al ingresar los datos ingresa la cedula y nombre pero a la segunda ronda el nombre se continua imprimiendo el mismo nombre de nuevo en todos los nuevos registros, espero alguien me pueda ayudar con mi consulta, gracias.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include<stdbool.h>// booleanos
  5. //Estructura Persona
  6. struct nodoPersona{
  7. int cedula;
  8. char *nombre;
  9. struct nodoPersona *ptrSiguienteNodoPersona;
  10. };
  11.  
  12. //Sinonimos para Persona
  13. typedef struct nodoPersona Persona;
  14. typedef Persona *ptrNodoPersona;
  15.  
  16. //Prototipos de funciones
  17. void insertarNodoPersona(ptrNodoPersona *nodoPersona, int pCedula, char *pNombre);
  18. void imprimeListaPersonas(ptrNodoPersona nodoInicial);
  19. ptrNodoPersona buscarPersonaPorCedula(ptrNodoPersona listaDePersonas, int pCedula);
  20. void eliminarNodoPersona(ptrNodoPersona *listaNodosPersona, int pCedula);
  21. void modificarNodoPersona(ptrNodoPersona *listaNodosPersona, int pCedula);
  22.  
  23. int main(void){
  24. int Opcion=1;
  25. int cont=0;
  26. //do{
  27. ptrNodoPersona nodoInicial = NULL;
  28.  
  29.  
  30.  
  31.  
  32. //scanf("%s", &Opcion);
  33.  
  34. insertarNodoPersona(&nodoInicial, 354488552, "Juan Camacho");
  35. insertarNodoPersona(&nodoInicial, 312578852, "Juanito Salas");
  36. insertarNodoPersona(&nodoInicial, 995512233, "Sandra Maroto");
  37. insertarNodoPersona(&nodoInicial, 884526568, "Luis Hernandez");
  38.  
  39.  
  40. imprimeListaPersonas(nodoInicial);
  41.  
  42.  
  43.  
  44. // int i;
  45. //eliminarNodoPersona(&nodoInicial, 500340876);
  46. //scanf("%s",);
  47.  
  48. while (Opcion != 0){
  49.  
  50. int cedulaBuscar = 0;
  51. char Nombre [50];
  52. printf("Digite la cedula a buscar: \n");
  53. scanf("%d", &cedulaBuscar);
  54.  
  55. if(buscarPersonaPorCedula(nodoInicial, cedulaBuscar) != NULL)
  56.    {
  57.     printf("La persona con nombre %s se encuentra en la lista \n", buscarPersonaPorCedula(nodoInicial, cedulaBuscar)->nombre);
  58.    }else{
  59.        printf("La persona con cedula %d NO se encuentra en la lista \n", cedulaBuscar);
  60.        printf("Se va a ingresar la Cedula %d \n", cedulaBuscar);
  61.        printf("Ingrese un Nombre \n" );
  62.        scanf("%s", Nombre); //va a tomar el dato ingresado
  63.        insertarNodoPersona (&nodoInicial, cedulaBuscar, Nombre); //ingresa el dato que es ingresado por el usuario junto con la cedula
  64.         imprimeListaPersonas(nodoInicial);
  65.        //++cont;
  66.        }
  67.  
  68. printf("Digite 0 para salir o cualquier tecla y enter para continual \n" );
  69. scanf("%d", &Opcion);
  70. //getch();
  71.    //return 0;
  72. }//Fin de la funcion main
  73.  
  74. //exit(0);
  75. }
  76. //Inserta Nodos de Persona
  77.  
  78.  
  79. void principal (){
  80.  
  81. }
  82. void insertarNodoPersona(ptrNodoPersona *nodoPersona, int pCedula, char *pNombre){
  83.  
  84. ptrNodoPersona ptrNuevo;
  85. ptrNodoPersona ptrAnterior;
  86. ptrNodoPersona ptrActual;
  87.  
  88. ptrNuevo = malloc(sizeof(Persona));
  89.  
  90. if(ptrNuevo != NULL){
  91.  
  92.  ptrNuevo->cedula = pCedula;  //->
  93.  //strcpy(ptrNuevo.nombre, pNombre);
  94.  ptrNuevo->nombre = pNombre;
  95.  
  96.  ptrAnterior = NULL;
  97.  ptrActual = *nodoPersona;
  98.  
  99.  while(ptrActual != NULL && pCedula > ptrActual->cedula){
  100.   ptrAnterior = ptrActual;
  101.   ptrActual = ptrActual->ptrSiguienteNodoPersona;
  102.  }//Fin del while acomodo por numero de cedula
  103.  
  104.  if(ptrAnterior == NULL){
  105.   ptrNuevo->ptrSiguienteNodoPersona = *nodoPersona;
  106.   *nodoPersona = ptrNuevo;
  107.  }
  108.  else{
  109.   ptrAnterior->ptrSiguienteNodoPersona = ptrNuevo;
  110.   ptrNuevo->ptrSiguienteNodoPersona = ptrActual;
  111.  }
  112. }//Fin de if de memoria disponible
  113. else{
  114.  printf("No se puede insertar la persona con la cedula %d por falta de memoria en el sistema. \n", pCedula);
  115. }//Fin de else no hay memoria disponible
  116.  
  117. }//Fin de la funcion insertarNodoPersona
  118.  
  119. void imprimeListaPersonas(ptrNodoPersona nodoInicial){
  120. if(nodoInicial == NULL){
  121.  printf("La lista de personas esta vacia.\n");
  122. }//Fin del if lista vacia
  123. else{
  124.  printf("Las personas almacenadas son:\n");
  125.  while(nodoInicial != NULL){
  126.   printf("%d %s\n", nodoInicial->cedula, nodoInicial->nombre);
  127.   nodoInicial = nodoInicial->ptrSiguienteNodoPersona;
  128.  }//Fin del while que recorre la lista
  129. }//Fin del else la lista no esta vacia
  130. }//Fin de la funcion imprimeListaPersonas
  131.  
  132. ptrNodoPersona buscarPersonaPorCedula(ptrNodoPersona listaDePersonas, int pCedula){
  133. ptrNodoPersona ptrPersona = NULL;
  134. if(listaDePersonas == NULL){
  135.  printf("La lista de personas esta vacia.\n");
  136. }// Fin de if lista vacia
  137. else{
  138.  while(listaDePersonas != NULL){
  139.   if(listaDePersonas->cedula == pCedula){
  140.    ptrPersona = listaDePersonas;
  141.   }//Fin del while
  142.   listaDePersonas = listaDePersonas->ptrSiguienteNodoPersona;
  143.  }//Fin del while de busqueda
  144. }// Fin del else si hay datos en la lista
  145.  
  146. return ptrPersona;
  147.  
  148. }// Fin de la funcion buscarPersonaPorCedula
  149.  
  150. void eliminarNodoPersona(ptrNodoPersona *listaNodosPersona, int pCedula){
  151. ptrNodoPersona ptrAnterior;
  152. ptrNodoPersona ptrActual;
  153. ptrNodoPersona ptrTemporal;
  154.  
  155. //Elimina el primer nodo
  156. if(pCedula == (*listaNodosPersona)->cedula){
  157.  ptrTemporal = *listaNodosPersona;
  158.  *listaNodosPersona = (*listaNodosPersona)->ptrSiguienteNodoPersona;
  159.  free(ptrTemporal);
  160.  printf("La persona con cedula %d, fue eliminada.\n", pCedula);
  161. }//Fin del if primer nodo
  162. else{
  163.  ptrAnterior = *listaNodosPersona;
  164.  ptrActual = (*listaNodosPersona)->ptrSiguienteNodoPersona;
  165.  
  166.  while(ptrActual != NULL && ptrActual->cedula != pCedula){
  167.   ptrAnterior = ptrActual;
  168.   ptrActual = ptrActual->ptrSiguienteNodoPersona;
  169.  }//Fin del while de busqueda
  170.  
  171.  //Elimina el nodo Actual
  172.  if(ptrActual != NULL){
  173.   ptrTemporal = ptrActual;
  174.   ptrAnterior->ptrSiguienteNodoPersona = ptrActual->ptrSiguienteNodoPersona;
  175.   free(ptrTemporal);
  176.   printf("La persona con cedula %d, fue eliminada.\n", pCedula);
  177.  }//Fin del if de eliminar
  178.  else{
  179.   printf("No se pudo eliminar la persona con cedula %d, verifique.\n", pCedula);
  180.  }//Fin del else no se elimino
  181. }//Fin de else para eliminar cualquier otro nodo
  182. }//Fin de la funcion eliminarNodoPersona
  183.  
  184. void modificarNodoPersona(ptrNodoPersona *listaNodosPersona, int pCedula){
  185. ptrNodoPersona ptrActual;
  186.  
  187. ptrActual = *listaNodosPersona;
  188.  while(ptrActual != NULL){
  189.   if(ptrActual->cedula == pCedula)
  190.   ptrActual->nombre = "El nombre asignado";
  191.  
  192.   ptrActual = ptrActual->ptrSiguienteNodoPersona;
  193.  }//Fin del while de busqueda
  194. }//Fin de la funcion modificarNodoPersona

MOD: Etiqueta GeSHi


« Última modificación: 9 Febrero 2022, 19:45 pm por MDS1993 » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Lista enlazada en c
« Respuesta #1 en: 10 Febrero 2022, 19:56 pm »

No he mirado todo el código por falta de tiempo pero te daré una pista:
El problema está en la línea 94. Si asignas un char[] usando el operador '=' estás haciendo que el puntero de la izquierda apunte al mismo sitio que el puntero de la derecha. Es decir, realmente sólo tienes la cadena guardada en un sitio y ambos punteros están apuntando ahí. ¿Qué pasa entonces? Que si cualquiera de los dos punteros cambia esa cadena, cuando el otro puntero quiera leer su contenido, también lo verá modificado.

La solución está en la línea 93... Pero con un pequeño detalle: Para poder guardar una copia del contenido, primero tienes que reservar el espacio necesario para ello.

Si corrigiendo eso, sigues teniendo algún problema, agrega además del código un ejemplo de ejecución para poder ver la salida y no tener que revisar todo el código.
Suerte.  :-X


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con lista enlazada
Java
netca 2 3,191 Último mensaje 20 Abril 2012, 16:11 pm
por adwind
Lista enlazada simples
Programación C/C++
angie07 0 1,491 Último mensaje 12 Noviembre 2016, 16:54 pm
por angie07
Ayuda con lista enlazada
Programación C/C++
agrichi 1 1,671 Último mensaje 24 Diciembre 2017, 12:22 pm
por do-while
Lista Enlazada
Java
padiuwu 1 1,821 Último mensaje 1 Abril 2019, 18:25 pm
por spcruzaley
Lista Enlazada
Java
padiuwu 1 1,847 Último mensaje 20 Marzo 2019, 12:44 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines