C/Visual C - Ayuda en C, metodos de ordenamiento con listas dobles enlazadas.

 
Vista:
sin imagen de perfil

Ayuda en C, metodos de ordenamiento con listas dobles enlazadas.

Publicado por Yungxrist (1 intervención) el 23/11/2021 23:33:13
Hola, necesito ayuda con métodos de ordenamiento, necesito implementarlos en una lista, pero no logro entender como aplicar el de burbuja bidireccional y Quicksort en C.
Los demás métodos de ordenamiento ya los implemente, solo necesito ayuda con esos dos, espero que me puedan ayudar, gracias.

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

typedef struct nodo{
int dato;
struct nodo *sig, * ant;
}NODO;


NODO *crearNodo(int num);
void insertarInicio(NODO **inicio, int dato);
void insertarmedio(NODO **inicio, int dato, int busqueda);
void insertarFinal(NODO **inicio, int dato);


void mostrar(NODO *inicio);
void mostrar2(NODO *inicio);

int EliminarInicio(NODO **);
int Eliminarmedio(NODO **inicio, int dato);
int EliminarFinal(NODO **);


void CantidadDeElementos(NODO *inicio);
void buscar(NODO **inicio, int dato, int busqueda);

void Mayor(NODO *inicio);


// Metodos Ordenamientos

//Burbuja normal
void BurbujaOrden( NODO *inicio);


//Seleccion
void Seleccion(NODO **inicio);
int datost;
int datomin;


//Insercion
void insercion(NODO **inicio);
int dtin;


//Burbuja Bidireccional




int main(int argc, char *argv[]) {

int dato, opciones3, opsalir3, busqueda;
NODO *inicio=NULL;
do{
system("cls");
printf("Teclea 1, para insertar elementos al inicio\n");
printf("Teclea 2, para insertar elementos intermedio\n");
printf("Teclea 3, para insertar elementos al final\n");

printf("\n");

printf("Teclea 4, para eliminar elementos al inicio\n");
printf("Teclea 5, para eliminar elementos al medio\n");
printf("Teclea 6, para eliminar elementos al final\n");

printf("\n");

printf("Teclea 7, para mostrar elementos en la lista de manera ascendente \n");
printf("Teclea 8, para mostrar elementos en la lista de manera descendente \n");

printf("Teclea 9, para buscar elementos en la lista\n");
printf(" Teclea 10, para mostrar la cantidad de elementos en la lista\n");
printf("Teclea 11, para mostrar el numero mayor de la lista\n");

printf("Teclea 12, para ordenar datos mediante el metodo de burbuja\n");

printf("Teclea 13, para ordenar datos mediante el metodo de seleccion\n");

printf("Teclea 14, para ordenar datos mediante el metodo de insercion\n");

printf("Teclea 15, para ordenar datos mediante el metodo de burbuja bidireccional\n");


printf("\n");
printf("Teclea 16, Salir\n");

scanf("%d", &opciones3);

switch(opciones3){
case 1:
printf("Opcion 1: insertar elementos al inicio en la lista: \n");
printf("Ingresa el dato que quieres agregar en la lista al principio\n");
scanf("%d", &dato);
insertarInicio(&inicio, dato);
break;
case 2:
printf("Opcion 2: para insertar elementos intermedio\n");
scanf("%d", &busqueda);
printf("Ingresa el nuevo dato \n");
scanf("%d", &dato);
insertarmedio(&inicio, dato, busqueda);
break;
case 3:
printf("Opcion 3: para insertar elementos al final\n");
printf("Ingresa el dato que quieres agregar en la lista al final \n");
scanf("%d", &dato);
insertarFinal(&inicio, dato);
break;
case 4:
printf("Opcion 4: Eiminar datos al princio \n");
EliminarInicio(&inicio);
break;
case 5:
printf("Opcion 5: Eiminar datos al medio \n");
printf("Ingresa el dato que desea eliminar \n");
scanf("%d", &dato);
Eliminarmedio(&inicio, dato);
break;
case 6:
printf("Opcion 6: Eiminar datos al final \n");
EliminarFinal(&inicio);
break;
case 7:
printf("Opcion 7: Mostrar en la lista de manera ascendente\n");
mostrar(inicio);
break;
case 8:
printf("Opcion 8: Mostrar datos en la lista de manera decendente\n");
mostrar2(inicio);
break;
case 9:
printf("Opcion 9: Buscar elementos en la lista\n");
printf("Ingresa el dato que estas buscando:\n");
scanf("%d", &busqueda);
buscar(&inicio, dato, busqueda);
break;
case 10:
printf("Opcion 10: Mostrar la cantidad de elementos en la lista\n");
CantidadDeElementos(inicio);
break;
case 11:
printf("Opcion 11: El numero mayor de la lista es: \n");
Mayor(inicio);
break;

case 12:
printf("Opcion 12: Ordenamiento burbuja: \n");
BurbujaOrden(inicio);
break;


case 13:
printf("Opcion 13: Ordenamiento por seleccion: \n");
Seleccion(&inicio);
break;


case 14:
printf("Opcion 14: Ordenamiento por insercion: \n");
insercion(&inicio);
break;


case 15:
printf("Opcion 15: Ordenamiento por burbuja bidireccional\n");



case 16:
printf("Fin del programa\n");
opsalir3=16;
break;
}
getch();
}while(opsalir3!= 16);

return 0;
}

