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

 

 


Tema destacado: Introducción a Git (Primera Parte)


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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Ayuda con ejercicio de Algoritmo.
« en: 30 Mayo 2017, 02:39 am »

Buenas amigos soy nuevo en el foro espero me saquen de este apuro necesito construir el siguiente código en C++ y no entiendo mucho sobre nodos.

A través de la realización de un algoritmo en C++, deben de construir una Lista enlazada la cual tendrá los siguientes datos a insertar:


 cedula (int)

 nombre (string)

 apellido (string)

 edad (int)

 sexo (char)

Se debe de validar que la cédula que se ingrese en la lista sea mayor a 999999 y menor e igual a 99999999; ej: (N > 999999 && N <= 99999999). Esto debido a que las cédula solo pueden tener 7 u 8 dígitos. Dicha lista al ejecutarse debe realizar los siguientes métodos:

1. Insertar un registro al inicio de la lista.

2. Insertar un registro al final de la lista.

3. Contar la cantidad de registros que tiene la lista.

4. Buscar cualquier registro a través de la cédula dentro de la lista.

5. Recorrer la lista y mostrar todos sus registros.

6. Eliminar un registro al final de la lista.

7. Eliminar un registro en cualquier posición de la lista.

8. Vaciar o Destruir la lista.

Dicho ejercicio de listas enlazadas debe cumplir con los siguientes parámetros exigibles:

1. Tener un menú dinámico, el cual permita ejecutar cualquier método sin cerrarse el

programa.

2. Validar que las cédulas que se estén ingresando cumplan con la validación.

3. Tener una opción para salir del programa.

Espero poder obtener su ayuda o aporte saludos.


En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.465


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Ayuda con ejercicio de Algoritmo.
« Respuesta #1 en: 30 Mayo 2017, 03:30 am »

Hola!

Coloca el código que llevas hecho y plantea tus dudas puntuales. De esa forma podrás obtener una mejor ayuda.

Saludos!


En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

cEBH1994

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con ejercicio de Algoritmo.
« Respuesta #2 en: 30 Mayo 2017, 04:47 am »

Gracias por la pronta respuesta el detalle esta en que no se como iniciar el código porque no entiendo muy bien sobre listas enlazadas y tampoco de nodos llevo días tratando pero la verdad no se y me mandaron ese ejercicio de proyecto final y necesito hacerlo si no raspo la materia me gustaría su ayuda y explicación.
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Ayuda con ejercicio de Algoritmo.
« Respuesta #3 en: 30 Mayo 2017, 04:52 am »

no tienes ni si quiera el main hecho? algo debes llevar... muestra que llevas y en que parte tienes la duda

recuerda, no se dan codigos listos, se resuelven dudas puntuales
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: Ayuda con ejercicio de Algoritmo.
« Respuesta #4 en: 30 Mayo 2017, 07:45 am »

...el detalle esta en que no se como iniciar el código porque no entiendo muy bien sobre listas enlazadas y tampoco de nodos ...  ... ... y necesito hacerlo si no raspo la materia me gustaría su ayuda y explicación.
Bien, si no sabes por donde empezar... aunque creo que no te pedirían un ejercició del que no habeis dado el tema...

Una lista enlazada, es una lista 'encadenada', de hecho la traducción enlazada es esa, encadenada... exactamente como sucede con los eslabones de una cadena.
Esto quiere decir que cada 'nodo', tiene un puntero llamado siguiente que contiene la drección de memoria al siguiente 'nodo'.
Por nodo puede entenderse como un tipo de datos, una estructura por ejemplo, que contiene determinados datos relacionados entre sí, (como un registro).

