ise11
Message postés1Date d'inscriptionsábado, 4 de abril de 2015EstatusMiembroÚltima intervenciónsábado, 4 de abril de 2015
-
4 abr 2015 a las 05:56
Hola hola necesito ayuda para poder modificar este codigo a una lista doblemente enlazada me urge porfa
/*************************************************************
DEMO_LL.C
*
Este programa ilustra el comportamiento de una lista ligada
Esta función despliega la explicación de lo que hace el
programa y las instrucciones de su uso.
/
void despliegaPantallaInicial(void)
{
clrscr();
gotoxy(5,3);
printf("Este programa demuestra el comportamiento de una");
printf(" lista ligada. En esta");
gotoxy(5,4);
printf("lista se almacenan enteros los cuales son");
printf(" acomodados en orden ascendente.");
gotoxy(5,5);
printf("Hay dos operaciones: Para insertar un numero a ");
printf("la lista presiona la tecla");
gotoxy(5,6);
printf("[1], luego el numero a insertar. Para ");
printf("extraer un numero de la lista");
gotoxy(5,7);
printf("presiona la tecla [2], luego el numero a extraer.");
printf(" Para terminar presiona");
gotoxy(5,8);
printf("la tecla [8].");
gotoxy(15,10);
printf("Operacion [ ] Valor [ ]");
}
Esta función despliega para un nodo, su campo de información
y su campo siguiente.
/
void despliegaNodo(NODO *pNodo)
{
static x = 10, y = 13;
/* Si es el primer nodo de la lista */
if(pNodo == lista)
{
x = 10; y = 13;
}
/* Si se va a saltar de renglón */
if(x == 74)
{
x = 10; y += 3;
}
/* Despliega el contenido del nodo en un recuadro */
gotoxy(x,y); putch(0x10);
gotoxy(x+1,y-1); printf("+-------------+");
gotoxy(x+1,y); printf("%6d%6p", *(int *)(pNodo->pInfo),pNodo->pSig);
gotoxy(x+1,y+1); printf("+-------------+");
x += 16;
/* Si va a desplegar otra pantalla */
if(pNodo->pSig && y == 22 && x == 74)
{
printf("ENTER PARA CONTINUAR");
x = 10; y = 13;
borraLista();
}
}
int extraerLista(LISTA *pLista, NODO *pPos, void *pDato,
int tamDato)
*
Esta función extrae un nodo de la lista si no está vacía.
pPos es un apuntador al nodo después del cual esta el nodo
que se va extraer. Si se desea extraer el dato al inicio de
la lista pPos debe valer NULL. pDato es la localidad de
memoria en la que se almacena el campo de información del
nodo extraído. tamDato es el tamaño en bytes del campo de
información del nodo. La función no verifica que nPos sea
una dirección de un nodo de la lista.
/
int extraerLista(LISTA *pLista, NODO *pPos, void *pDato, int tamDato)
{
LISTA pTemp;
/* Si la lista esta vacía */
if(listaVacia(*pLista)) return 0;
/* Si se va a extraer el primer elemento */
if(!pPos)
{
pTemp = *pLista;
pLista = (*pLista)->pSig;
}
/* Si se va a extraer un elemento intermedio */
else
{
pTemp = pPos->pSig;
pPos->pSig = pTemp->pSig;
}
/* Extrae el dato */
memcpy(pDato, pTemp->pInfo, tamDato);
/* Libera el nodo */
destruyeNodo(pTemp);
return 1;
}
Esta función recorre la lista dada por lista. En cada uno
de los nodos de la lista la función ejecuta la operación
dada por la función fVisitar(). La función fVisitar() es
suministrada por el Usuario y es de tipo void y recibe como
parámetro un apuntador a NODO
/
void visitarLista(LISTA lista, void (* fVisitar)(NODO *pNodo))
{
/* Mientras no se llegue al final de la lista */
while(lista)
{
/* Opera sobre el nodo */
fVisitar(lista);
/* Va al siguiente nodo */
lista = lista->pSig;
}
}
/*************************************************************
NODO *buscaLista(LISTA lista, LISTA *pAnt, void *pLlave,
int (* fcmp)(void *pInfo, void *pLlave))
*
Esta función busca en la lista dada por lista la primera
ocurrencia de un nodo cuyo campo de información al
compararse con llave cumpla la condición establecida por la
función fcmp(). La función regresa la dirección del nodo
que contiene esa primera ocurrencia, NULL en caso de no
encontrar un nodo que cumpla con la condición. pAnt apunta
al nodo anterior al nodo con la primera ocurrencia. Si el
nodo con la primera ocurrencia es el primer nodo de la
lista, pAnt apunta a NULL. fcmp es un apuntador a la función
utilizada para comparar la llave con los nodos de la lista.
La función para comparar es suministrada por el usuario y es
de tipo entero y recibe como parámetros dos apuntadores void
a los datos a comparar: pInfo y pLlave que corresponden al
campo de información y a la llave. La función fcmp() debe
regresar 0 si el campo de información y la llave cumplen con
la condición establecida por la función, diferente de cero
en caso contrario. *
/
NODO *buscaLista(LISTA lista, LISTA *pAnt, void *pLlave,
int (* fcmp)(void *pInfo, void *pLlave))
{
pAnt = NULL;
/* Mientras no se llegue al final de la lista */
while(lista)
{
/* Si la encontró */
if(!fcmp(lista->pInfo, pLlave)) break;
/* avanza al siguiente nodo */
pAnt = lista;
lista = lista->pSig;
}
return lista;
}
/*************************************************************
NODO *creaNodo(void *pDato, int tamDato)
*
Esta función crea un nodo haciendo una petición dinámica de
memoria e inicializa su campo de información con el valor
de info y el campo siguiente con un apuntador nulo.
/
NODO *creaNodo(void *pDato, int tamDato)
{
NODO *pNodo;
/* Pide un bloque de memoria para el nodo, en forma dinámica */
pNodo = malloc(sizeof(NODO));
//if((pNodo = malloc(sizeof(NODO))))
//{
/* Pide un bloque de memoria para el dato, en forma dinámica */
pNodo->pInfo = malloc(tamDato);
//if((pNodo->pInfo = malloc(tamDato)))
/* Almacena en el campo de información el dato */
memcpy(pNodo->pInfo, pDato, tamDato);
//else return NULL;
/* Almacena en el campo siguiente un apuntador nulo */
pNodo->pSig = NULL;
//}
return pNodo;
}
/*************************************************************
void destruyeNodo(NODO *pNodo)
*
Esta función libera el bloque de memoria ocupada por el
nodo.
/
void destruyeNodo(NODO *pNodo)
{
/* Libera el bloque de memoria ocupada por el dato */
free(pNodo->pInfo);
/* Libera el bloque de memoria ocupada por el nodo */
free(pNodo);
}