NODO*crearNodo(int num){
NODO *nuevo=NULL;
nuevo=(NODO*)malloc(sizeof(NODO));
if(nuevo!=NULL)
{
nuevo->dato=num;
nuevo->sig=NULL;
nuevo->ant=NULL;
}
return nuevo;
}

void insertarInicio(NODO **inicio, int dato){
NODO *nuevo=NULL;
nuevo=crearNodo(dato);
if(nuevo!=NULL)
{
nuevo->sig=*inicio;
nuevo->ant=NULL;
if(*inicio!=NULL)
{
(*inicio)->ant=nuevo;
*inicio=nuevo;
}
}
}

void insertarmedio(NODO **inicio, int dato, int busqueda){
NODO *nuevo=NULL;
NODO *aux=*inicio, *aux2;
int band=0;
nuevo = crearNodo(dato);
while(aux -> sig!= NULL && band == 0)
{
if(aux->dato == busqueda){
band=1;
}else
{
aux=aux->sig;
}
}
if(band == 1)
{
aux2=aux->sig;
aux->sig=nuevo;
aux2->ant=nuevo;
nuevo->ant=aux;
nuevo->sig=aux2;
}
else
{
printf("No se encuentra el dato en la lista\n");
}
}

void insertarFinal(NODO **inicio, int dato){
NODO *nuevo=NULL, *aux=*inicio;
nuevo=crearNodo(dato);
if(nuevo != NULL)
{
if(aux==NULL)
{
*inicio=nuevo;
aux=*inicio;
}
else
{
while(aux->sig!=NULL)
{
aux=aux->sig;
}
aux->sig=nuevo;
nuevo->ant=aux;
nuevo->sig=NULL;
}
}
}

int EliminarInicio(NODO **inicio){
NODO *borrar=NULL;
if (*inicio==NULL)
{
printf("No hay datos existentes, en la lista para eliminar\n");
return -1;
}else
{
borrar = *inicio;
*inicio = (*inicio)->sig;
free (borrar);
}
return 0;
}

