elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  warnings
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: warnings  (Leído 6,837 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
warnings
« en: 21 Diciembre 2012, 01:08 am »

saludos

tengo el siguiente código de una lista simplemente enlazada, pero el problema es que me aparece un warning que dice:

return makes pointer from integer without a cast

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct nodo
  5. {
  6.    int dato;
  7.    struct nodo*sig;
  8. }NODO;
  9.  
  10. NODO* crear_nodo(int x);
  11. void insertar_cabeza(NODO **cabeza,int x);
  12. NODO* buscar_elemento(NODO *cabeza);
  13.  
  14. int main()
  15. {
  16.    int i,num,x;
  17.    NODO *cabeza,*ptr;
  18.    cabeza = NULL;
  19.    printf("Cuantos elementos quieres?\n");
  20.    scanf("%d",&num);
  21.    printf("Lista Simplemente Ligada!\n");
  22.    for(i=0;i<num;i++)
  23.    {
  24.        printf("Dame el elemento %d\n",i+1);
  25.        scanf("%d",&x);
  26.        insertar_cabeza(&cabeza,x);
  27.        system("cls");
  28.    }
  29.  
  30.    for(ptr=cabeza;ptr!=NULL;ptr=ptr->sig)
  31.        printf("\n%d\n",ptr->dato);
  32.    buscar_elemento(cabeza);
  33.    return 0;
  34. }
  35.  
  36. NODO* crear_nodo(int x)
  37. {
  38.    NODO *p;
  39.    p = (NODO*)malloc(sizeof(NODO));
  40.    p->dato = x;
  41.    p->sig = NULL;
  42.    return p;
  43. }
  44.  
  45. void insertar_cabeza(NODO **cabeza,int x)
  46. {
  47.    NODO *nuevo;
  48.    nuevo = crear_nodo(x);
  49.    nuevo->sig = *cabeza;
  50.    *cabeza = nuevo;
  51. }
  52.  
  53. NODO* buscar_elemento(NODO *cabeza)
  54. {
  55.    int elemento,encontro=0;
  56.    NODO *indice;
  57.    printf("Buscar elemento\n\n");
  58.    printf("Cual elemento quieres buscar?\n");
  59.    scanf("%d",&elemento);
  60.    for(indice=cabeza;indice!=NULL;indice=indice->sig)
  61.    {
  62.        if(indice->dato==elemento)
  63.           encontro=1;
  64.        else
  65.           encontro=0;
  66.    }
  67.    if(encontro)
  68.       return indice->dato;
  69.    else
  70.       return 0;
  71. }
  72.  
de antemano gracias


En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: warnings
« Respuesta #1 en: 21 Diciembre 2012, 01:15 am »

El warning es porque en tu caso buscar_elemento debe retornar un apuntador a NODO (NODO*) y tu estás retornando un entero.

Código
  1.   if(encontro)
  2.       return indice->dato;
  3.    else
  4.       return 0;
  5.  


En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: warnings
« Respuesta #2 en: 21 Diciembre 2012, 11:53 am »

pero el warning no afecta el funcionamiento del programa, deberia retornar NULL entonces??
En línea


0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: warnings
« Respuesta #3 en: 21 Diciembre 2012, 15:56 pm »

pero el warning no afecta el funcionamiento del programa, deberia retornar NULL entonces??

Si.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: warnings
« Respuesta #4 en: 22 Diciembre 2012, 01:53 am »

muchas gracias por sus respuestas, ahora ya no me aparece ese warning pero como ya le agregue la función de eliminar_elemento (en esta metí la función de buscar) pero no me hace lo que le pido

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct nodo
  5. {
  6.    int dato;
  7.    struct nodo*sig;
  8. }NODO;
  9.  
  10. NODO* crear_nodo(int x);
  11. void insertar_cabeza(NODO **cabeza,int x);
  12. void eliminar_elemento(NODO **cabeza);
  13.  
  14. int main()
  15. {
  16.    int i,num,x;
  17.    NODO *cabeza,*ptr;
  18.    cabeza = NULL;
  19.    printf("Cuantos elementos quieres?\n");
  20.    scanf("%d",&num);
  21.    printf("Lista Simplemente Ligada!\n\n");
  22.    for(i=0;i<num;i++)
  23.    {
  24.        printf("Dame el elemento %d\n",i+1);
  25.        scanf("%d",&x);
  26.        insertar_cabeza(&cabeza,x);
  27.        system("cls");
  28.    }
  29.  
  30.    for(ptr=cabeza;ptr!=NULL;ptr=ptr->sig)
  31.        printf("%d\t",ptr->dato);
  32.  
  33.    eliminar_elemento(&cabeza);
  34.    for(ptr=cabeza;ptr!=NULL;ptr=ptr->sig)
  35.        printf("%d\t",ptr->dato);
  36.    return 0;
  37. }
  38.  
  39. NODO* crear_nodo(int x)
  40. {
  41.    NODO *p;
  42.    p = (NODO*)malloc(sizeof(NODO));
  43.    p->dato = x;
  44.    p->sig = NULL;
  45.    return p;
  46. }
  47.  
  48. void insertar_cabeza(NODO **cabeza,int x)
  49. {
  50.    NODO *nuevo;
  51.    nuevo = crear_nodo(x);
  52.    nuevo->sig = *cabeza;
  53.    *cabeza = nuevo;
  54. }
  55.  
  56. void eliminar_elemento(NODO **cabeza)
  57. {
  58.   int n;
  59.   NODO *actual,*anterior;
  60.   anterior=NULL;
  61.   printf("Dame el elemento a eliminar\n");
  62.   scanf("%d",&n);
  63.   for(actual=*cabeza;actual!=NULL;actual=actual->sig)
  64.   {
  65.       if(actual->dato==n)
  66.       {
  67.           anterior = actual->sig;
  68.           actual = anterior;
  69.           free(actual);
  70.       }
  71.   }
  72. }
  73.  

estos punteros por qué son tan difíciles?? :rolleyes:
En línea

twins

Desconectado Desconectado

Mensajes: 54


Ver Perfil
Re: warnings
« Respuesta #5 en: 22 Diciembre 2012, 02:24 am »

Hola pues te explico para eliminar un nodo que este en una posicion distinta del inicio o final necesitas usar dos punteros para poder hacer los enlaces en este caso yo solo modifique la funsion eliminar_elemento tu puedes revisar y ver cuales fueron los cambios cordiales saludos  ;D
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct nodo{
  4.    int dato;
  5.    struct nodo *sig;
  6. }NODO;
  7. NODO* crear_nodo(int x);
  8. void insertar_cabeza(NODO **cabeza,int x);
  9. void eliminar_elemento(NODO **cabeza);
  10. int main(void){
  11.    int i,num,x;
  12.    NODO *cabeza,*ptr;
  13.    cabeza = NULL;
  14.    printf("Cuantos elementos quieres?\n");
  15.    scanf("%d",&num);
  16.    printf("Lista Simplemente Ligada!\n\n");
  17.    for(i=0;i<num;i++){
  18.        printf("Dame el elemento %d\n",i+1);
  19.        scanf("%d",&x);
  20.        insertar_cabeza(&cabeza,x);
  21.        system("cls");
  22.    }
  23.    for(ptr=cabeza;ptr!=NULL;ptr=ptr->sig)
  24.        printf("%d\t",ptr->dato);
  25.    eliminar_elemento(&cabeza);
  26.    for(ptr=cabeza;ptr!=NULL;ptr=ptr->sig)
  27.        printf("%d\t",ptr->dato);
  28.    return 0;
  29. }
  30. NODO* crear_nodo(int x){
  31.    NODO *p;
  32.    p = (NODO*)malloc(sizeof(NODO));
  33.    p->dato = x;
  34.    p->sig = NULL;
  35.    return p;
  36. }
  37. void insertar_cabeza(NODO **cabeza,int x){
  38.    NODO *nuevo;
  39.    nuevo = crear_nodo(x);
  40.    nuevo->sig = *cabeza;
  41.    *cabeza = nuevo;
  42. }
  43. void eliminar_elemento(NODO **cabeza){
  44. int n;
  45. NODO *aux1=*cabeza,*aux2=aux1;
  46.    printf("Dame el elemento a eliminar\n");
  47.    scanf("%d",&n);
  48. while(aux2->dato!=n){
  49. aux1=aux2;
  50. aux2=aux2->sig;
  51. }
  52. aux1->sig=aux2->sig;
  53.    free(aux2);
  54. }
  55.  
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: warnings
« Respuesta #6 en: 23 Diciembre 2012, 03:09 am »

ahora ya no me aparece ese warning pero como ya le agregue la función de eliminar_elemento (en esta metí la función de buscar) pero no me hace lo que le pido
Como ya te comentaron:
A) Si el nodo a eliminar es el primero debes utilizar el parámetro de la función para así afectar la variable "cabeza" de la función main.
B) Para cualquier otro nodo solo hay que actualizar el campo "sig" del nodo anterior.

