Autor
		 | 
		
			Tema: problema con lista indexada  (Leído 3,722 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,339
						 | 
						
							 
							
								10 Agosto 2010, 00:09 am 
								por Aeros
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							problema con metodo de lista
							 
							Programación C/C++
						 | 
						
							karmi
						 | 
						
							2
						 | 
						
							2,699
						 | 
						
							 
							
								19 Noviembre 2010, 14:31 pm 
								por Akai
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Como encontrar pagina de login ó url no indexada
							 
							Hacking
						 | 
						
							opportunity
						 | 
						
							1
						 | 
						
							5,537
						 | 
						
							 
							
								 9 Marzo 2011, 13:31 pm 
								por Ambr0si0
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Problema con lista enlazada
							 
							Programación C/C++
						 | 
						
							Lain0x
						 | 
						
							2
						 | 
						
							4,001
						 | 
						
							 
							
								 8 Julio 2011, 13:20 pm 
								por Valkyr
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							problema con una lista
							 
							Programación C/C++
						 | 
						
							m@o_614
						 | 
						
							1
						 | 
						
							1,753
						 | 
						
							 
							
								 2 Mayo 2014, 06:11 am 
								por rir3760
							
						 | 
					 
				 
			    |