[Utu-emt-prog2-info] listas

Federico Kouyoumdjian fedekp en autistici.org
Lun Ago 22 01:52:26 CEST 2011


//lista.cpp

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct nodo
{
	int elem;
	struct nodo *sig;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *lista;
lista l;

void insertar(int n, lista* l);
void borrar(int n, lista* l);
int listaVacia(lista* l);
void borrarLista(lista* l);
void mostrarLista(lista* l);

int main()
{
	l=NULL;
	char opcion='1';
	int n;
	while (opcion!='t')
	{
		printf("\n");
		printf("Manejo de listas\n\n");
		printf("(i) insertar en la lista\n");
		printf("(l) listar elementos\n");
		printf("(b) borrar uno\n");
		printf("(t) terminar\n");
		printf("Elija una opción:\n");
		scanf("%c",&opcion);
		printf("\n");
		switch(opcion)
		{
			case 'i':
				printf("Ingrese el dato a insertar: ");
				scanf("%i",&n);
				insertar(n,&l);
				break;
			case 'b':
				printf("Ingrese un dato a borrar: ");
				scanf("%i",&n);
				borrar(n,&l);
				getch();
				break;
			case 'l':
				printf("Contenido de la lista:\n");
				mostrarLista(&l);
				getch();
				break;
			case 't':
				borrarLista(&l);
				break;
		}

	}
	
	return 0;
}

void insertar(int n, lista* l)
{
	pNodo nuevo=(pNodo)malloc(sizeof(tipoNodo));
	nuevo->elem=n;
	if ((*l==NULL)|| (((*l)->elem) > n))
	{
		nuevo->sig=*l;		
		*l=nuevo;
	}
	else
	{
		pNodo anterior=*l;
		while(anterior->sig && anterior->sig->elem <= n)
			anterior = anterior -> sig;
		nuevo -> sig = anterior -> sig;
		anterior -> sig= nuevo;	
	}		
}

void borrar (int n, lista*l)
{
	pNodo anterior;
	pNodo nodo;
	nodo=*l;
	anterior=NULL;
	while (nodo && nodo->elem<n)
	{
		anterior=nodo;
		nodo = nodo-> sig;
	}
	if (!nodo || nodo-> elem !=n)
	{
		printf("No fue encontrado");
		return;
	}
	else
	{
		if (!anterior)
			*l=nodo->sig;
		else
			anterior->sig=nodo->sig;
		free(nodo);
	}
}

int listaVacia(lista*l)
{
	return (*l==NULL);
}

void borrarLista (lista*l)
{
	pNodo nodo;
	while (*l)
	{
		nodo=*l;
		*l=nodo->sig;
		free(nodo);
	}
}

void mostrarLista(lista* l)
{
	pNodo nodo=*l;
	if (listaVacia(l))
		printf("Lista vacia\n");
	else
	{
		while (nodo)
		{
			printf ("%i,", nodo->elem);
			nodo=nodo->sig;	
		}
	}
}	

//Ejercicios:
//1) hacer una función que halle el máximo de una lista
//2) hacer una función que devuelva el penúltimo elemento de la lista, 
si no existe que imprima "la lista tiene menos de dos elementos"
//3) hacer una función que devuelva la cantidad de elementos de una lista
//4) hacer una función que intercambie los dos primeros elementos si es 
que la lista tiene por lo menos dos elementos, sino imprime "la lista 
tiene menos de dos elementos"
//5) hacer una función que borre el primer elemento de una lista. Si no 
tiene elementos imprime "la lista no tiene elementos"



Más información sobre la lista de distribución Utu-emt-prog2-info