Para eliminar un nodo de una lista no es necesario utilizar variables auxiliares (en el bucle), en su lugar se trabaja directamente con el parámetro (y sirve para practicar el tema):
Código
  1. void eliminar_elemento(NODO **p)
  2. {
  3.   NODO *aux;
  4.   int dato;
  5.  
  6.   puts("Dame el elemento a eliminar:");
  7.   scanf("%d", &dato);
  8.  
  9.   while (*p != NULL && (*p)->dato != dato)
  10.      p = &(*p)->sig;
  11.   if (*p != NULL){
  12.      aux = *p;
  13.      *p = (*p)->sig;
  14.      free(aux);
  15.   }
  16. }

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
durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: warnings
« Respuesta #7 en: 23 Diciembre 2012, 06:48 am »

Hola! muy bueno el aporte rir3760, la verdad me costo entenderlo; trabajar directamente con el puntero a puntero :)


Saludos
En línea

Ahorrate una pregunta, lee el man
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: warnings
« Respuesta #8 en: 28 Diciembre 2012, 03:22 am »

Muchas gracias por sus respuestas

Una última pregunta porque cuando le ingreso por ejemplo los números 5,18,67,80 me los imprime al revés 80, 67,18 y 5

no se supone que el puntero *cabeza siempre apunta al inicio de la lista?? ¿por qué la imprime así?