int Eliminarmedio(NODO **inicio, int dato){
NODO *dta = *inicio, *anter= NULL, *si=NULL;
while(dta != NULL){
if(dta->dato == dato)
{
if(dta == *inicio)
{
*inicio=dta->sig;
if(dta-> sig!= NULL)
{
dta->sig->ant= NULL;
}
}else if(dta->sig == NULL)
{
anter=dta->ant;
dta->ant=NULL;
anter->sig=NULL;
}
else
{
anter=dta->ant;
dta->ant=NULL;
si=dta->sig;
dta->sig=NULL;
anter->sig=si;
si->ant=anter;
}
free(dta);
return 1;
}
dta=dta->sig;
}
return 0;
}
int EliminarFinal(NODO **inicio){
NODO *borrar=NULL;;
NODO *recorrer=NULL;
recorrer=*inicio;
if(recorrer==NULL)
{
printf("No hay elementos en la lista\n");
return -1;
}
while(recorrer->sig!=NULL)
{
borrar = recorrer;
recorrer= recorrer->sig;
}
if(borrar==NULL)
{
borrar = *inicio;
*inicio = NULL;
free (borrar);
}else
{
free(borrar->sig);
borrar->sig=NULL;
}
return 0;
}

void mostrar(NODO *inicio){
NODO* aux=inicio;
while(aux !=NULL)
{
printf("%d\n", aux->dato);
aux=aux->sig;
}
}
void mostrar2(NODO *inicio){
NODO *aux=inicio;
while(aux->sig!=NULL)
aux=aux->sig;
while(aux !=NULL)
{
printf("%d \n", aux->dato);
aux=aux->ant;
}
}
void buscar(NODO **inicio, int dato, int busqueda){
NODO *aux=*inicio;
int band=0;
while(aux != NULL && band == 0){
if(aux->dato == busqueda)
{
band=1;
}
else
{
aux=aux->sig;
}
}
if(band == 1)
{
printf("El dato ingresado es existente en la lista\n");
}
else
{
printf("El dato ingresado no se encuentra en la lista\n");
}
}
void CantidadDeElementos(NODO *inicio){
NODO* aux=inicio;
int eleme=0;
while(aux !=NULL){
aux=aux->sig;
eleme++;
}
printf("Los elementos en la lista son: %d\n", eleme);
}

void Mayor(NODO *inicio){
NODO* aux=inicio;
int nmayor=0;
while(aux!=NULL)
{
aux=aux->sig;
if(aux->dato>nmayor)
{
nmayor=aux->dato;
}
}
printf("El numero mayor en la lista es: %d\n", nmayor);
getch();
}



void BurbujaOrden(NODO *inicio ){
int i, cant=0;
NODO* aux=inicio, *au3=NULL;
while(aux !=NULL)
{
aux=aux->sig;
cant++;
}
aux=inicio;
for(i=1; i<cant;i++){
while(aux->sig != NULL ){
au3=aux->sig;
if(aux->dato > au3->dato){
int au = aux->dato;
aux->dato = au3->dato;
au3->dato=au;
}
aux=aux->sig;
}
}
}

void Seleccion(NODO **inicio){
NODO *aux=*inicio;
NODO *min, *siguiente, *aux3;
min=aux;
if(*inicio != NULL)
{
while(aux->sig !=NULL)
{
datomin=aux->dato;
min=aux;
siguiente=aux->sig;
while(siguiente!=NULL)
{
if(siguiente->dato<datomin)
{
datomin=siguiente->dato;
min=siguiente;
}
siguiente = siguiente->sig;
}
datost=aux->dato;
aux->dato=min->dato;
min->dato=datost;
aux=aux->sig;
}
aux3=aux;
while(aux3->ant!=NULL)
{
aux3=aux3->ant;
}
while (aux3!=NULL)
{
printf("[%d]\n", aux3->dato);
aux3=aux3->sig;
}
}
}

void insercion(NODO **inicio)
{
NODO *aux=*inicio;
NODO *aux3;
aux3=aux;
if(*inicio!=NULL)
{
while(aux !=NULL)
{
dtin=aux->dato;
while(aux->ant!=NULL && (aux->ant->dato>dtin))
{
aux->dato=aux->ant->dato;
aux=aux->ant;
}
aux->dato=dtin;
aux=aux->sig;
}
while(aux3!=NULL)
{
printf("%d\n", aux3->dato);
aux3=aux3->sig;
}
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder