Está en la página 1de 20

ING.

DESARROLLO DE SOFTWARE
Aplicacin de las estructuras de datos pila, cola y lista

UnADM Universidad Abierta y a Distancia de Mxico


Omar Barragan Moreno Matricula: ES162006477
Codificar una estructura de lista con enlace doble y gestin dinmica de memoria.
Estructura de Lista:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define ASCENDENTE 1
#define DESCENDENTE 0

typedef struct _nodo {


char valor;
struct _nodo *siguiente;
struct _nodo *anterior;
} tipoNodo;

typedef tipoNodo *pNodo;


typedef tipoNodo *Lista;

void Insertar(Lista *l, char v);


void Borrar(Lista *l, char v);
void BorrarLista(Lista *);
void MostrarLista(Lista l, char orden);

int main() {
int a,x=0,c;
char b,d;
Lista lista = NULL;
pNodo p;
printf("\nIngresa la cantidad de elementos a Insertar:");
scanf("%d",&a);
fflush(stdin);
for(x=1;x<=a;x++)
{fflush(stdin);
printf("\nDigita una Letra:");
scanf("%c",&b);
Insertar(&lista, b);
}

MostrarLista(lista, ASCENDENTE);

MostrarLista(lista, DESCENDENTE);
getch();
printf("\nIngresa la cantidad de elementos a Borrar:");
scanf("%d",&c);
fflush(stdin);
for(x=1;x<=c;x++)
{
printf("\nDigita Letra a Eliminar:");
scanf("%c",&d);

Borrar(&lista, d);
}

MostrarLista(lista, ASCENDENTE);
MostrarLista(lista, DESCENDENTE);

BorrarLista(&lista);
getch();
return 0;
}

void Insertar(Lista *lista, char v)


{
pNodo nuevo, actual;

nuevo = (pNodo)malloc(sizeof(tipoNodo));
nuevo->valor = v;

actual = *lista;
if(actual) while(actual->anterior) actual = actual->anterior;

if(!actual || actual->valor > v) {

nuevo->siguiente = actual;
nuevo->anterior = NULL;
if(actual) actual->anterior = nuevo;
if(!*lista) *lista = nuevo;
}
else
{

while(actual->siguiente &&actual->siguiente->valor <= v)


actual = actual->siguiente;
nuevo->siguiente = actual->siguiente;
actual->siguiente = nuevo;
nuevo->anterior = actual;
if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
}

void Borrar(Lista *lista, char v) {


pNodo nodo;

nodo = *lista;
while(nodo && nodo->valor < v) nodo = nodo->siguiente;
while(nodo && nodo->valor > v) nodo = nodo->anterior;

if(!nodo || nodo->valor != v) return;

if(nodo == *lista)
if(nodo->anterior) *lista = nodo->anterior;
else *lista = nodo->siguiente;

if(nodo->anterior)
nodo->anterior->siguiente = nodo->siguiente;
if(nodo->siguiente)
nodo->siguiente->anterior = nodo->anterior;
free(nodo);
}
void BorrarLista(Lista *lista) {
pNodo nodo, actual;

actual = *lista;
while(actual->anterior) actual = actual->anterior;

while(actual) {
nodo = actual;
actual = actual->siguiente;
free(nodo);
}
*lista = NULL;
}

void MostrarLista(Lista lista, char orden) {


pNodo nodo = lista;

if(!lista) printf("Lista vaca");

nodo = lista;
if(orden == ASCENDENTE) {
while(nodo->anterior) nodo = nodo->anterior;
printf("Orden ascendente: ");
while(nodo) {
printf("%c -> ", nodo->valor);
nodo = nodo->siguiente;
}
}
else {
while(nodo->siguiente) nodo = nodo->siguiente;
printf("Orden descendente: ");
while(nodo) {
printf("%c -> ", nodo->valor);
nodo = nodo->anterior;
}
}

printf("\n");
}

Diagrama:
Ejercicio:
Describir el TAD pila y codificar la estructura de tipo pila.
Describir el TAD cola y codificar una estructura de tipo cola.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAX 5
char*p[MAX];
char*crecup(void);
void calmac (char*c);
void nombre(void);
int spos,rpos;
void intro (void),revisar(void),borrar(void);
int main(void)
{
char s[80];
register int t;
spos=0;
rpos=0;
for(t=0;t<MAX;++t)p[t]=NULL;
for(;;)
{
printf("\n(I)introducir\n(L)listar\n(B)borrar\n(N)nombre del programador\n(S)salir\n");
printf("\n\nEscribir tu accion a realizar:\n");
gets(s);
*s=toupper(*s);
switch(*s)
{
system ("cls");
case 'I': system ("cls");
intro();break;
case 'L': system ("cls");
revisar();break;
case 'B': system ("cls");
borrar();break;
case 'N': system ("cls");
nombre();break;
case 'S': system ("cls");
exit(0);

}
}
system("pause");
return 0;
}
void intro (void)
{
char s[100],*p;
do
{
printf("\nIntroduce todos tus datos deseados%d:\n",spos+1);
printf("(SOLO DA (ENTER) PARA REGRESAR AL MENU PRINCIPAL)");
gets(s);
if(*s=='\0')break;
p=(char*)malloc(strlen(s)+1);
if(!p)
{
printf("NO HAY MEMORIA RESERVADA\n");
return;
}
strcpy(p,s);
calmac(p);
}
while(*s);
}
void revisar(void)
{
int t;
if(rpos==spos)
{
printf("NO HAY DATOS\n");
return;
}
for(t=rpos;t<spos;t++)
printf("\n CADENA ES %d: %s\n",t+1,p[t]);
}
void borrar(void)
{
char*q;
q=crecup();
if(q==NULL)
{
printf("NO HAY DATOS!!!\n");
return;
}
printf("ESTE ES EL DATO RECUPERADO Y BORRADO: DATO NUMERO %d: %s\n",rpos+1,q);
free(q);
}
void nombre(void)
{
printf("\nOmar Barragan Moreno");
printf("\nMATRICULA: ES162006477\n\n");
}
void calmac(char*q)
{
if(spos==MAX)
{
printf("\nLA COLA ESTA LLENA\n");
return;
}
p[spos]=q;
spos++;
}
char*crecup(void)
{
if(rpos==spos)
{
printf("\nNO HAY DATOS\n");
return NULL;
}
rpos++;
return p[rpos-1];
}
Diagrama:
Ejercicio:
Referencias
joyanes. (s.f.). C++. Recuperado el 31 de 07 de 2017, de Estructura.de.datos.en.C++.Joyanes

wikipedia. (s.f.). wikipedia. Obtenido de https://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n)

También podría gustarte