[SOLUCIONADO] Ayuda {C} - Hacer trabajar la Función Eliminar

Iniciado por Kr3L, Marzo 18, 2016, 12:06:10 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Marzo 18, 2016, 12:06:10 PM Ultima modificación: Marzo 19, 2016, 12:44:40 AM por Gabriela
El usuario rollth hiso un gran trabajo en ayudar en otras funciones. El programa se basa en un registro de datos y en el menu hay una funcion eliminar los nodos ya registrado y cuando le doy eliminar me pide el codigo que ha sido registro en el nodo, lo coloco y al meter la variable me dice la condicion que la lista ha sido eliminada. El problema está que no lo borra, porque cuando abro el registro de los datos se crashea el programa y se cierra o a veces simplemente me aparece toda la lista que ha sido registrada anteriormente.

Código Completo del Registro
Código: c
/*////////////////////////////////////////////////////////////////////////////////////////////////////////
*                                                                                                     ///
* |        |      |             |                                                                ///
* |--- , ' |--- , |     ' ,---. |---  ,---. ,---. ,---.         ///
* |    | | |    | |     | |   | |     |---' |     ,---|             ///
* `---'  '  `---' `---' ' `---' `---' `---' `---' `---^            ///
*                                                                                                ///
* Jose L. Montaner                                                                            ///         
* 24432283                                                                                   ///
* 16/03/2016                                                                                ///
*///////////////////////////////////////////////////////////////////////////////////////////////


#include<stdlib.h>// Permite ingresar al archivo de cabecera estandar de libreria, que reconoce los system
#include<stdio.h>// Perime crear  archivo de cabecera estandar de entrada y salida que reconoce los printf, fflush y scanf
#include<string.h> //Cadena de textos que se puede comprobar el valor de una cadenas

//-------------------------------------------------------------------------------------------------------



//-------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------

struct nodo //Declaración de "nodo" como una estructura de datos
{
char titulo[100];//caracte que posee una  variable llamada "titulo", finalizando en punto y coma (;)
char autor [100];//caracte que posee una variable llamada "autor", finalizando en punto y coma (;)
int publicacion;//Entero que posee una variable llamada "publicacion",finalizando en punto y coma (;)
int codigo;//Entero que posee una variable llamada  "Código",finalizando en punto y coma (;)
nodo *ant, *sig;//Declaración de "sig" de tipo nodo, se denota por (*) antes de la variables ant y sig

};//finaliza el bloque del struct y el punto y coma (;) indica

//--------------------------------------------------------------------------------------------------

typedef nodo lista; //Declaracion de "lista" como tipo nodo
lista *primero,*ultimo; //Declaración de punteros "primero" y "ultimo" de tipo lista
void menu();//Prototipo de función
void ingresar();//Prototipo de función
void mostrar();//Prototipo de función
void busquedatitulo();//Prototipo de función
void busquedaautor();//Prototipo de función
void busquedapublicacion();//Prototipo de función
void busquedacodigo();//Prototipo de función
void eliminar ();//propio de la funcion


//--------------------------------------------------------------------------------------------------
void ingresar() //
{ //inicio del bloque del void ingresar
system("cls");
        lista *nuevo;

        nuevo=new(nodo);//Se crea un nuevo nodo para la lista enlazada, new nuevo tipo de instruccion
        system("cls");//Borrador de pantalla
printf("\n\n\n\t****************** INGRESAR DATOS ******************\n\n");
        for (int i=0;i<1;i++)

{ // inicio del for
printf("Nombre del libro: ");// muestra el mensaje  que se encuentra en comillas
fflush(stdin);//Limpiar buffer de entrada de datos
gets(nuevo->titulo);//Almacenar el titulo en el nuevo nodo

printf("autor: ");// muestra el mensaje  que se encuentra en comillas
fflush(stdin);//Limpiar buffer de entrada de datos
gets(nuevo->autor);//Almacenar la vatiable autor en el nuevo nodo

printf("Año de publicacion: ");// muestra el mensaje  que se encuentra en comillas
fflush(stdin);//Limpiar buffer de entrada de datos
scanf ("%i",&nuevo->publicacion);

printf("Ingrese los 3 codigo del libro: ");// muestra el mensaje  que se encuentra en comillas
scanf ("%i",&nuevo->codigo);// entrada de dato con formato
}// finalizar el for

  nuevo->sig=NULL; //nuevo es igual al sig y sig es igual a null
  nuevo->ant=NULL;// el nuevo nodo de la lista no tiene un  nodo anterior

        if(primero==NULL)// estructura de control que indica Si el registro es el primero a ingresar
{//inicia el if
  primero=nuevo; // entonces el nuevo nodo es tanto el primero..
  ultimo=nuevo;// como el último
}
else //De no ser así
{
  /*doblemente enlazado*/
  ultimo->sig=nuevo; //Entonces el nodo anterior ahora apunta al nuevo
  nuevo->ant=ultimo;// el nodo anterio es el ultimo
  ultimo=nuevo; //Y el nuevo ahora es el último nodo de la lista
}
menu();//regresa al menu
}

//--------------------------------------------------------------------------------------------------

void mostrar()
{
system("cls"); //Borra pantalla
printf("\n\n\n\t****************** DATOS INGRESADOS ******************\n\n");
lista *i=ultimo;//Declaracion de puntero i y asignación del valor del primer nodo
while(i !=NULL)//Mientras que i(nodo) no esté vacio
{
  printf("titulo:%s\n",i->titulo);//Mostrar el titulo almacenado en el nodo
  printf("Autor:%s\n", i->autor);
  printf("Publicacion:%i\n", i->publicacion);
  printf("Codigo:%i\n", i->codigo);
  printf("____________________________\n\n");
  i=i->ant;// Pasar al siguiente nodo
}
system("pause>>null");//realiza una pause
menu();//regresa al menu
}

//-------------------------------------------------------------------------------------------------

void eliminar()
{
system ("cls");//Borrador de pantalla//
lista *i=primero;// creando nodo como auxiliar (i) para hacer comparacion o mostar
printf("\n\n\n\t****************** ELIMINAR LISTA ******************\n\n");
int e, codigoe;// Variable tipo entero
printf ("Imgrese el codigo a eliminar: ");
scanf ("%d",&codigoe); // escane el codigo y muestras
while (i!=NULL)//Mientras que i(nodo) no esté vacio
{
  if (codigoe==i->codigo)
  {
   printf("titulo:%s\n",i->titulo);//Mostrar el nombre almacenado en el nodo actual
      printf("Autor:%s\n", i->autor);
      printf("Publicacion:%i\n", i->publicacion);
      printf("Codigo:%i\n", i->codigo);
     
      printf ("seguro desea elimnar presione 1: ");
      scanf ("%i", &e);
break;
  }
 
  else
  {
i=i->sig;
  }
}
    if (e==1)
   {
   delete i;
   printf("\nLista borrada.");
   }
  system("pause>>null");
menu();
}

//--------------------------------------------------------------------------------------------------

void busquedatitulo()
{//inicia el bloque de void busquedatitulo
system ("cls");// borrador de pantalla
lista *i=primero;//Declaracion de puntero i y asignación del valor del primer nodo
char titulob [20];// Varianle tipo caracter
bool encontrado = false;
printf ("Ingrese el titulo del libro:");// muestra un mensaje
fflush(stdin);//sirve para limpiar el buffer de entrada de teclado
gets (titulob);//la funcion gets() te permite almacenar la cadena de caracteres que ingreses por teclado en el arreglo de caracteres que tengas creada
while (i!=NULL)
{
  if (strcmp (titulob, i->titulo)==0) //hace comparacion con la funcion strcmp
  {
     printf("\ntitulo:%s\n",i->titulo);//Mostrar el titulo del libro ingresado
  printf("Autor:%s\n", i->autor);//Muestra el nombre del autor
  printf("Publicacion:%i\n", i->publicacion);// Muestra el año de publicacion
  printf("Codigo:%i\n", i->codigo);//Muestra el codigo
  printf("____________________________\n\n"); // muestra las barra
i=i->sig;
encontrado = true;
  }
  else {
i=i->sig;
  }
 
}

if (encontrado == false){
printf("\n\t Titulo del libro no registrado \t");
}

system("pause>>null");
menu();
}//finaliza el bloque del voi busquedatitulo

//--------------------------------------------------------------------------------------------------

