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)
| | |-+  lista
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: lista  (Leído 3,561 veces)
ise

Desconectado Desconectado

Mensajes: 4



Ver Perfil
lista
« en: 4 Abril 2015, 05:43 am »

un favor necesito modificar este codigo a manera qu sea una lista doblemente enlazada :rolleyes:
Código
  1. /*************************************************************
  2. * DEMO_LL.C
  3. *
  4. * Este programa ilustra el comportamiento de una lista ligada
  5. * de enteros.
  6. *************************************************************/
  7. #include <alloc.h>
  8. #include <stdio.h>
  9. #include <conio.h>
  10. #include <stdlib.h>
  11. #include <mem.h>
  12. #include "lista.h"
  13.  
  14. void despliegaPantallaInicial(void);
  15. void borraLista(void);
  16. void despliegaNodo(NODO *pNodo);
  17. int igual(void *pInfo, void *pLlave);
  18. int mayor(void *pInfo, void *pLlave);
  19. LISTA lista = NULL;
  20.  
  21. int main(void)
  22. {
  23. NODO *pNodo, *pPos, *pAnt;
  24. int dato;
  25. char  operador,sdato[6];
  26. clrscr();
  27. inicializarLista(&lista);
  28. despliegaPantallaInicial();
  29. operador=5;
  30. while(operador!='8')
  31. {
  32. gotoxy(28,10); printf(" ");
  33. gotoxy(51,10); printf(" ");
  34. gotoxy(28,10);
  35. //if((operador = getch()) == ESC) break;
  36. //if(operador!=ESC)
  37. //{
  38. gotoxy(26,10);
  39. operador = getchar();
  40.     switch(operador)
  41. {
  42.  case '1':
  43. printf("Insertar");
  44. gotoxy(36,10);
  45. //getchar(sdato);
  46. scanf("%d",&dato);
  47. pNodo = creaNodo(&dato, sizeof(int));
  48. if(listaVacia(lista)) pAnt = NULL;
  49. else pPos = buscaLista(lista, &pAnt, &dato, mayor);
  50. insertarLista(&lista, pAnt, pNodo);
  51. break;
  52.  case '2':
  53. printf("Extraer. ");
  54. if(listaVacia(lista))
  55. {
  56.    printf("Lista Vacia. Presiona una tecla para continuar");
  57.    getch();
  58.   }
  59.  
  60.  
  61. else
  62.  {
  63.   gotoxy(36,10);
  64.   scanf("%d",&dato);
  65.   //gets(sdato);
  66.   //dato = atoi(sdato);
  67.   if(!(pPos = buscaLista(lista, &pAnt, &dato, igual)))
  68.   {
  69.    printf("Valor inexistente. Presiona una tecla para continuar");
  70.    getch();
  71.   }
  72.   else
  73.   {
  74.    clrscr();
  75.    despliegaPantallaInicial();
  76.    extraerLista(&lista, pAnt, &dato, sizeof(int));
  77.   }
  78.    break;
  79.  }
  80.  
  81.  
  82.       }
  83.  clrscr();
  84. despliegaPantallaInicial();
  85. visitarLista(lista, despliegaNodo);
  86. putchar('\n');
  87. }
  88.  
  89. inicializarLista(&lista);
  90. //visitarLista(lista, despliegaNodo);
  91. putchar('\n');
  92. return 0;
  93. }
  94. /*************************************************************
  95. * void despliegaPantallaInicial(void)
  96. *
  97. * Esta función despliega la explicación de lo que hace el
  98. * programa y las instrucciones de su uso.
  99. *************************************************************/
  100. void despliegaPantallaInicial(void)
  101. {
  102.  clrscr();
  103.  gotoxy(5,3);
  104.  printf("Este programa demuestra el comportamiento de una");
  105.  printf(" lista ligada. En esta");
  106.  gotoxy(5,4);
  107.  printf("lista se almacenan enteros los cuales son");
  108.  printf(" acomodados en orden ascendente.");
  109.  gotoxy(5,5);
  110.  printf("Hay dos operaciones: Para insertar un numero a ");
  111.  printf("la lista presiona la tecla");
  112.  gotoxy(5,6);
  113.  printf("[1], luego el numero a insertar. Para ");
  114.  printf("extraer un numero de la lista");
  115.  gotoxy(5,7);
  116.  printf("presiona la tecla [2], luego el numero a extraer.");
  117.  printf(" Para terminar presiona");
  118.  gotoxy(5,8);
  119.  printf("la tecla [8].");
  120.  gotoxy(15,10);
  121.  printf("Operacion [ ] Valor [ ]");
  122. }
  123.  
  124.  
  125. /*************************************************************
  126. * void despliegaNodo(NODO *pNodo)
  127. *
  128. * Esta función despliega para un nodo, su campo de información
  129. * y su campo siguiente.
  130. *************************************************************/
  131. void despliegaNodo(NODO *pNodo)
  132. {
  133.  static x = 10, y = 13;
  134.  /* Si es el primer nodo de la lista */
  135.  if(pNodo == lista)
  136.  {
  137.    x = 10; y = 13;
  138.  }
  139.  /* Si se va a saltar de renglón */
  140.  if(x == 74)
  141.  {
  142.   x = 10; y += 3;
  143.  }
  144.  /* Despliega el contenido del nodo en un recuadro */
  145.  gotoxy(x,y); putch(0x10);
  146.  gotoxy(x+1,y-1); printf("+-------------+");
  147.  gotoxy(x+1,y); printf("%6d%6p", *(int *)(pNodo->pInfo),pNodo->pSig);
  148.  gotoxy(x+1,y+1); printf("+-------------+");
  149.  x += 16;
  150.  /* Si va a desplegar otra pantalla */
  151.  if(pNodo->pSig && y == 22 && x == 74)
  152.  {
  153.   printf("ENTER PARA CONTINUAR");
  154.   x = 10; y = 13;
  155.  borraLista();
  156.  }
  157. }
  158.  
  159.  
  160. /*************************************************************
  161. * void borraLista(void)
  162. *
  163. * Borra de la pantalla la lista.
  164. *************************************************************/
  165. void borraLista(void)
  166. {
  167.  int i;
  168.  for(i = 12; i < 25; i++)
  169.  {
  170.   gotoxy(1,i); clreol();
  171.  }
  172. }
  173.  
  174. /*************************************************************
  175. * int igual(void *pInfo, void *pLlave)
  176. *
  177. * Esta función regresa 0 si info y llave son iguales, diferente
  178. * de cero en caso contrario.
  179. *************************************************************/
  180. int igual(void *pInfo, void *pLlave)
  181.  {
  182.     return *(int *)pInfo - *(int *)pLlave;
  183.  }
  184. /*************************************************************
  185. * int mayor(void *pInfo, void *pLlave)
  186. *
  187. * Esta función regresa 0 si info > llave, diferente de cero
  188. * en caso contrario.
  189. *************************************************************/
  190. int mayor(void *pInfo, void *pLlave)
  191.  {
  192.   return *(int *)pInfo <= *(int *)pLlave;
  193.  }
  194. /*************************************************************
  195. * LISTA.C
  196. *
  197. * Este módulo implementa las operaciones de una lista ligada
  198. * generalizada, esto es, que opera con cualquier tipo de dato.
  199. * Las funciones que implementan las operaciones de la lista
  200. * reciben como parámetros datos o apuntadores de tipo LISTA y
  201. * NODO definidos como:
  202. *
  203. * struct nodo
  204. * {
  205. * void pInfo; /* Campo de información */
  206. /* struct nodo *pSig; /* Campo siguiente */
  207. /* };
  208. *
  209. * typedef struct nodo NODO;
  210. * typedef struct nodo *LISTA;
  211. *
  212. * Aunque una variable y un apuntador de tipo LISTA declaradas
  213. * como:
  214. *
  215. * LISTA lista;
  216. * LISTA *pLista;
  217. *
  218. * podrían haberse declarado como:
  219. *
  220. * NODO *lista;
  221. * NODO **pLista;
  222. *
  223. * sin necesidad de crear el tipo LISTA, el definir el tipo
  224. * LISTA permite utilizar a LISTA par hacer referencia a la
  225. * El uso del tipo LISTA simplifica las declaraciones como
  226. * la de NODO **plista a LISTA *pLista.
  227. *************************************************************/
  228.  
  229. /*************************************************************
  230. *void inicializarLista(LISTA *pLista)
  231. *
  232. * Esta función inicializa (vacía) una lista. pLista es un
  233. * apuntador al apuntador a la lista.
  234. *************************************************************/
  235. void inicializarLista(LISTA *pLista)
  236. {
  237.  LISTA pTemp;
  238.   /* Mientras haya nodos en la lista */
  239.   while(*pLista)
  240.  {
  241.   pTemp = *pLista;
  242.  *pLista = (*pLista)->pSig;
  243.  destruyeNodo(pTemp);
  244. }
  245. }
  246. /*************************************************************
  247. * int listaVacia(LISTA lista)
  248. *
  249. * Esta función regresa un 1 si la lista está vacía, 0 en
  250. * caso contrario. lista es un apuntador a la lista.
  251. *************************************************************/
  252. int listaVacia(LISTA lista)
  253. {
  254.  return lista == NULL;
  255. }
  256. /*************************************************************
  257. * void insertarLista(LISTA *pLista, NODO *pPos, NODO *pNodo)
  258. *
  259. * Esta función inserta el nodo apuntado por pNodo en la lista
  260. * apuntada por el apuntador pLista. pPos es un apuntador al
  261. * nodo después del cual se va insertar el nodo. Si se desea
  262. * insertar el dato al inicio de la lista pPos debe valer NULL.
  263. * La función no verifica que pPos sea una dirección de un
  264. * nodo de la lista.
  265. *************************************************************/
  266. void insertarLista(LISTA *pLista, NODO *pPos, NODO *pNodo)
  267. {
  268.   /* Si la lista está vacía */
  269.  if(listaVacia(*pLista))
  270.   {
  271.    *pLista = pNodo;
  272.    return;
  273.   }
  274. /* Si se va a insertar al inicio de la lista */
  275.  if(!pPos)
  276.  {
  277.   pNodo->pSig = *pLista;
  278.   *pLista = pNodo;
  279.   return;
  280.  }
  281. /* Si se va a insertar después del nodo pPos */
  282.   pNodo->pSig = pPos->pSig;
  283.   pPos->pSig = pNodo;
  284. }
  285.  
  286. /*************************************************************
  287. * int extraerLista(LISTA *pLista, NODO *pPos, void *pDato,
  288. * int tamDato)
  289. *
  290. * Esta función extrae un nodo de la lista si no está vacía.
  291. * pPos es un apuntador al nodo después del cual esta el nodo
  292. * que se va extraer. Si se desea extraer el dato al inicio de
  293. * la lista pPos debe valer NULL. pDato es la localidad de
  294. * memoria en la que se almacena el campo de información del
  295. * nodo extraído. tamDato es el tamaño en bytes del campo de
  296. * información del nodo. La función no verifica que nPos sea
  297. * una dirección de un nodo de la lista.
  298. *************************************************************/
  299. int extraerLista(LISTA *pLista, NODO *pPos, void *pDato, int tamDato)
  300. {
  301.  LISTA pTemp;
  302.  /* Si la lista esta vacía */
  303.  if(listaVacia(*pLista)) return 0;
  304.  /* Si se va a extraer el primer elemento */
  305.   if(!pPos)
  306.    {
  307.     pTemp = *pLista;
  308.     *pLista = (*pLista)->pSig;
  309.     }
  310.    /* Si se va a extraer un elemento intermedio */
  311.   else
  312.     {
  313.       pTemp = pPos->pSig;
  314.       pPos->pSig = pTemp->pSig;
  315.     }
  316.    /* Extrae el dato */
  317.   memcpy(pDato, pTemp->pInfo, tamDato);
  318.   /* Libera el nodo */
  319.   destruyeNodo(pTemp);
  320.   return 1;
  321. }
  322.  
  323. /*************************************************************
  324. * void visitarLista(LISTA lista, void (* fVisitar)(NODO *pNodo))
  325. *
  326. * Esta función recorre la lista dada por lista. En cada uno
  327. * de los nodos de la lista la función ejecuta la operación
  328. * dada por la función fVisitar(). La función fVisitar() es
  329. * suministrada por el Usuario y es de tipo void y recibe como
  330. * parámetro un apuntador a NODO
  331. *************************************************************/
  332. void visitarLista(LISTA lista, void (* fVisitar)(NODO *pNodo))
  333. {
  334.  /* Mientras no se llegue al final de la lista */
  335.  while(lista)
  336.  {
  337.   /* Opera sobre el nodo */
  338.   fVisitar(lista);
  339.   /* Va al siguiente nodo */
  340.   lista = lista->pSig;
  341.  }
  342. }
  343. /*************************************************************
  344. * NODO *buscaLista(LISTA lista, LISTA *pAnt, void *pLlave,
  345. * int (* fcmp)(void *pInfo, void *pLlave))
  346. *
  347. * Esta función busca en la lista dada por lista la primera
  348. * ocurrencia de un nodo cuyo campo de información al
  349. * compararse con llave cumpla la condición establecida por la
  350. * función fcmp(). La función regresa la dirección del nodo
  351. * que contiene esa primera ocurrencia, NULL en caso de no
  352. * encontrar un nodo que cumpla con la condición. pAnt apunta
  353. * al nodo anterior al nodo con la primera ocurrencia. Si el
  354. * nodo con la primera ocurrencia es el primer nodo de la
  355. * lista, pAnt apunta a NULL. fcmp es un apuntador a la función
  356. * utilizada para comparar la llave con los nodos de la lista.
  357. * La función para comparar es suministrada por el usuario y es
  358. * de tipo entero y recibe como parámetros dos apuntadores void
  359. * a los datos a comparar: pInfo y pLlave que corresponden al
  360. * campo de información y a la llave. La función fcmp() debe
  361. * regresar 0 si el campo de información y la llave cumplen con
  362. * la condición establecida por la función, diferente de cero
  363. * en caso contrario. *
  364. *************************************************************/
  365. NODO *buscaLista(LISTA lista, LISTA *pAnt, void *pLlave,
  366.  int (* fcmp)(void *pInfo, void *pLlave))
  367.  {
  368.   *pAnt = NULL;
  369.     /* Mientras no se llegue al final de la lista */
  370.    while(lista)
  371.    {
  372.     /* Si la encontró */
  373.     if(!fcmp(lista->pInfo, pLlave)) break;
  374.     /* avanza al siguiente nodo */
  375.     *pAnt = lista;
  376.     lista = lista->pSig;
  377.    }
  378.  return lista;
  379. }
  380. /*************************************************************
  381. * NODO *creaNodo(void *pDato, int tamDato)
  382. *
  383. * Esta función crea un nodo haciendo una petición dinámica de
  384. * memoria e inicializa su campo de información con el valor
  385. * de info y el campo siguiente con un apuntador nulo.
  386. *************************************************************/
  387. NODO *creaNodo(void *pDato, int tamDato)
  388. {
  389.   NODO *pNodo;
  390.   /* Pide un bloque de memoria para el nodo, en forma dinámica */
  391.   pNodo = malloc(sizeof(NODO));
  392.  //if((pNodo = malloc(sizeof(NODO))))
  393.  //{
  394.  /* Pide un bloque de memoria para el dato, en forma dinámica */
  395.   pNodo->pInfo = malloc(tamDato);
  396.  //if((pNodo->pInfo = malloc(tamDato)))
  397.  /* Almacena en el campo de información el dato */
  398.   memcpy(pNodo->pInfo, pDato, tamDato);
  399.  //else return NULL;
  400.  /* Almacena en el campo siguiente un apuntador nulo */
  401.  pNodo->pSig = NULL;
  402.  //}
  403.  return pNodo;
  404. }
  405. /*************************************************************
  406. * void destruyeNodo(NODO *pNodo)
  407. *
  408. * Esta función libera el bloque de memoria ocupada por el
  409. * nodo.
  410. *************************************************************/
  411. void destruyeNodo(NODO *pNodo)
  412. {
  413.  /* Libera el bloque de memoria ocupada por el dato */
  414.  free(pNodo->pInfo);
  415.  /* Libera el bloque de memoria ocupada por el nodo */
  416.  free(pNodo);
  417. }
  418.  