A diferencia de los arrays, que tiene todos sus registros contiguos en la memoria, y por tanto sabiendo donde está el primero es fácil saber donde está el enésimo, una lista enlazada, puede tener sus registros, en cualquier posición d ela memoria y de hecho el único modo (partiendo solo de la propia lista), de saber donde se encuentra el enésimo nodo, es llegar justo al nodo anterior a ese enésimo, pués es quien contiene la dirección de ese registro (nodo).
Así un nodo se compone básiicamente de dos punteros:
A - El dato que contiene (o los datos, si guarda más de uno).
B - La dirección al siguiente nodo.

Así crear una lista enlazada, supone crear un nodo llamado raíz, al que siempre tenemos una referencia (por que al ser el nodo inicial, necesitamos saber su dirección, para poder acceder a los demás). Supone guardar el número de nodos que tiene, supone guardar el índice del nodo actual y una referencia al mismo. También una referencia al último nodo (para poder añadir tras él). Además supone crear como mínimo los métodos: AñadirNodo, EliminarNodo, VaciarLista, y por encima de ello Crearlista, Y EliminarLista... También será útil poder Recorrer la lista, o al menos poder acceder al nodo nº, y tampoco sobra una función BuscarNodo por un dato especñífico ni BuscarNodoSiguiente con el mismo dato a partir de un nodo dado (por ejemplo uno previo que contenía ese dato).
Al CrearLista, primero se crea el nodo raíz, en su dato puede quedar nulo o no, Según gustos, una forma típica es que el nodo raíz, no interfiere, no forma parte de la lista, así al crearse la lista, se establece Numnodos = 0, IndiceActual = -1 y se crea la referencia de nodo raíz.
Un nodo contiene dos elementos como te he señalado:
- Dato: del tipo de datos que interese
- Siguiente: puntero a otro nodo. si es el último, su valor es nulo.
Y puede haber una función para CrearNodo(Dato), que por lo general devuelve el puntero del nodo creado... así:
Código:
//Crear unalista enlazada cuando el nodo raíz no se usa en la propia lista.
Funcion CrearListaEnlazada
    Raiz = CrearNodo("")
    Ultimo = Raiz
    NumNodos =0
    IndiceActual = -1
    NodoActual = nulo
Fin Funcion

Código:
//Crear unalista enlazada cuando el nodo raíz se usa en la propia lista.
Funcion CrearListaEnlazada(String Dato) //más parámetros si se deben guardar más datos.
    Raiz = CrearNodo(Dato)
    Ultimo = Raiz
    NumNodos =1
    IndiceActual = 0
    NodoActual = Raiz
Fin Funcion

Código:
Funcion AñadirNodo(String Dato)
    Ultimo.Siguiente = CrearNodo(Dato) //Añade un nuevo nodo.
    NumNodos +=1
    Ultimo = Ultimo.Siguiente
Fin funcion

Una función que busca un nodo por el dato y devuelve el nodo. si no se encuentra devuelve nulo, porque el último nodo apunta como siguiente a nulo.
Código:
Nodo = Funcion BuscarNodo( String Dato)
    nodo n = raiz
    Mientras n.Dato != Dato
       n = n.Siguiente
    Fin mientras
    Devolver n  // si n es nulo, implica que se llego al final y no se encontró
Fin funcion

Una función que busca un nodo desde unaposición dada:
Código:
Nodo = Funcion BuscarNodoSiguiente(Nodo n, string Dato)
   Mientras n.Dato != Dato
       n = n.Siguiente
    Fin mientras
    Devolver n  // si n es nulo, implica que se llego al final y no se encontró
Fin funcion
Si se crea esta función la previa podría delegar en esta, para establecer como punto de búsqueda el nodo raíz.
Código:
Nodo = Funcion BuscarNodo( String Dato)
    Devolver BuscarNodoSiguiente(Raiz, Dato)  //
Fin funcion

