/
Inicio :: Foros

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

¿Una ayudita con listas+punteros+structs?

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



Registrado: 15 Ago 2012
Mensajes: 2

MensajePublicado: 15/08/2012 2:44 pm
Título: ¿Una ayudita con listas+punteros+structs?

Hola Smile estoy siguiendo un tutorial para principiantes de c (así que creo que este es el foro correcto) y me he encontrado con un ejercicio que me está volviendo completamente loca. Uso mac os x y programo usando el propio terminal del sistema operativo.

Se trata de hacer unas listas dobles que almacenan un entero, la posición de memoria del elemento anterior y del siguiente, en las que se permite crear un nuevo elemento, listar los números que se han introducidos y ordenarlos.
Me da insistentemente en la línea 82 el error "request for member ‘siguiente’ in something not a structure or union". No está completo el programa. No se si será de ayuda, he indicado más abajo la línea concreta que es. Estaría muy agradecida si alguien pudiera traer un poco de luz al asunto.


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct{

int num;
void *siguiente;
void *anterior;

} numers;

numers* introducir(int numero, numers *dato){

numers* aux;
aux = (numers*)malloc(sizeof(numers));

aux->num = numero;
aux->siguiente = NULL;
aux->anterior = (void *)dato;

return(aux);

}

mostrar_lista(numers **dado){

if((*dado)->siguiente!= NULL){


printf("\n %d \n", (*dado)->num);
dado = dado +1;
mostrar_lista(dado);

}

}
int ordenar_descendente(){}
int ordenar_ascendente(){}

int main(void){

int eleccion;
int nuevo_numero;
numers **agenda;
int num_elegido;
int nueva_lista = 0;
int contador = 0;
int fin = 0;

agenda = (numers**)malloc(4*sizeof(numers *));
agenda[0] = (numers*)malloc(sizeof(numers));
agenda[0]->num = 0;
agenda[0]->anterior = NULL;
agenda[0]->siguiente = NULL;

while(fin ==0){

printf("\n Introduzca un numero para continuar \n");
printf("\n 1 para introducir nuevo numero \n");
printf("\n 2 para mostrar todos\n");
printf("\n 3 para ordenar de menor a mayor\n");
printf("\n 4 para ordenar de mayor a menor\n");

scanf("%d", &eleccion);

if(eleccion == 1 ){

printf("\n ¿Que numero desea almacenar? \n");
scanf("%d", &nuevo_numero);

if(nueva_lista == 0){

agenda[0]->num = nuevo_numero;
nueva_lista = 1;

}
else{

contador++;
*(agenda + contador) = introducir(nuevo_numero, *(agenda+contador-1));
(agenda + contador - 1)->siguiente =(void*) (agenda + contador); <---La línea de la discordia


}

}

if(eleccion == 2 ){
mostrar_lista(agenda);

}

if(eleccion == 3 ){

if(agenda){

ordenar_ascendente(agenda);

}

}

if(eleccion == 4){

ordenar_descendente(agenda);

}

}
return(0);
}

[/b]
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7530
Ubicación: Mexico

MensajePublicado: 15/08/2012 4:20 pm
Título:

Aparte del error que mencionas el programa tiene otros mas, por ejemplo tienes la función:
Código:
mostrar_lista(numers **dado)
{
   if((*dado)->siguiente!= NULL){
      printf("\n %d \n", (*dado)->num);
      dado = dado +1;
      mostrar_lista(dado);
   }
}

Ahí falta indicar el tipo de retorno de la función y si se compila como C según su estándar:

A) C90 entonces se da por sentado que el tipo de retorno es "int" pero ahora el error es no indicarlo mediante una sentencia de retorno "return N;".

B) C99 entonces de plano es un error y el compilador debe reportarlo.

En cuanto a la linea que comentas te falta utilizar el operador de indireccion (el '*'), debería ser:
Código:
contador++;
*(agenda + contador) = introducir(nuevo_numero, *(agenda+contador-1));
(*(agenda + contador - 1))->siguiente = *(agenda + contador);

Y si utilizamos el operador "[]" evitamos tantos paréntesis:
Código:
contador++;
agenda[contador] = introducir(nuevo_numero, agenda[contador-1]);
agenda[contador - 1]->siguiente = agenda[contador];


Ese fragmento es sintacticamente correcto (debe compilar) pero de ahí que la acción sea la esperada es otra historia. Si tengo tiempo mas tarde lo reviso con calma.

Un saludo
_________________
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
Volver arriba
Kilz



