/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda con recursión y caracteres por cadenas, urge! ¬¬´

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Principios en C



Registrado: 06 Nov 2011
Mensajes: 1

MensajePublicado: 06/11/2011 3:45 pm
Título: Ayuda con recursión y caracteres por cadenas, urge! ¬¬´

Hola..

Tengo un codigo que hice el cual crea y ordena en forma alfabeticamente creciente un lista de caracteres, se pueden insertar elementos a la lista y eliminarlos.

Pero me falta dos puntos para terminar mi programa:

1° tengo que imprimir con una función recursiva la lista ordenada alfabeticamente decreciente, es decir de z-a,.

2° Y hacer una funcion recursiva que al momento que yo ingrese un elemeto que quiero que se busque en la lista me diga cuantos caracteres hay antes y cuantes después del caracter que yo indique.

Aqui esta mi codigo, pero quisiera ver si me ayudan y me pueden decir como hacer estas dos funciones recursivas que me faltan, por favor:

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

struct lista_nodos {
       
       /*Se declara una estructura*/
       
       char valor;
       struct lista_nodos *sigPtr; };
       
       typedef struct lista_nodos LISTA;
       typedef struct lista_nodos *LISTPREVPTR;
       /*Se usa un alias para la estructura lista_nodos*/
       
       void inserta(LISTPREVPTR*, char);
       /*Se declara la función inserta*/
       char elimina (LISTPREVPTR*, char);
       /*Se declara la función elimina*/
       int estavacia (LISTPREVPTR);
       /*Se declara la función estavacia*/
       void imprime (LISTPREVPTR);
       /*Se declara la función imprime*/
       void menu (void);
       /*Se declara la funcion menu*/
       
       main(){
             
       LISTPREVPTR inicioPtr = NULL;
       int avanza, selec;
       char dato;
       printf("\n\n%s\n\n","<Un programa que construye listas dinamicas>");
       menu();
       /*Se manda llamar a la función menu*/
       printf("\n%s","\n\nLa opción seleccionada es: ");
       scanf("%d",&selec);
       /*Se lee la función que elige el usuario*/
       
       while(selec != 3){
       /*Cuando la opción elegida por el usuario sea distinta de 1, 2 o 3
       se despliega nuevamente el menu*/
                 
       switch(selec){
       /*Se definen las acciones a realizar conforme a la opción que elija
       el usuario*/
                     
       case 1:
       
       printf("\n%s","Deme un caracter: ");
       scanf("\n%c", &dato);
       inserta(&inicioPtr, dato);
       /*Se manda llamar a la funcón inserta*/
       imprime(inicioPtr);
       /*Se manda llamar a la función inicio*/
       break;
       
       case 2:
           
       if(!estavacia(inicioPtr)){
                               
       printf("\n%s","El caracter a eliminar es: ");
       scanf("\n%c",&dato);
       
       if(elimina(&inicioPtr, dato)){
       /*Se manda llamar a la función elimina*/
       
       printf("\n%s%c%s\n\a\a","El caracter: ",dato,"fue eliminado de la lista");
       imprime(inicioPtr);
       /*Se manda llamar a la función imprime*/
       }
       else
       /*En caso de no encontrarse el caracter se entra al else*/
       
    printf("\n%s%c%s\n\a","El caracter: ",dato,"no fue encontrado en la lista");
    }
   
       else
       /*La ultima opcion que puede ocurrir al momento de eliminar un carcter
       se presenta en este else*/
       printf("\a\n\t%s\n\a","La lista esta vacia");
       break;
       
       default:
       /*En caso de no ocurrir nada de lo anterior se lanzara en pantalla
       lo siguiente*/
       
       printf("\n%s\n","La selección es incorrecta");
       menu();
       /*Se despliega el menu*/
       break;
       }
       
       menu();
       printf("\n%s","La opcion seleccionada es: ");
       scanf("%d", &selec);
       };
       
       printf("\n\n%s","Hasta pronto");
       scanf("%d",&avanza);
       return 0;
       }
       
       void menu(void){
       /*Se define la función menu*/
           
       printf("\n\nSeleccione una opcion: ");
       printf("\n\n1.-Insertar un elemento en la lista");
       printf("\n\n2.-Eliminar un elemento en la lista");
       printf("\n\n3.-Salir del programa");
       }
       
       void inserta(LISTPREVPTR*aPtr, char datoin){
       /*Se define la función inserta*/
       LISTPREVPTR datnvoPtr, datprevPtr, datactPtr, lista_nodos;
       /*Se declaran apuntadores que sean del tipo LISTPREVPTR*/
       datnvoPtr=(LISTPREVPTR)malloc(sizeof(lista_nodos));
       /*evalúa a sizeof (lista_nodos) para determinar el tamaño de una
       estructura del tipo lista_nodos, para asignar una nueva área en
       memoria, y para almacenar un apuntador a la memoria asignada a la
        variable datnvoPtr */
       
       if(datnvoPtr != NULL){
       /*En caso de que datnvoPtr sea distinto de NULL, se realizara lo
       siguiente*/
                   
       datnvoPtr->valor=datoin;
       datnvoPtr->sigPtr=NULL;
       datprevPtr=NULL;
       datactPtr=*aPtr;
       
       while(datactPtr != NULL&&datoin>datactPtr->valor){
       
       datprevPtr=datactPtr;
       datactPtr=datactPtr->sigPtr;
       };
       
       if(datprevPtr==NULL){
       /*Se compara datprevPtr con NULL y se continuara si son iguales*/
       datnvoPtr->sigPtr=*aPtr;
       *aPtr=datnvoPtr;
       }
       
       else{
       /*Si datprevPtr es distinto de NULL se entrara al else*/
       datprevPtr->sigPtr=datnvoPtr;
       datprevPtr->sigPtr=datactPtr;
       }
       }
       
       else
       /*En caso de no haber ocurrido ninguna de las anteriores se entrara
       a este else*/
       printf("\n%s%c%s\n%s\a\a\a\a","El caracter: ",datoin,"no fue insertado",
       "memoria insuficiente\n\n");
       }
       
       char elimina(LISTPREVPTR*bPtr, char datoele){
       /*Se define la función elimina*/
           
       LISTPREVPTR datempPtr, datprevPtr, datactPtr;
       /*Se declaran apuntadores que sean dell tipo LISTPREVPTR*/
       
       if(datoele==(*bPtr)->valor){
       datempPtr=*bPtr;
       *bPtr=(*bPtr)->sigPtr;
       free(datempPtr);
       /*Se liberara memoria de datempPtr*/
       return datoele;
       }
       
       else{
       datprevPtr=*bPtr;
       datactPtr=(*bPtr)->sigPtr;
       
       while(datactPtr!=NULL&&datactPtr->valor!=datoele){
       datprevPtr=datactPtr;
       datactPtr=datactPtr->sigPtr;
       };
       
       if(datactPtr!=NULL){
       datempPtr=datactPtr;
       datprevPtr->sigPtr=datactPtr->sigPtr;
       free(datempPtr);
       /*Se liberara memoria de datempPtr*/
       return datoele;
       }
       }
       return '\0';
       }
       
       int estavacia(LISTPREVPTR cPtr){
       /*Se define la función estavacia*/
           
       return(cPtr==NULL);
       }
       
       void imprime(LISTPREVPTR dPtr){
       /*Se define la función imprime*/
           
       if(dPtr==NULL){
       /*En casao de que dPtr no este inicializado se imprimira lo de abajo*/
                     
       printf("\a\n\t%s","La lista esta vacia\n\n");
       printf("NULL \n\n");
       }
       
       else{
       /*Cuando dPtr tenga valor se mostrara la lista*/
       printf("\n\t%s","La lista es: ");
       while(dPtr!=NULL){
       /*Solo cuando dPtr sea distitno de NULL se hara la impresión que aparece
       abajo*/
       printf("%c--->",dPtr->valor);
       dPtr=dPtr->sigPtr;
       }
       printf("\n");
       }
       }


Me surge una duda mas, como le haria para que en lugar de ingresar caracteres pueda ingresar cadenas y en la opcion de eliminar me elimine palabra por palabra y aparte me las ordene alfabeticamente???

Es que esto lo quise hacer modificando algunas cosas pero sigue sin aceptarme cadenas nada mas me lee el primer caracter de la cadena que ingreso.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com