void busquedaautor()
{
system ("cls");
lista *i=primero;
char autorb [20];
bool encontrado = false;
printf ("Ingrese el nombre del autor:");// muestra el mensaje  que se encuentra en comillas
printf("\n");
fflush(stdin);
gets (autorb);
while (i!=NULL)
{
  if (strcmp (autorb, i->autor)==0)
  {
     printf("titulo:%s\n\n",i->titulo);//Mostrar el titulo del libro ingresado
  printf("Autor:%s\n", i->autor);//Muestra el nombre del autor
  printf("Publicacion:%i\n", i->publicacion);// Muestra el año de publicacion
  printf("Codigo:%i\n", i->codigo);//Muestra el codigo
  printf("____________________________\n\n"); // muestra las barra
  i=i->sig;
  encontrado = true;
  }
  else {
  i=i->sig;
  }
}
 
   if (encontrado == false){
printf("\n\t Autor no registrado\t");
}
 

system("pause>>null");
menu();
}

//--------------------------------------------------------------------------------------------------

void busquedapublicacion ()
{
system ("cls");
lista *i=primero;
printf ("Ingrese el año de publicacion: ");// muestra el mensaje  que se encuentra en comillas
int publicacionb=0;
bool encontrado = false;
scanf ("%i",&publicacionb);
while (i !=NULL)
{
  if (publicacionb==i->publicacion)
  {
  printf("titulo:%s\n",i->titulo);//Mostrar el titulo del libro ingresado
  printf("Autor:%s\n", i->autor);//Muestra el nombre del autor
  printf("Publicacion:%i\n", i->publicacion);// Muestra el año de publicacion
  printf("Codigo:%i\n", i->codigo);//Muestra el codigo
  printf("____________________________\n\n"); // muestra las barra
encontrado = true;
i=i->sig;
  }
  else {
  i=i->sig;
  }
}
 
     if (encontrado == false){
printf("\n\t No se encuentra registado\t");
}
 

system("pause>>null");
menu();
}

//--------------------------------------------------------------------------------------------------

void busquedacodigo ()
{
system ("cls");
lista *i=primero;
printf("\n\n\n\t****************** BUSQUEDA ******************\n\n");
int codigo1;
bool encontrado = false;
printf ("Ingrese el codigo que desea buscar:");
scanf ("%i",&codigo1);
while (i !=NULL)
{
  if (codigo1== i->codigo )
  {
  printf("titulo:%s\n",i->titulo);//Mostrar el titulo del libro ingresado
  printf("Autor:%s\n", i->autor);//Muestra el nombre del autor
  printf("Publicacion:%i\n", i->publicacion);// Muestra el año de publicacion
  printf("Codigo:%i\n", i->codigo);//Muestra el codigo
 
      break;
      encontrado = true;
  }
  else if (codigo1!=0) 
  {
  i=i->sig;
  }
}

     if (encontrado == false){
printf("\n\t No se encuentra registado\t");
}

system("pause>>null");
menu();
}


//--------------------------------------------------------------------------------------------------

void menu()
{ //inicia el void menu
system("cls");//borra el contenido de la pantalla

int op; //variable tipo entera op
printf("\n\n\n\t******************  CONTROL DE REGISTRO   ******************\n\n");//muestra el mensaje  que se encuentra en comillas
printf("\t\t\t1.-Ingresar libro\n");// muestra el mensaje  que se encuentra en comillas
printf("\t\t\t2.-Mostrar Registros de libros\n");// muestra el mensaje  que se encuentra en comillas
printf("\t\t\t3.-Buscar libro por titulo\n");// muestra el mensaje  que se encuentra en comillas
printf("\t\t\t4.-Buscar libro por autor\n");// muestra el mensaje  que se encuentra en comillas
printf("\t\t\t5.-buscar libro por codigo\n");// muestra el mensaje  que se encuentra en comillas
printf("\t\t\t6.-Buscar libro por año de de publicacion\n");// muestra el mensaje  que se encuentra en comillas
printf("\t\t\t7.-Eliminar libro del registro\n");// muestra el mensaje  que se encuentra en comillas
printf("\t\t\t8.-Salir\n\n");// muestra el mensaje  que se encuentra en comillas
printf("\t\t\tSelecciona una opcion: ");// muestra el mensaje  que se encuentra en comillas
scanf("%i",&op);

        switch(op)
{//inicia el switch
case 1:
  ingresar();
  break;
case 2:
  mostrar();
  system("pause>null");
  menu();
  break;
case 3:
  busquedatitulo();
  system("pause>null");
  menu();
  break;
case 4:
  busquedaautor ();
  system("pause>null");
  menu();
        break;
case 5:
     busquedacodigo();
  system("pause>null");
  menu();
  break;
  case 6:
   busquedapublicacion ();
      system ("pause>>null");
         menu ();
            break;
  case 7:
   eliminar ();
   system ("pause>>null");
      menu ();

  case 8:
   system ("cls");
   printf("\nGRACIAS POR UTILIZAR EL SISTEMA\n");
   
    break;
   
    while (op!=8);
default:
      printf("\n\tOpcion invalidan\t");
   printf("\n\t Seleccione un numero que se muestre en pantalla\n\t");
  system("pause>null");
  menu();
}//finaliza el switch
}//finaliza el void menu