Acceder al nodo enésimo.
Código:
Nodo = Funcion NodoIndice(Entero Indice)
   Si Indice < NumNodos luego //Numnodos siempre es 1 mayor que el indice mayor que puede ser pedido
       Si indice => Indice actual luego  // de dónde queda más cerca índice?
          n = NodoActual
          x = Indiceactual      
       Si no
          n = Raiz.Siguiente
          x = -1
    Si no
       Devolver nulo
    Fin si

    Mientras x< indice
         x +=1
         n = n.Siguiente
    Fin mientras  
    Si n.siguiente no es nulo luego
        IndiceActual = x
        NodoActual = n
    Fin si
    Devolver n
Fin funcion


Código:
// Inserta un nodo para que ocupela posición señalada.
Funcion InsertarNodo(Entero Posicion, String Dato)
   Si Posicion > NumNodos
       AñadirNodo(Dato) // Se añade al final si excede el número de nodos.
   Si no
       Nodo n = CrearNodo(dato)
       Si posicion <0
            Posicion = 0 // pasa a ser el primer nodo
       Fin si
       Nodo p = NodoIndice(Posicion-1) //lama a la función anterior, para darnos el nº nodo d ela lista.
       n.Siguiente = p.Siguiente
       p.siguiente = n
       NumNodos +=1    
      
       Si IndiceActual => Indice
           Indice +=1
       Fin si
   Fin si
Fin funcion

Una lista más robusta, es la doblemente enlazada, en la que hay además un puntero en cada nodo llamado Previo (o Anterior) y que apunta a un nodo anterior en vez de al Siguiente. Esto facilita el recorrido de la lista, hacia adelante o atrás. si la lista es simple (simplemente enlazada), entonces una busqueda debe ser siempre hacia adelante y si ni siquiera mantienes un 'NodoActual' y su 'indiceActual', entonces siempre deberás buscar desde la raiz. Un nodoActual e indiceActual, te permite decidir si es preferible buscar desde ahí hasta el final o desde la raiz hasta el actual.

Otra lista aún más completa, es cuando además es circular... es decir el último conecta al raíz, así puede buscarse desde el actual hacia adelante, y al final llegar al raíz para continuar hasta el actual. si es doblemente enlazada, igualmente desde Raíz habrá una conexión al último... En estos casos, al añadir un nodo, requiere reconectar el final con la raiz... Aunque sea circular, conviene reconocer cuando se pasa por el extremo, incluso aunque sea transparente al cliente...

Por último, si mantienes un actual recuerda que borrar un nodo intermedio, supone antes enlazar al siguiente al que ese a eliminar apunta, si no se perdería todos los que siguen tras él, y por supuesto actualizar 'indiceActual' si está por encima del que se elimina (baja una posición el índice)... del mismo modo que insertarnodo, actualiza el índice s está en la posición a insertar o más arriba...

en fin.... esto debe darte alguna idea y servirte de orientación... es algo rápido, así que tendrás que trabajarlo un poco y si decides que raiz, tenga importancia en la lista, debes ajustar el códig en consideración a ello. en la práctica es bueno que no forme parte de ello, porque funciones que requieren al menos un nodo, si la lista está vacía podría dar error, aunque siempre podrá controlarse de otro modo, es preciso decidirse y tenerlo en cuenta.

Ahora ya no tienes excusas, tu siguiente pregunta deberá aportar código si o si...
« Última modificación: 30 Mayo 2017, 07:51 am por NEBIRE » En línea

cEBH1994

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con ejercicio de Algoritmo.
« Respuesta #5 en: 31 Mayo 2017, 04:10 am »

Gracias por la ayuda intentare realizar el código con el material que me facilito saludos.
« Última modificación: 5 Junio 2017, 00:28 am por cEBH1994 » En línea

cEBH1994

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con ejercicio de Algoritmo.
« Respuesta #6 en: 5 Junio 2017, 00:29 am »

Logre un adelanto del código pero al tratar de correrlo me da el siguiente error quisiera me ayudaran el error que me indica es el siguiente.

collect2: error: ld returned 1 exit status


No se si me falta algo o tengo algo mal.