Mod: Los códigos deben ir en etiquetas GeSHi, no se debe hacer doble post


« Última modificación: 5 Abril 2015, 22:47 pm por engel lex » En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: lista
« Respuesta #1 en: 4 Abril 2015, 14:54 pm »

Código => Etiquetas GeSHi


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: lista
« Respuesta #2 en: 4 Abril 2015, 15:37 pm »

Solo tienes que ponerle el puntero al nodo anterior, y arreglar las funciones.
En línea

ise

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: lista
« Respuesta #3 en: 5 Abril 2015, 22:38 pm »

podrias ayudarme por favor
 :D
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: lista
« Respuesta #4 en: 5 Abril 2015, 22:39 pm »

¿Qué sabes de C?
En línea

ise

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: lista
« Respuesta #5 en: 5 Abril 2015, 23:13 pm »

 :-[ no mucho en realidad y realmente necesito ayuda es para salver mi asignatura
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: lista
« Respuesta #6 en: 6 Abril 2015, 01:30 am »

Se supone que si os piden eso es porque lo disteis en clase o deberíais saberlo :/
En línea

ise

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: lista
« Respuesta #7 en: 6 Abril 2015, 01:35 am »

digamos que fue un castigo y dio el tema por visto debido a que en el aula solo estabamos 3
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: lista
« Respuesta #8 en: 6 Abril 2015, 02:09 am »

Pues lo dicho. Una lista doblemente enlazada, como sabrás (¬¬), cada nodo tiene un puntero al anterior y al siguiente. En esa lista, solo tienen un puntero al siguiente. Añade puntero al anterior, y modifica las funciones acordes a la nueva estructura.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Lista de Extensiones
Tutoriales - Documentación
The Ghost 7 26,085 Último mensaje 8 Abril 2005, 03:43 am
por MinusFour
Cargar Lista de un fichero con fseek a una lista auxiliar en el programa.
Programación C/C++
samur88 1 3,131 Último mensaje 12 Mayo 2011, 23:25 pm
por samur88
LISTA EN C#
.NET (C#, VB.NET, ASP)
natally 9 10,039 Último mensaje 9 Noviembre 2011, 04:20 am
por Pablo Videla
lista de adyacencia
Programación C/C++
danielSoccer 1 2,433 Último mensaje 11 Noviembre 2016, 02:22 am
por engel lex
lista tcp udp
Redes
regalosorpresa 2 2,941 Último mensaje 18 Mayo 2018, 19:29 pm
por animanegra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines