Autor
|
Tema: problema con lista indexada (Leído 3,260 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos, estoy haciendo una lista simplemente ligada la cual tiene un campo indice para que cada que vaya agregando un elemento sepa cuantos elementos tiene. El problema es que cuando inicializo ese campo a 0 dentro de la structura me aparece un error typedef struct nodo { char *codigo; int indice = 0; struct nodo *sig; }NODO;
me dice que expected ':', ','...... or attribute before token gracias
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Las variables de las estructuras y clases se inicializan en el constructor y demás funciones. No se puede crear ya inicializada.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
¿Lenguaje?
En C no se pueden inicializar los miembros de estructura en la declaración, tienes que inicializarlas cuando la crees.
En C++ se pueden inicializar desde los constructores, o directamente en la declaración si la variable es static.
En C++11 puedes inicializar todas las variables en la declaración.
|
|
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
gracias por sus respuestas, es en lenguaje C. preguntaba lo de los indices porque queria hacer una busqueda binaria con una lista enlazada y necesitaba saber el número total de elementos, pero mejor voy a hacer la busqueda secuencial. Una ultima duda si ya tengo hecha la lista enlazada y quiero buscar un elemento,le paso a la funcion de buscar() el puntero que apunta al primer nodo y despues voy recorriendo la lista para ver si se encuentra el elemento, pero el problema es que el codigo siempre me imprime NO SE ENCONTRO EL CODOP DE OPERACION y no entiendo por que typedef struct nodo { char *codigo; struct nodo *sig; }CODOP; void buscarCodop(CODOP *cabeza) { CODOP *ptr; char *codop = "BLE"; int encontrado = 0; for(ptr = cabeza;(ptr != NULL)&&(encontrado);ptr = ptr->sig) { if((strcmp(ptr ->codigo ,codop )) == 0) encontrado = 1; } if(encontrado == 0) printf("\nNO SE ENCONTRO EL CODOP DE OPERACION\n"); else printf("\nNO SE ENCONTRO EL CODOP DE OPERACION\n"); }
esta es la parte que me da problemas, no posteo todo el codigo porque son como 360 lineas gracias
|
|
« Última modificación: 4 Enero 2014, 04:27 am por m@o_614 »
|
En línea
|
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡Buenas! Tienes un error aquí: int encontrado = 0; for(ptr = cabeza;(ptr != NULL)&&(encontrado);ptr = ptr->sig)
Si inicializas encontrado a cero y luego como condición de continuidad en el for utilizas que encontrado sea distinto de cero, nunca vas a ejecutar una sola iteración, ya que la primera comprobación de las condiciones siempre será falsa. Tienes que asumir que el elemento existe y decir que no existe solo si has recorrido toda la lista. ¡Saludos!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Extendiendo la solución de do-while puedes eliminar el cuerpo del bucle si en su condición colocas la comparación con strcmp. Ademas no es necesario declarar la variable local "ptr" cuando puedes utilizar el parámetro "cabeza" y el mensaje que imprimes se encuentre o no la cadena es el mismo. Con los cambios: #include <stdio.h> #include <string.h> typedef struct nodo { char *codigo; struct nodo *sig; } CODOP; void buscarCodop(CODOP *p) { while (p != NULL && strcmp(p ->codigo , "BLE") != 0) p = p->sig; if (p) puts("Se encontro el codop"); else puts("No se encontro el codop"); }
Eso en el caso de una lista vinculada sin ordenar, si los nodos están ordenados la búsqueda debe terminar en cuanto el puntero sea NULL o se encuentre un nodo con un valor igual o mayor al buscado. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
gracias por sus respuestas, una ultima duda, si tengo por ejemplo el archivo *****ORG***$AB Et1**SWI******* *****ADCA**1,X *****BRA***ET1 los codops son (ORG,SWI,ADCA,BRA) y cada uno de esos los tengo que buscar en una lista, en este ejemplo el unico codop que no se debe de encontrar es el ORG, pero en el codigo siempre me aparece NO SE ENCONTRO EL CODOP DE OPERACION, ya cheque que la funcion busqueda este bien implementada pero aun asi no puedo encontrar cual es el fallo #include <stdio.h> #include <stdlib.h> #include <string.h> #define LONG_ETIQUETA 8 #define LONG_CODOP 5 #define COMENTARIO ';' #define TABULADOR '\t' #define ESPACIOS_ ' ' typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; typedef enum {INS,OPE} tabla; typedef struct nodo { char *codigo; char *Operando; struct nodo *sig; }COD; COD *crearNodo(char *instruccion,char *op); void insertarFinal(char *instruccion,char *op,COD *ultimo); COD *ultimoElemento(COD *cabeza); void quitarSaltosLinea(char *cadena); int verificarCombinacion(FILE *fd); booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); char *_Codop_Operando(FILE *fd,int linea); void ultimaLinea(char *codop); void erroresEtiqueta(char *etiqueta); void erroresCodop(char *codop); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char caracter); booleano esLetra(char caracter); void listaCodops(COD *cabeza); char *Tabla_Operandos(FILE *hc12,int tabla); COD *buscarCodop(COD *cabeza,char *codop); void imprimirLista(COD *cabeza); int main() { FILE *fd; int car,combinacion; COD *cabeza = NULL,*encontrado; char *etiqueta,*codop,*operando; //listaCodops(cabeza); if((fd = fopen("P2ASM.txt","r"))!= NULL ) { while((car = fgetc(fd ))!= EOF ) { switch(car) { case COMENTARIO: if(esComentario(fd)) else buscarFinLinea(fd); break; case ESPACIOS_: case TABULADOR: etiqueta = "null"; printf("ETIQUETA = %s\n",etiqueta ); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); erroresCodop(codop); if((encontrado = buscarCodop(cabeza,codop)) == NULL) printf("\tNO SE ENCONTRO EL CODOP DE OPERACION\n"); combinacion = verificarCombinacion(fd); if(combinacion == 2) { operando = "null"; printf("OPERANDO = %s\n\n",operando ); } else { ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando ); } break; default: etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); printf("ETIQUETA = %s\n",etiqueta ); erroresEtiqueta(etiqueta); combinacion = verificarCombinacion(fd); if(combinacion == 2) { codop = "null"; erroresCodop(codop); if((encontrado = buscarCodop(cabeza,codop)) == NULL) printf("\tNO SE ENCONTRO EL CODOP DE OPERACION\n"); operando = "null"; printf("OPERANDO = %s\n\n",operando ); } else { ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); erroresCodop(codop); if((encontrado = buscarCodop(cabeza,codop)) == NULL) printf("\tNO SE ENCONTRO EL CODOP DE OPERACION\n"); combinacion = verificarCombinacion(fd); if(combinacion == 2) { operando = "null"; printf("OPERANDO = %s\n\n",operando ); } else { ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando ); } } break; } } ultimaLinea(codop); } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } int verificarCombinacion(FILE *fd) { int car,combinacion; if((car = fgetc(fd ))== '\n') combinacion = 2; else combinacion = 1; return combinacion; } booleano esLetra(char caracter) { if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z')) return 1; else return 0; } booleano esNumero(char caracter) { if(caracter >= '0' && caracter <= '9') return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; if((linea == ETIQUETA)||(linea == CODOP)) { do { lon++; }while(car != '\t' && car != ' ' && car != '\n'); } else { do { lon++; }while(car != '\n'); } quitarSaltosLinea(cadena); return cadena; } void quitarSaltosLinea(char *cadena) { char *ptr; if(((ptr =strchr(cadena ,'\n'))!=NULL )||((ptr =strchr(cadena ,'\t'))!=NULL )||((ptr =strchr(cadena ,' '))!=NULL )) *ptr = '\0'; } void erroresEtiqueta(char *etiqueta) { int tam,i = 0,esEtiqueta = 1; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n"); if(!esLetra(etiqueta[i])) printf("\tError:la etiqueta debe iniciar con letra\n"); else { for(i = 0;(i < tam)&&(esEtiqueta);i++) { if((!esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&&(etiqueta[i] != '_')) esEtiqueta = 0; } if(!esEtiqueta) printf("\tError:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); } } void erroresCodop(char *codop) { int tam,i = 0,esCodop = 1,punto = 0; if(tam > LONG_CODOP) printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n"); if((strcmp(codop ,"null"))== 0) printf("\tError:siempre debe de haber un codigo de operacion\n"); else { if(!esLetra(codop[i])) printf("\tError:los codigos de operacion deben iniciar con letra\n"); else { for(i = 1;(i < tam)&&(esCodop)&&(punto>=0&&punto<=1);i++) { if((!esLetra(codop[i]))&&(codop[i] != '.')) esCodop = 0; else if(codop[i] == '.') punto++; } if(!esCodop) printf("\tError:los caracteres validos en un codigo de operacion son letras y el caracter punto\n"); if(punto > 1) printf("\tError:los codigos de operacion no pueden tener mas de un punto\n"); } } } void ultimaLinea(char *codop) { if((strcmp(codop ,"END")) != 0) printf("Error:No se encontro el END.\n"); } void listaCodops(COD *cabeza) { int car; FILE *hc12; char *instruccion,*op; COD *ultimo; if((hc12 = fopen("TABOP.txt","r"))!= NULL ) { while((car = fgetc(hc12 ))!= EOF ) { if(car != '\t') { instruccion = Tabla_Operandos(hc12,INS); op = Tabla_Operandos(hc12,OPE); if(cabeza == NULL) cabeza = crearNodo(instruccion,op); else { ultimo = ultimoElemento(cabeza); insertarFinal(instruccion,op,ultimo); } } else buscarFinLinea(hc12); } imprimirLista(cabeza); } else printf("No se pudo abrir el archivo\n"); } char *Tabla_Operandos(FILE *hc12,int tabla) { int car,lon = 0,pos; char *cadena; do { lon++; }while(car != '\t'); fseek(hc12 ,pos ,SEEK_SET ); fgets(cadena ,lon +1,hc12 ); quitarSaltosLinea(cadena); if(tabla == INS) ignorarEspacios(hc12); else buscarFinLinea(hc12); return cadena; } void insertarFinal(char *instruccion,char *op,COD *ultimo) { ultimo->sig = crearNodo(instruccion,op); ultimo->sig->sig = NULL; ultimo = ultimo->sig; } COD *ultimoElemento(COD *cabeza) { COD *ptr; ptr = cabeza; while(ptr->sig != NULL) ptr = ptr->sig; return ptr; } COD *crearNodo(char *instruccion,char *op) { COD *x; int tam,tam2; x ->Operando = malloc((tam2 +1)); strcpy(x ->codigo ,instruccion ); x->sig = NULL; return x; } COD *buscarCodop(COD *cabeza,char *codop) { COD *ptr; for(ptr = cabeza;ptr != NULL;ptr = ptr->sig) { if((strcmp(ptr ->codigo ,codop )) == 0) return ptr; } return NULL; } void imprimirLista(COD *cabeza) { COD *ptr; for(ptr = cabeza;ptr != NULL;ptr = ptr->sig) { } }
gracias
|
|
|
En línea
|
|
|
|
bernii
Desconectado
Mensajes: 21
|
:-\Pregunta bruta, para que sirve toda esa programacion ?
|
|
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
es un ensamblador, en un archivo de texto me identifica las etiquetas codigos de operacion y operandos, y despues me tiene que buscar el codop en una lista para decirme si lo encontro o no
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema de mostrar una lista
Java
|
Aeros
|
3
|
3,056
|
10 Agosto 2010, 00:09 am
por Aeros
|
|
|
problema con metodo de lista
Programación C/C++
|
karmi
|
2
|
2,400
|
19 Noviembre 2010, 14:31 pm
por Akai
|
|
|
Como encontrar pagina de login ó url no indexada
Hacking
|
opportunity
|
1
|
5,212
|
9 Marzo 2011, 13:31 pm
por Ambr0si0
|
|
|
Problema con lista enlazada
Programación C/C++
|
Lain0x
|
2
|
3,636
|
8 Julio 2011, 13:20 pm
por Valkyr
|
|
|
problema con una lista
Programación C/C++
|
m@o_614
|
1
|
1,502
|
2 Mayo 2014, 06:11 am
por rir3760
|
|