Código
  1. #include<iostream>
  2. #include<stdlib.h>
  3. using namespace std;
  4.  
  5. struct Registro{
  6. int cedula;
  7. string nombre;
  8. string apellido;
  9. int edad;
  10. char sexo;
  11. Registro *Rpersona;
  12. };
  13.  
  14.  
  15. void menu();
  16. void insertarLista(Registro *&,int c, string n, string a, int e, char s);
  17. void mostrarLista(Registro *);
  18. void buscarLista(Registro *,int c);
  19. void eliminarNodo(Registro *&,int c);
  20. void eliminarLista(Registro *&,int &);
  21.  
  22. Registro *lista = NULL;
  23.  
  24. int main(){
  25.  
  26. menu();
  27.  
  28. return 0;
  29. }
  30.  
  31. void menu(){
  32. int opcion,c,e;
  33. string n,a;
  34. char s;
  35.  
  36.  
  37. do{
  38. cout<<"\t.:::Proyecto UBV:::.\n";
  39. cout<<"1. Ingresar un Registro a la lista\n";
  40. cout<<"2. Mostrar los Registros de la lista\n";
  41. cout<<"3. Buscar un Registro en la lista\n";
  42. cout<<"4. Eliminar un Registro de la lista\n";
  43. cout<<"5. Dejar vacia la lista\n";
  44. cout<<"6. Salir\n";
  45. cout<<"Opcion: ";
  46. cin>>opcion;
  47.  
  48. switch(opcion){
  49. case 1: cout<<"\nIngrese un Numero de Cedula: ";
  50.        cin>>c;
  51.                    cout<<"\nIngrese el Nombre: ";
  52. cin>>n;
  53. cout<<"\nIngrese el Apellido: ";
  54. cin>>a;
  55. cout<<"\nIngrese la Edad: ";
  56. cin>>e;
  57. cout<<"\nIngrese el Sexo: ";
  58. cin>>s;
  59. insertarLista(lista,c,n,a,e,s);
  60. cout<<"\n";
  61. system("pause");
  62. break;
  63. case 2: mostrarLista(lista);
  64. cout<<"\n";                        
  65. system("pause");
  66. break;
  67. case 3: cout<<"\nIngrese el Numero de Cedula a Buscar en el Registro: ";
  68. cin>>c;
  69. buscarLista(lista,c);
  70. cout<<"\n";
  71. system("pause");
  72. break;
  73. case 4: cout<<"\nIngrese el Numero de Cedula a Eliminar del Registro: ";
  74. cin>>c;
  75. eliminarNodo(lista,c);
  76. cout<<"\n";
  77. system("pause");
  78. break;
  79. case 5:
  80. while(lista != NULL){
  81. eliminarLista(lista,c);
  82. cout<<c <<" -> ";
  83. }
  84. cout<<"\n";
  85. system("pause");
  86. break;
  87. }
  88. system("cls");
  89. }while(opcion != 6);
  90. }
  91.  
  92. void insertarLista(Registro *&,int c, string n, string a, int e, char s){
  93. Registro *nuevo_registro = new Registro();
  94.  
  95. nuevo_registro->cedula = c;
  96. nuevo_registro->nombre = n;
  97. nuevo_registro->apellido = a;
  98. nuevo_registro->edad = e;
  99. nuevo_registro->sexo = s;
  100. Registro *aux1 = lista;
  101. Registro *aux2;
  102.  
  103. while((aux1 != NULL) && (aux1->cedula < c), (aux1->nombre < n), (aux1->apellido < a), (aux1->edad < e), (aux1->sexo < s)){
  104. aux2 = aux1;
  105. aux1 = aux1->Rpersona;
  106. }
  107.  
  108. if(lista == aux1){
  109. lista = nuevo_registro;
  110. }
  111. else{
  112. aux2->Rpersona = nuevo_registro;
  113. }
  114.  
  115. nuevo_registro->Rpersona = aux1;
  116.  
  117. cout<<"\tPersona "<<c<<" insertada a la lista correctamente\n";
  118. }
  119.  
  120. void mostrarLista(Registro *lista){
  121. Registro *actual = new Registro();
  122. actual = lista;
  123.  
  124. while(actual != NULL){
  125. cout<<actual->cedula<<" -> ";
  126. cout<<actual->nombre<<" -> ";
  127. cout<<actual->apellido<<" -> ";
  128. cout<<actual->edad<<" -> ";
  129. cout<<actual->sexo<<" -> ";
  130. actual = actual->Rpersona;
  131. }
  132. }
  133.  
  134. void buscarLista(Registro *lista,int c,string n,string a,int e,char s){
  135. bool band = false;
  136.  
  137. Registro *actual = new Registro();
  138. actual = lista;
  139.  
  140. while((actual != NULL) && (actual->cedula <= c), (actual->nombre <= n), (actual->apellido <= a),(actual->edad <= e), (actual->sexo <= s)){
  141. if((actual->cedula == c), (actual->nombre == n), (actual->apellido == a), (actual->edad == e), (actual->sexo == s)){
  142. band = true;
  143. }
  144. actual = actual->Rpersona;
  145. }
  146.  
  147. if(band == true){
  148. cout<<"Persona "<<n<<" SI a sido encontrado en lista\n";
  149. }
  150. else{
  151. cout<<"Persona "<<n<<" NO a sido encontrado en la lista\n";
  152. }
  153. }
  154.  
  155. void eliminarNodo(Registro *&lista,int c,string n, string a, int e, char s){
  156.  
  157. if(lista != NULL){
  158. Registro *aux_borrar;
  159. Registro *anterior = NULL;
  160.  
  161. aux_borrar = lista;
  162.  
  163.  
  164. while((aux_borrar != NULL) && (aux_borrar->cedula != c), (aux_borrar->nombre != n), (aux_borrar->apellido != a), (aux_borrar->edad != e), (aux_borrar->sexo != s)){
  165. anterior = aux_borrar;
  166. aux_borrar = aux_borrar->Rpersona;
  167. }
  168.  
  169.  
  170. if(aux_borrar == NULL){
  171. cout<<"La persona no ha sido encontrado";
  172. }
  173.  
  174. else if(anterior == NULL){
  175. lista = lista->Rpersona;
  176. delete aux_borrar;
  177. }
  178.  
  179. else {
  180.        anterior->Rpersona = aux_borrar->Rpersona;
  181. delete aux_borrar;
  182. }
  183. }
  184. }
  185.  
  186.  
  187.        void eliminarLista(Registro *&lista,int &c, string &n, string &a,int &e, char &s){
  188.    Registro *aux = lista;
  189.    c = aux->cedula;
  190.    n = aux->nombre;
  191.    a = aux->apellido;
  192.    e = aux->edad;
  193.    s = aux->sexo;
  194.    lista = aux->Rpersona;
  195.    delete aux;
  196. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Algoritmo para un ejercicio; ¿Doble dijkstra?
Programación General
astinx 2 3,439 Último mensaje 16 Febrero 2012, 19:27 pm
por astinx
Ejercicio Algoritmo
Ejercicios
kichilo 0 2,654 Último mensaje 5 Noviembre 2012, 05:13 am
por kichilo
Ayuda con ejercicio - Algoritmo
Programación General
_RaSH_ 0 1,714 Último mensaje 28 Mayo 2016, 19:51 pm
por _RaSH_
Problema en Algoritmo Basico de Ejercicio en C++
Programación C/C++
carlosjazzc1 2 2,326 Último mensaje 3 Junio 2016, 05:00 am
por carlosjazzc1
Ejercicio de Algoritmo
Dudas Generales
Tito_2017 3 2,018 Último mensaje 16 Agosto 2017, 18:28 pm
por PalitroqueZ
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines