MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación > Webmasters - Diseño Web - Programación - Diseño gráfico
HACER UN PROGRAMA EN C
Onefree:
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.
Onefree:
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.
ALP:
ok. esperamos.
jirho:
...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...
Navegación
[*] Página Anterior
Ir a la versión completa