Autor Tema: HACER UN PROGRAMA EN C  (Leído 9632 veces)

Desconectado Onefree

  • Newbie
  • *
  • Mensajes: 5
    • http://thezulo.mine.nu
HACER UN PROGRAMA EN C
« Respuesta #10 en: 16 de Junio de 2004, 12:46:20 pm »
Bueno soy yo de nuevo, estamos a miercoles, pues el viernes pasado hice el examen de programación  y me salió mal, tuve k ir el lunes e intetar terminarlo pero no pude, total que el profesor me dijo k tenía k ir a la recuperación de hoy miercoles.
Aquí pongo un ejercicio que he hecho pero me da el sieguiente error:
<Undefined symbol insertar(lista_elementos near*) in module PROGRA~1\ENLFICH.CPP>
Aquí os dejo el código del programa si alguien puede corregirme el fallo y poner el código correcto de nuevo, se lo agradecería.
Lo necesito para ya (antes de las 14:30).


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

#define NULL 0

struct lista_elementos{
   char elem[40];        //Dato de este nodo
   struct lista_elementos *sig;    //Puntero al siguiente nodo
}vlista;

typedef struct lista_elementos nodo;   //Declaracion del tipo de estructura


int menu(void);            //Prototipo de Funcion
void crear(nodo *pt);         //Prototipo de Funcion
nodo *insertar(nodo *pt);      //Prototipo de Funcion
nodo *eliminar(nodo *pt);           //Prototipo de Funcion
void mostrar(nodo *pt);                 //Prototipo de Funcion
void fichero(nodo *pt);                 //Prototipo de Funcion
void verfichero(nodo *pt);      //Prototipo de Funcion
FILE *fp;

main(){
   nodo *prin;         //Puntero al principio de la lista
   int eleccion;         //Declaracion de variable local

   do{
      eleccion = menu();
      switch(eleccion){

      case 1:         //Crear Lista Enlazada
         prin = (nodo *) malloc(sizeof(nodo));   //Reserva de Espacio para el primer nodo
         crear(prin);
         printf("\n");
         mostrar(prin);
         continue;

      case 2:         //A¤adir un componente
         prin = insertar(prin);
         printf("\n");
         mostrar(prin);
         continue;

      case 3:       //Borrar un componente
         prin = eliminar(prin);
         printf("\n");
         mostrar(prin);
         continue;

      case 4:       //Grabar la lista a un fichero
         fichero(prin);
         continue;

      case 5:       //Ver los datos del fichero
         verfichero(prin);
         continue;

      default:       //Finalizar
         printf("\nFin de las operaciones\n");
      }
   }while (eleccion !=6);
}

int menu(void){           //Generar el Menu Principal
   int eleccion;

   do{
      printf("\n\t\t\t\tMenu Principal: \n");
      printf("\n\t\t\t1 - CREAR la lista enlazada");
      printf("\n\t\t\t2 - A¥ADIR un componente");
      printf("\n\t\t\t3 - BORRAR un componente");
      printf("\n\t\t\t4 - GRABAR la lista a un fichero");
      printf("\n\t\t\t5 - VER los datos del fichero");
      printf("\n\t\t\t6 - SALIR del programa");
      printf("\n\n\tPor favor, introduzca su seleccion (1, 2, 3, 4, 5 o 6) -> ");
      scanf("%d",&eleccion);
      if(eleccion<1 || eleccion>6)
         printf("\nERROR - Por favor, intentelo de nuevo");
   }while(eleccion<1 || eleccion>6);
   printf("\n");
   return(eleccion);
}

void crear(nodo *registro){      //Crear un lista enlazada

         //El argumento apunta al nodo actual

   printf("\nDato (escribir \'FIN'\ para terminar): ");
   scanf(" %[^\n]",registro->elem);

   if(strcmp(registro->elem,"FIN")==0)
      registro->sig = NULL;
   else{
               //Reservar espacio para el siguiente nodo
      registro->sig = (nodo *)malloc(sizeof(nodo));

               //Crear el siguiente nodo
      crear(registro->sig);
   }
   return;
}

void mostrar(nodo *registro){       //Mostrar la lista enlazada

         //El argumento apunta al nodo actual

   if(registro->sig != NULL){
      printf("\n%s",registro->elem);    //Mostrar este Dato
      mostrar(registro->sig);       //Tomar el siguiente elemento
      }
      return;
}

nodo *insetar(nodo *primero){          //A¤ade un componente a la lista enlazada;
                   //devuelve un puntero al principio de la lista modificada

         //El argumento apunta al primer nodo

   nodo *localizar(nodo *, char[]);    //Declaracion de funcion
   nodo *nuevoregistro;          //Puntero al nuevo nodo
   nodo *marca;             //Puntero al nodo anterior al buscado
   char nuevodato[40];          //Dato nuevo
   char objetivo[40];          //Dato siguiente a la nueva entrada
   printf("\nNuevo Dato: ");
   scanf(" %[^\n]", nuevodato);
   printf("\nColocar delante de (escribir \'FIN'\ si es el ultimo): ");
   scanf(" %[^\n]", objetivo);

   if(strcmp(primero->elem, objetivo) == 0){              //El nuevo nodo es el primero de la lista
      nuevoregistro = (nodo *)malloc(sizeof(nodo)); //Reservar espacio para nuevo nodo
      strcpy(nuevoregistro->elem,nuevodato);         //Asignar el nuevo dato a nuevoregistro->elem
      nuevoregistro->sig = primero;            //Asignar el puntero actual a nuevoregistro->sig
      primero = nuevoregistro;            //El nuevo puntero se convierte en el principio de la lista
   }
   else{                        //Insertar el nuevo nodo tras algún nodo existente
      marca = localizar(primero,objetivo);         //Localizar el nodo precedente del nodo objetivo

      if(marca == NULL)
         printf("\nNo se encuentra coincidencia - Pruebe de nuevo");
      else{
         nuevoregistro = (nodo *)malloc(sizeof(nodo));   //Reservar espacio para el nuevo nodo
         strcpy(nuevoregistro->elem, nuevodato);      //Asignar el nuevo dato a nuevoregistro->elem
         nuevoregistro->sig = marca->sig;      //Asignar el siguiente puntero a nuevoregistro->sig
                        marca->sig = nuevoregistro;         //Asignar el nuevo puntero a marca->sig
      }
   }
   return(primero);
}

nodo *localizar(nodo *registro, char objetivo[]){         //Localizar un nodo

            //Devuelve un puntero al nodo anterior al nodo objetivo
            //El primer argumento apunta al nodo actual
            //El segundo argumento apunta al nodo objetivo

   if(strcmp(registro->sig->elem, objetivo) ==0)         //Coincidencia encontrada
      return(registro);
   else
      if(registro->sig->sig == NULL)            //FIN de la lista
         return(NULL);
      else
         localizar(registro->sig, objetivo);   //Probar el siguiente nodo
}

nodo *eliminar(nodo *primero){   //Eliminar (borrar) un componente de la lista enlazada;
            //devuelve un puntero al principio de la lista modificada

      //El argumento apunta al primer nodo

   nodo *localizar(nodo *, char[]);   //Declaracion de funcion
   nodo *marca;            //Puntero al nodo anterior al buscado
   nodo *temp;            //Puntero temporal
   char objetivo[40];         //dato a borrar
   printf("\nDato a borrar: ");
   scanf(" %[^\n]", objetivo);

   if(strcmp(primero->elem, objetivo) ==0){//Borrar el primer nodo
      temp = primero->sig;      //Marcar el nodo siguiente al nodo objetivo
      free(primero);            //Liberar el espacio del nodo objetivo
      primero = temp;         //Ajustar el puntero al primer nodo
   }
   else{                  //Borrar otro dato distinto del primero
      marca = localizar(primero, objetivo);   //Localizar el nodo precedente del nodo objetivo

      if(marca == NULL)
         printf("\nNo se encuentra coincidencia - Pruebe de nuevo");
   else{
      temp = marca->sig->sig;      //Marcar el nodo siguiente al nodo objetivo
      free(marca->sig);      //Liberar el espacio del nodo objetivo
      marca->sig =temp;      //Ajustar el enlace para el siguiente nodo
   }
   }
   return(primero);
}

void fichero(nodo *registro){

   if ( (fp = fopen("FICHERO.DAT","ab")) == NULL){
      printf("\n FALLO A LA HORA DE ABRIRLO");
      exit(0);
   }

   if(registro->sig != NULL){
      printf("\n%s",registro->elem);    //Mostrar este Dato
      mostrar(registro->sig);       //Tomar el siguiente elemento
   }

   if(fwrite(registro->elem,sizeof(lista_elementos),1,fp)!=1){
      printf("\n ERROR DE ESCRITURA");
      exit(0);
   }
        fclose(fp);
}

void verfichero(nodo *registro){

   if ( (fp = fopen("FICHERO.DAT","ab")) == NULL){
      printf("\n FALLO A LA HORA DE ABRIRLO");
      exit(0);
   }

   fread(registro->elem,sizeof(lista_elementos),1,fp);
   while(!feof(fp)){
      printf("\nDato :  %[^\n]",registro->elem);
      fread(registro->elem,sizeof(lista_elementos),1,fp);
   }
        fclose(fp);
}

El programa es simplemente meter datos en una lista enlazada, después de creada la lista , meter datos entre medio de los ya existentes (me falla ahí), borrar datos de la lista, grabar la lista a un fichero, y ver lo grabado en el fichero.

Desconectado Onefree

  • Newbie
  • *
  • Mensajes: 5
    • http://thezulo.mine.nu
HACER UN PROGRAMA EN C
« Respuesta #11 en: 16 de Junio de 2004, 02:34:37 pm »
El fallo era una mariconada me faltaba una  'r' en la funcion, de todos modos esten al tanto por si tengo k ir el viernes a terminar el ejercicio, lo traeré esta noche a mi casa para que me expliqueis dudas o para yo terminarlo aqui en mi casa y llevrlo ya el viernes acabado.

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
HACER UN PROGRAMA EN C
« Respuesta #12 en: 16 de Junio de 2004, 09:03:35 pm »
ok. esperamos.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
HACER UN PROGRAMA EN C
« Respuesta #13 en: 16 de Junio de 2004, 11:37:12 pm »
...si asi de simple...cuando te salgan problemas de ese tipo es que estan usando variables, o en este caso prototipos de funciones que no estan definidas, fijate muy bien en la sintaxis que esten escritas correctamente...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

 

Aviso Legal | Política de Privacidad | Política de Cookies

el contenido de la web se rige bajo licencia
Creative Commons License