Registrado: 15 Ago 2012
Mensajes: 2

MensajePublicado: 17/08/2012 9:06 am
Título:

Mil gracias Very Happy

He acabado el programita. Dejo aquí el código entero por si a alguien le sirve (aunque supongo que sin duda podrá estar mejor hecho, pero al menos funciona y es un ejercicio interesante)


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct{

int num;
void *siguiente;
void *anterior;

} numers;

numers* introducir(int numero, numers *dato){

numers* aux;
aux = (numers*)malloc(sizeof(numers));

aux->num = numero;
aux->siguiente = NULL;
aux->anterior = (void *)dato;

return(aux);

}

void mostrar_lista(numers **dado, int cierre){

if((*dado)->siguiente== NULL){

cierre++;

}

if( (cierre==0)||(cierre==1) ){

if(cierre == 1){

cierre++;

}

printf("\n %d \n", (*dado)->num);


if(cierre == 0){

mostrar_lista(dado +1 , cierre);

}

}

}
void ordenar_descendente(numers **dado, int total){

numers **ayudante1;
numers auxiliar;
int i;
int a;
int cuenta = 0;

ayudante1 = dado;

for(i=0; i<total; i++){

cuenta = 0;

for(a=i+1; a<total+1; a++){

if( ((*(ayudante1 + i))->num) < ((*(ayudante1 + a))->num) ){

printf("\n %d %d \n",((*(ayudante1 + i))->num),( (*(ayudante1 + a))->num) );
(((auxiliar)).num) =( (*(ayudante1 + a))->num);
((*(dado + a))->num) = ((*(ayudante1 +i))->num);
((*(dado + i))->num) = ( ((auxiliar)).num);

}


}


}




}
int ordenar_ascendente(numers **dado, int total){

numers **ayudante1;
numers auxiliar;
int i;
int a;

ayudante1 = dado;

for(i=0; i<total; i++){

for(a=1; a<total+1; a++){

if( ((*(ayudante1 + a - 1))->num) > ((*(ayudante1 + a))->num) ){

printf("\n %d %d \n",((*(ayudante1 + a - 1))->num),( (*(ayudante1 + a))->num) );
(((auxiliar)).num) =( (*(ayudante1 + a))->num);
((*(dado + a))->num) = ((*(ayudante1 + a - 1))->num);
((*(dado + a-1))->num) = ( ((auxiliar)).num);

}


}


}


}
int main(void){

int eleccion;
int nuevo_numero;
numers **agenda;
int num_elegido;
int nueva_lista = 0;
int contador = 0;
int fin = 0;


agenda = (numers**)malloc(10*sizeof(numers *));
agenda[0] = (numers*)malloc(sizeof(numers));
agenda[0]->num = 0;
agenda[0]->anterior = NULL;
agenda[0]->siguiente = NULL;

while(fin ==0){

printf("\n Introduzca un numero para continuar \n");
printf("\n 1 para introducir nuevo numero \n");
printf("\n 2 para mostrar todos\n");
printf("\n 3 para ordenar de mayor a menor\n");
printf("\n 4 para ordenar de menor a mayor\n");

scanf("%d", &eleccion);

if(eleccion == 1 ){

// printf("\n ¿Que numero desea almacenar? \n");
// scanf("%d", &nuevo_numero);

if(nueva_lista == 0){

agenda[0]->num = 478;
nueva_lista = 1;


}

else{

contador++;
*(agenda + contador) = introducir(37, *(agenda+contador-1));
(*(agenda + contador - 1))->siguiente =(void*) (agenda + contador);

contador++;
*(agenda + contador) = introducir(45, *(agenda+contador-1));
(*(agenda + contador - 1))->siguiente =(void*) (agenda + contador);

contador ++;
*(agenda + contador) = introducir(2, *(agenda+contador-1));
(*(agenda + contador - 1))->siguiente =(void*) (agenda + contador);


contador ++;
*(agenda + contador) = introducir(23, *(agenda+contador-1));
(*(agenda + contador - 1))->siguiente =(void*) (agenda + contador);

contador ++;
*(agenda + contador) = introducir(1, *(agenda+contador-1));
(*(agenda + contador - 1))->siguiente =(void*) (agenda + contador);


}

}

if(eleccion == 2 ){

mostrar_lista(agenda, 0);

}

if(eleccion == 3 ){

if(agenda){

ordenar_descendente(agenda, contador);

}

}

if(eleccion == 4){

ordenar_ascendente(agenda, contador);

}

}
return(0);

}
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