gracias :)
En línea

twins

Desconectado Desconectado

Mensajes: 54


Ver Perfil
Re: warnings
« Respuesta #9 en: 28 Diciembre 2012, 16:37 pm »

Eso es porque los nodos los estas ingresando al inicio de la lista por ejemplo si ingresas el 1 y despues el 2, en este caso el 2 quedara a la izquierda del 1 es decir 2,1 y tu puntero cabeza apunta al segundo nodo recien ingresado, en este caso el 2, por lo tanto cuando imprimes, imprimes de izquierda a derecha ose 2,1.
si quieres que los nodos sea impresos segun el orden en que fueron ingresados tendras que modificar la funcion insertar_cabeza.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fase test: Mi intranet :: Matriculas - notas - pagos - etc :: Comentar Warnings
Desarrollo Web
Hadess_inf 5 3,213 Último mensaje 4 Julio 2010, 10:35 am
por Joker
Warnings en tratamiento de ficheros con C++ Builder XE
Programación C/C++
mario_tko 1 3,114 Último mensaje 15 Noviembre 2011, 16:01 pm
por do-while
Warnings en gcc -Wall
Programación C/C++
soyloqbuskas 3 3,850 Último mensaje 4 Abril 2012, 03:51 am
por Beakman
warnings en compilacion
Programación C/C++
ccsponcer3 3 2,978 Último mensaje 5 Junio 2016, 18:03 pm
por HardForo
Implementar warnings en compilador
Programación General
Adri124 0 1,713 Último mensaje 28 Junio 2016, 21:16 pm
por Adri124
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines