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ú

Mensajes - michellcrh

#1
Programación C/C++ / Re: Linked List
18 Noviembre 2020, 04:50 AM
Muchas Gracias, ya lo resolví. Excelente explicación.
#2
Programación C/C++ / Re: Linked List
18 Noviembre 2020, 04:13 AM
Si, lo modifiqué, pero sigo con el mismo problema
void insertAfter(int llave, int dato) {
    struct node *l;
    l = malloc(sizeof(struct node));
    count++;
     if (start == NULL) { // Primera vez
      start = l;
      start->data = dato;
      start->next = NULL;
      return;
   }
    found->data = llave;
    l->data = dato;
    found->next = l;
   
}
#3
Programación C/C++ / Re: Linked List
18 Noviembre 2020, 03:57 AM
Si, ya llevo una parte, la adjunto a continuación, pero mi problema es que si inserta el número después del número que le pido, pero los elementos que estaban después ya no los imprime.
void insertAfter(int llave, int dato) {
    struct node *l,*t;
    l = malloc(sizeof(struct node));
    count++;
     if (start == NULL) { // Primera vez
      start = t;
      start->data = dato;
      start->next = NULL;
      return;
   }
    found->data = llave;
    l->data = dato;
    found->next = l;

}
#4
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);
}

#5
Te lo agradezco mucho, me ayudó bastante.
#6
Te lo agradezco mucho, mas o menos esta es la funcion que quería hacer pero no logro que conforme me vaya digitando el numero del nombre que desea meter al arreglo, este se vaya llenando.

void mostrarNombres(Persona *personas, int numeroPersonas){
    int opcion,opc;
    char arregloPersonas[50][LIMITE]; // limite = 100
    do{
        for(int i = 0; i < numeroPersonas; i++){
    printf("%d Nombre: %s\n", i+1,personas[i].nombre);
    printf("\n\n");
   }

   printf(" Ingrese el numero correspondiente al nombre que desea: ");
       scanf("%d",&opcion);

       for(int j=0; j<numeroLibros; j++){
           if(opcion == j+1){
               //En este caso la persona con el numero que ingrese deberia guardarse en el arreglo, y es lo que no funciona
               //personas[j].nombre

           }
       }

       printf(" Desea agregar otro nombre?, 1 = SI , 2 = NO: ");
       scanf("%d",&opc);
       system("cls");
    }while(opc == 1);
    if(opc == 2){
        printf("\nNOMBRES AGREGADOS:\n");
        for(int i=0; i<numeroPersonas;i++){
             printf("%s\n",arregloPersonas[i]);
        }

    }
    else{
        printf("ERROR, OPCION NO VALIDA");
    }



}

#7
Y si quiero meter varias cadenas a un mismo arreglo?
Lo que sucede es que estoy intentando llenar un arreglo con datos que ya tengo en una estructura y en este caso solo necesito llenarlo con los nombres.
Mas o menos tendría un opción en donde se pediría que nombres quiero meter al arreglo y conforme me los vaya ingresando la persona, se iría llenando el array.
#8
Te lo agradezco mucho :)
#9
 :-\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