Foros del Web » Programación para mayores de 30 ;) » C/C++ »

atuda programa

Estas en el tema de atuda programa en el foro de C/C++ en Foros del Web. relizando un diccionario me encuentro con varios problemas, este es el codigo Código: #include <stdlib.h> #include <stdio.h> #include <string.h> #define TAM 2048 typedef struct lista{ ...
  #1 (permalink)  
Antiguo 29/05/2009, 08:51
 
Fecha de Ingreso: mayo-2009
Mensajes: 1
Antigüedad: 15 años
Puntos: 0
atuda programa

relizando un diccionario me encuentro con varios problemas,
este es el codigo
Código:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define TAM 2048
typedef struct lista{
  char * info;
  struct lista * sig;
  int peso;
}Lista;

typedef struct palabra{
  char * pal;
  struct palabra * sigu;
}Palabra;

typedef struct dic{
  char * clave;
  Lista * valor;
  
  struct dic * siguiente;
}Diccionario;

Diccionario * nuevaClave(char * clave, Diccionario * sig);
Lista * nuevoValor(char * valor, int peso);
void inserta(Diccionario ** miDic, char *clave, char * valor, int peso);
void borra(Diccionario * miDic);
void borraLista(Lista * lista);
void imprimeLista(Diccionario * miDic);
/*  ---  */
int main(int argc, char **argv){
  int accion;
  int error = 1;
  Diccionario * prim = NULL;
  char clave [TAM + 1];
  char valor [TAM + 1];
  int peso;
  int contador;
  /* Aseguro que no han introducido mas comandos. */
  if(argc > 1)
    {
      fprintf(stderr,"Error 2: Este programa no admite argumentos.\n");
      /*QUITAR LOS 2 RETURNS*/
      return  EXIT_FAILURE;
    }
  /* resto del codigo */
  fprintf(stdout,"   Menu: \n    1. Insertar una acepcion en el diccionario. \n    2. Borrar una acepcion del diccionario. \n    3. Borrar una palabra del diccionario. \n    4. Imprimir palabra del diccionario. \n    5. Imprimir diccionario. \n");
  fprintf(stdout,"Introduzca la accion que va a llevar a cabo: ");
  fscanf(stdin,"%d",&accion);
  while(fgetc(stdin) != '\n');
  switch(accion){
  case 1:
    do{
      printf("Teclee la Clave(Introduzca & para finalizar): \n");
      fgets(clave, TAM, stdin);
      if('&' != clave[0]){
	printf("Teclee el Valor: \n");
	fgets(valor, TAM, stdin);
	printf("Teclee el Peso: \n");
	fscanf(stdin,"%d",&peso);
	inserta(&prim, clave, valor, peso);
	while(fgetc(stdin) != '\n');
	contador ++;
      }
    }
    while ( '&' != clave[0]);
    imprimeLista(prim);
  }
  
  return EXIT_SUCCESS;       
}


Diccionario * nuevaClave(char * clave, Diccionario * sig){
  Diccionario * palabra = (Diccionario * ) malloc(sizeof(Diccionario));
  if (NULL != palabra)
    if(NULL != (palabra->clave = (char *) malloc (strlen(clave) + 1))){
      strcpy(palabra->clave, clave);
      palabra->siguiente = sig;
     
    }else{
      free(palabra);
      palabra = NULL;
    }
  return palabra;
}

Lista * nuevoValor(char * valor, int peso){
  Lista * definic = (Lista *) malloc(sizeof(Lista));
  if (NULL != definic)
    if (NULL != (definic->info = (char *) malloc(strlen(valor) + 1))){
      strcpy(definic->info, valor);
      definic->peso = peso;
      definic->sig = NULL;
    }else{
      free(definic);
      definic = NULL;
    }
  return definic;
}

void inserta(Diccionario ** miDic, char *clave, char * valor, int peso){
  Diccionario * nuevaEntrada = NULL;
  Lista ** recorreLista = NULL;
  Lista * aux = NULL;
  while (NULL != *miDic && 0 < strcmp((*miDic)->clave, clave));
  if (NULL == *miDic || 0 != strcmp((*miDic)->clave, clave))
    /*La clave no existe*/
    if (NULL != (nuevaEntrada = nuevaClave(clave, *miDic)));
  *miDic = nuevaEntrada;
  if (NULL != *miDic){
    recorreLista = &((*miDic)->valor);
    aux = nuevoValor(valor, peso);
    if( recorreLista != NULL);
    while((*recorreLista)!= NULL && aux->peso > (*recorreLista)->peso){
     recorreLista =&((*recorreLista)->sig); 
    }
    aux->sig = *recorreLista;
    (*recorreLista) = aux;

  }
}


void borraLista(Lista * lista){
  Lista * aux = NULL;
  while (lista != NULL){
    aux = lista->sig;
    free(lista->info);
    free(lista);
    lista = aux;
  }
}

void borra(Diccionario * miDic){
  Diccionario * aux = NULL;
  while (miDic != NULL){
    aux = miDic ->siguiente;
    free(miDic->clave);
    borraLista(miDic->valor);
    free(miDic);
    miDic = aux;
  }
}

void imprimeLista(Diccionario * miDic){
  
  Lista ** paux = NULL;
  while( miDic  != NULL){
    printf("%p\t", miDic);
    printf("%s\t", miDic->clave);
    if (NULL != miDic->valor){
      paux = &((miDic)->valor);
      if( paux != NULL);
      while((*paux)!= NULL ){
	 
	printf("%s\t",((*paux)->info));
	*paux = (*paux)->sig;
      }
      
    }
    
    printf("%d\t",miDic->valor->peso);
    printf("%p\n",miDic->siguiente);
    miDic = miDic->siguiente;
  }
}

bien, el primer problema es que a veces se cuelga y deja de funcionar cuando tengo que introducir el peso de la palabra(tanto por ciento que es usada respecto a otras deficiones), el segundo, es que al introducir mas de una definicion por palabra, el programa no imprime bie, mi problema esta en la funcion imprimeLista y no se que hacer, y el tercero es, una vez arreglado eso.... como haria para que los imprimiera por orden de peso¿?

muchas gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:36.