Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - michellcrh

#1
Programación C/C++ / Linked List
18 Noviembre 2020, 02:28 AM
Hola.
No puedo generar el algoritmo para la función insertAfter, la cual inserta un elemento después de otro, según la llave tecleada.
Espero me puedan ayudar por favor.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <locale.h>
// Definición de variables globales
struct node {
   int data;
   struct node *next;
};
struct node *start = NULL; // start es el pointer al primer nodo
struct node *found = NULL; // found es el pointer al nodo encontrado
int count = 0; // Número de nodos
// Definición de funciones
void insertFirst(int); // Inserta un nodo al principio de la lista
void insertLast(int); // Inserta un nodo al final de la lista
void insertAfter(int, int); // Inserta un nodo después de otro
int find(int); // Buscar un nodo
void traverse(); // Realiza el recorrido de la lista
void deleteFirst(); // Remueve el primer nodo de la lista
void deleteLast(); // Remueve el último elemento de la lista
void create(); // Función auxiliar, crea una lista

int main () {
    int dato, opcion;
    setlocale(LC_ALL, ""); // para caracteres del Español
    printf(" 1 - Insertar al inicio de la linked list.\n");
    printf(" 2 - Insertar al final de la linked list.\n");
    printf(" 3 - Insertar después de otro.\n");
    printf(" 4 - Buscar un nodo en la lista.\n");
    printf(" 5 - Desplegar la linked list (traverse).\n");
    printf(" 6 - Borrar elemento al inicio\n");
    printf(" 7 - Borrar elemento al final.\n");
    printf(" 8 - Terminar\n");
    create(); // crea una lista de prueba
    while (true) {
        printf("Teclee la opción: ");
        scanf("%d", &opcion);
        switch (opcion) {
        case 1: // insertar al inicio
            printf("Teclee valor del elemento a insertar al inicio\n");
          scanf("%d", &dato);
          insertFirst(dato);
            break;
        case 2: // insertar al final
            printf("Teclee valor del elemento a insertar al final\n");
          scanf("%d", &dato);
          insertLast(dato);
            break;
        case 3: // insertar después
            printf("Teclee valor de la llave.\n");
          scanf("%d", &dato);
          int llave = find(dato);
          if (llave == -2) { // find regresa -2 si la lista está vacía
          break;
}
          if(llave == -1) { // find regresa -1 si no se encuentra
          printf("No se encontró %d en la lista.\n", dato);
          break;
}
          printf("Teclee valor de nodo a insertar después de llave.\n");
          scanf("%d", &dato);
          int nuevo = find(dato);
insertAfter(llave, dato);
            break;
        case 4: // buscar
            printf("Teclee valor del elemento a buscar.\n");
          scanf("%d", &dato);
          int encontrado = find(dato);
          if (encontrado == -2) { // find regresa -2 si la lista está vacía
          break;
}
          if(encontrado == -1) { // find regresa -1 si no se encuentra
          printf("No se encontró %d en la lista.\n", dato);
} else {
printf("Se encontró %d en la lista.\n", dato);
}
            break;
        case 5: // recorrer
        traverse();
            break;
        case 6: // borrar el primero
            deleteFirst();
            break;
        case 7: // borrar el último
            deleteLast();
            break;
        case 8:
            printf("Gracias por participar");
            exit(0);
        default:
            printf("Opción inválida, intente de nuevo\n");
  }
    }
   return 0;
}

void insertFirst(int dato) {
   struct node *t;
   t = malloc(sizeof(struct node));  // ubica memoria para el nodo
   count++;
   if (start == NULL) { // primera vez
      start = t;
      start->data = dato;
      start->next = NULL;
      return;
   }
   t->data = dato;
   t->next = start;
   start = t;
}

void insertLast(int dato) {
   struct node *t, *temp;
   t = malloc(sizeof(struct node));
   count++;
   if (start == NULL) { // Primera vez
      start = t;
      start->data = dato;
      start->next = NULL;
      return;
   }
   temp = start;
   while (temp->next != NULL) {  // busca el último nodo
      temp = temp->next;
   }
   temp->next = t;
   t->data = dato;
   t->next = NULL;
}

void insertAfter(int llave, int dato) {

   


}

int find(int datoBuscado) {
struct node *temp;
    temp = start;
    if (temp == NULL) {
      printf("Linked list vacía.\n");
      return -2;
   }
    while (temp->next != NULL) {  // busca
      if(temp->data == datoBuscado) {
      found = temp;
  return temp->data;
  } else {
  temp = temp->next;
  }
    }
    if(temp->data == datoBuscado) { // en caso de que sea el último
    found = temp;
      return temp->data;
}
return -1;
}

void traverse() {
   struct node *t;
   t = start;
   if (t == NULL) {
      printf("Linked list vacía.\n");
      return;
   }
   printf("Hay %d elemento(s) en la linked list.\n", count);
   while (t->next != NULL) {
      printf("%d -> ", t->data);
      t = t->next;
   }
   printf("%d\n", t->data);
}

void deleteFirst() {
   struct node *t;
   int n;
   if (start == NULL) {
      printf("Linked list vacía.\n");
      return;
   }
   n = start->data;
   t = start->next;
   free(start);
   start = t;
   count--;
   printf("%d eliminado del inicio de la linked list.\n", n);
}

void deleteLast() {
   struct node *t, *u;
   int n;
   if (start == NULL) {
      printf("Linked list vacía.\n");
      return;
   }

   count--;

   if (start->next == NULL) { // un solo nodo en la lista
      n = start->data;
      free(start);
      start = NULL;
      printf("%d eliminado del final de la linked list.\n", n);
      return;
   }

   t = start;

   while (t->next != NULL) {
      u = t;
      t = t->next;
   }

   n = t->data;
   u->next = NULL;
   free(t);

   printf("%d eliminado del final de la linked list.\n", n);
}

void create() {
insertFirst(444);
insertFirst(333);
insertFirst(222);
insertFirst(111);
}

#2
 :-\Hola tengo que realizar un programa haciendo uso de estructuras dinamicas y lectura de archivos, pero no puedo hacer correctamente la extracción de los archivos y guardarlos en arreglos.
Solo guarda el nombre y la cantidad, pero el autor y el precio no.

Este es mi código:

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

typedef struct{
   char *nombre;
   char *autor;
   int cantidad;
   int precio;
}libros;
libros *l;

void menu();
void vaciar(char temp[]);
void copiarNombre(char temp[],int i);
void copiarAutor(char temp[],int i);

int main(){
   char temp[50],aux;
   int contador = 0;

   FILE *fichero;
   fichero = fopen("libros.txt","rt");
   if(fichero == NULL){
       printf("No se ha encontrado el documento\n");
       return 0;
   }
   while(!feof(fichero)){
       fgets(temp,50,fichero);
       contador++;
   }
   rewind(fichero);
   l = (libros*)malloc(contador*sizeof(libros));
   if(l == NULL){
       printf("NO SE HA PODIDO RESERVAR LA MEMORIA\n");
       return 0;
   }
   for(int i=0;!feof(fichero); i++){
       vaciar(temp);
       aux = '0';
       for(int j=0; aux != ','; j++ ){
               aux = fgetc(fichero);
               if(aux != ','){
                   temp[j] = aux;
               }
       }
       copiarNombre(temp,i);
       copiarAutor(temp,i);
       fgets(temp,4,fichero);
       l[i].cantidad = atoi(temp);
       fgets(temp,5,fichero);
       l[i].precio = atoi(temp);
      printf("Precio: %d\n",l[i].precio);

   }
   fclose(fichero);

   getchar();
   return 0;
}

void menu(){
   int opc;

   printf("\t\t\tLIBRERIA FI\n\n");
   printf("1. Leer inventario inicial\n");
   printf("2. Mostrar inventario de existencias\n");
   printf("3. Vender libros\n");
   printf("4. Informe de ventas\n");
   printf("5. Salir\n");
   printf(" \nIngrese el numero correspondiente a la operacion que desea realizar: ");
   scanf("%d",&opc);
}

void vaciar(char temp[]){
   for(int i=0; i<50; i++){
       temp[i] = '\0';
   }
}

void copiarNombre(char temp[],int i){
   int longitud;
   longitud = strlen(temp)+1;
   l[i].nombre = (char*)malloc(longitud*sizeof(char));
   if(l[i].nombre == NULL){
       printf("No se ha podido reservar memoria\n");
       return 0;
   }
   strcpy(l[i].nombre,temp);
}

void copiarAutor(char temp[],int i){
   int longitud;
   longitud = strlen(temp)+1;
   l[i].autor = (char*)malloc(longitud*sizeof(char));
   if(l[i].autor == NULL){
       printf("No se ha podido reservar memoria\n");
       return 0;
   }
   strcpy(l[i].autor,temp);
}



mi archivo de texto es el siguiente:

La casa de los espiritus,Isabel Allende,5,345
La Metamorfosis,Franz Kafka,3,560
La Odisea,Homero,7,200
El Principito,Antoine de Saint-Exupery,2,499
El Laberinto de la Soledad,Octavio Paz,1,150
El tunel,Ernesto Sabato,3,100
Los miserables,Victor Hugo,5,290
Cuentos de amor de locura y de muerte,Horacio Quiroga,4,563
El amor en lo tiempos de colera,Gabriel Garcia Marquez,6,218




MOD: Utiliza las etiquetas de Código GeSHi para los fragmentos de código