//--------------------------------------------------------------------------------------------------

int main() //* Función principal *//
{
system("title Biblioteca Universal Alonso de Ojeda");
system("color 1f");
menu();
system("pause>null");
}


Función Eliminar
Código: c
void eliminar()
{
system ("cls");//Borrador de pantalla//
lista *i=primero;// creando nodo como auxiliar (i) para hacer comparacion o mostar
printf("\n\n\n\t****************** ELIMINAR LISTA ******************\n\n");
int e, codigoe;// Variable tipo entero
printf ("Imgrese el codigo a eliminar: ");
scanf ("%d",&codigoe); // escane el codigo y muestras
while (i!=NULL)//Mientras que i(nodo) no esté vacio
{
  if (codigoe==i->codigo)
  {
   printf("titulo:%s\n",i->titulo);//Mostrar el nombre almacenado en el nodo actual
      printf("Autor:%s\n", i->autor);
      printf("Publicacion:%i\n", i->publicacion);
      printf("Codigo:%i\n", i->codigo);
     
      printf ("seguro desea elimnar presione 1: ");
      scanf ("%i", &e);
break;
  }
 
  else
  {
i=i->sig;
  }
}
    if (e==1)
   {
   delete i;
   printf("\nLista borrada.");
   }
  system("pause>>null");
menu();
}


La verdad es que necesito la ayuda, el programa lo tengo que presentar y defender hoy en la universidad y mi conocimiento con C es realmente limitado.

Saludos.
Hola, soy Kr3L !

Eliminalo del registro

Para eliminar registros de una base de datos, utiliza el método TableAdapter.Update o el método TableAdapter.Delete.  Si tu aplicación no utiliza TableAdapters, puedes utilizar objetos de comando para eliminar registros de una base de datos (por ejemplo, ExecuteNonQuery).

Generalmente se utiliza el método TableAdapter.Update cuando la aplicación utiliza conjuntos de datos para almacenar datos, en tanto que se utiliza el método TableAdapter.Delete cuando la aplicación utiliza objetos para almacenar los datos. 

Si el TableAdapter no dispone de un método Delete, significa que el TableAdapter está configurado para utilizar procedimientos almacenados o que su propiedad GenerateDBDirectMethods está establecida en false.  Prueba a establecer la propiedad GenerateDBDirectMethods de TableAdapter en true desde el Diseñador de Dataset y guarda el conjunto de datos para volver a generar el TableAdapter. Si aun así el TableAdapter no dispone de un método Delete, probablemente la tabla no proporciona información suficiente para distinguir entre filas individuales (por ejemplo, la tabla no dispone de clave principal).

Eliminar registros mediante TableAdapters 

Los TableAdapters proporcionan maneras diferentes de eliminar registros de una base de datos en función de los requisitos de su aplicación. 

Si la aplicación utiliza conjuntos de datos para almacenar datos, puedes eliminar los registros del conjunto DataTable deseado en DataSet y, a continuación, llamar al método TableAdapter.Update.  El método TableAdapter.Update toma cualquier cambio en la tabla de datos y envía esos cambios a la base de datos (incluidos registros insertados, actualizados y eliminados).

Para eliminar registros de una base de datos utilizando el método TableAdapter.Update

Elimina los registros del DataTable deseado eliminando los objetos DataRow de la tabla. Después de que las filas se eliminen de DataTable, llama al método TableAdapter.Update. Puedes controlar la cantidad de datos que se actualizan pasando un objeto DataSet completo, un objeto DataTable, una matriz de DataRows o un único objeto DataRow.

Espero que funcione

Saludos

Mmmm.. Esto se trata de C, no se de donde sacaste eso.

Ya encontré la solución, había que crear una condición enlazando los nodos para convertirlos en nada en la función eliminar, es decir:

primero=primero->ant->sig;
ultimo=ultimo->sig->ant;

Saludos.
Hola, soy Kr3L !