Autor Tema: Programacion en C - Listas Simplemente enlazadas  (Leído 9301 veces)

madness

  • Sin experiencia
  • *
  • Mensajes: 11
    • Ver Perfil
Programacion en C - Listas Simplemente enlazadas
« en: 17 de Abril 2014, 22:42 »
Muy buenas tardes gente :) Necesito de su ayuda :( estoy realizando una tarea en donde debo ingresar nombres diferentes en una lista, y lo único que he logrado es que guarde una letra ! A continuación mi código:

Código: [Seleccionar]
Persona *agregarNom(char nombre)
{
  Persona *pdato;
  if(pdato = (Medicos *) malloc(sizeof(Persona)))
    {
      /* Se almacena la información en Info */
      pdato->nombre = nombre;
      /* pdato->dato2 = dato2; */
      return pdato;
    }
  else
    {
      printf("problemas en la inserción\n");
      exit(0);
    }
}

char insertarNomMed(Lista *plista, char persona)
{
  Nodo *aux;
  int i;
  Persona *dato = agregarNom(persona);
  // Se crea un nodo con datos y apunta al siguiente nodo
  if(aux = crearNodo(dato, plista->inicio)) //además, se almacena en aux
    {
      plista->inicio = aux;
      if(plista->tamano == 0)
        plista->fin = aux;
      plista->tamano++;
     }
}

int main(int argc, char *argv[])
{
  Lista *L;
  L = creaLista();
  int i;
  char nombreMed[1];
  printf("Ingrese nombre del medico: ");
  scanf("%s", nombreMed);
  insertarNomMed(L, *nombreMed);
  return 0;
}

Espero que me puedan ayudar lo mas pronto posible y muchas gracias de antemano :D
« Última modificación: 17 de Abril 2014, 22:48 por madness »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2659
    • Ver Perfil
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #1 en: 18 de Abril 2014, 11:27 »
A mí el código no me compila ¿falta código que no has puesto?

Lo que veo a simple vista es que estás trabajando con char que representa un caracter cuando para representar nombres necesitas un array de char

Persona *agregarNom(char nombre)
char insertarNomMed(Lista *plista, char persona)

Si usas un array de char:
Persona *agregarNom(char[] nombre)
char insertarNomMed(Lista *plista, char[] persona)

Aquí dices que nombreMed tiene un solo caracter, con lo cual solo te coge el primer caracter que escribas:
char nombreMed[1];

Tendrías que declararlo como:
char nombreMed[100];

De este modo te cogerá hasta 100 caracteres

Sl2


madness

  • Sin experiencia
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #2 en: 19 de Abril 2014, 21:54 »
Sí, la verdad es que falta las estructuras que definí en miprograma.h, el cual lo incluí en el programa que expuse y, al compilarlo, solo imprime el primer caracter :(, aún asi definiendo nombreMed[100] :/.  El problema que tengo es que debo insertar nombres en una lista, y cada nombre de la lista es asociado a una cola... Ya no sé que hacer u.u no me resulta insertar un nombre completo :( ayuda porfa :(

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #3 en: 20 de Abril 2014, 12:57 »
Hola, pega el código del programa completo incluido los .h para poder revisarlo.

Responsable de departamento de producción aprenderaprogramar.com

madness

  • Sin experiencia
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #4 en: 26 de Abril 2014, 01:00 »
Hola Cesar :D, aquí va mi código:

Código: [Seleccionar]
Lista *creaLista()
{
  Lista *nuevo;

  if(nuevo = (Lista *) malloc(sizeof(Lista))) // Pide memoria para la lista
    {
      nuevo->tamano = 0; // Lista vacía
      nuevo->inicio = nuevo->fin = NULL; // Inicio y Fin apuntan a NULL
    }
  return nuevo;
}
void destruirLista(Lista *plista)
{
  Nodo *aux;

  while(plista->inicio != NULL)
    {
      aux = plista->inicio;
      plista->inicio = plista->inicio->siguiente;
      free(aux->datos);
      free(aux);
    }
  free(plista);
}


Nodo *crearNodo(Info *dato, Nodo *anterior, Nodo *siguiente)
{
  Nodo *nuevo;
  if(nuevo = (Nodo *) malloc(sizeof(Nodo))) // Pide memoria para el nodo
    {
      nuevo->datos = dato;
      nuevo->anterior = anterior;
      nuevo->siguiente = siguiente;
    }
  return nuevo;
}

Info *agregar(int dato1)
{
  Info *pdato;
  if(pdato = (Info *) malloc(sizeof(Info)))
    {
      /* Se almacena la información en Info */
      pdato->dato1 = dato1;
      /* pdato->dato2 = dato2; */
      return pdato;
    }
  else
    {
      printf("problemas en la inserción\n");
      exit(0);
    }
}


bool insertar(Lista *plista, char info)
{
  Nodo *aux;
  Info *dato = agregar(info);
  // Se crea un nodo con datos y apunta al siguiente nodo
  if(aux = crearNodo(dato, NULL, plista->inicio)) //además, se almacena en aux
    {
      if(plista->tamano == 0)
        plista->fin = aux;
      else
        plista->inicio->anterior = aux;
      plista->inicio = aux;
      plista->tamano++;

      return true;
    }
  else
    return false;
}
int main(int argc, char *argv[])
{
  Lista *L1, *L2, *L3, *L4, *L5;
  L1 = creaLista();
  L2 = creaLista();
  L3 = creaLista();
  L4 = creaLista();
  L5 = creaLista();
  Cola *C1, *C2, *C3, *C4, *C5;
  C1 = creaCola();
  C2 = creaCola();
  C3 = creaCola();
  C4 = creaCola();
  C5 = creaCola();
  Pila *P1, *P2, *P3, *P4, *P5;
  P1 = creaPila();
  P2 = creaPila();
  P3 = creaPila();
  P4 = creaPila();
  P5 = creaPila();
  char polola1[100], polola2[100], polola3[100],
  polola4[100], polola5[100];
  int i;
  printf("Ingrese nombre: ");
  scanf("%s", polola1);
  /*printf("Ingrese nombre: ");
  scanf("%s", polola2);
  printf("Ingrese nombre: ");
  scanf("%s", polola3);
  printf("Ingrese nombre: ");
  scanf("%s", polola4);
  printf("Ingrese nombre: ");
  scanf("%s", polola5);*/
  for(i=0;i<strlen(polola1);i++)
  {
   insertar(L1, polola1[i]); 
  }
  /*for(i=0;i<strlen(polola2);i++)
  {
   insertar(L2, polola2[i]); 
  }
  for(i=0;i<strlen(polola3);i++)
  {
   insertar(L3, polola3[i]); 
  }
  for(i=0;i<strlen(polola4);i++)
  {
   insertar(L4, polola4[i]); 
  }
  for(i=0;i<strlen(polola5);i++)
  {
   insertar(L5, polola5[i]); 
  }*/
 
  return 0;
}

Aquí va el programa.h:
Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
 
typedef struct info {
  int dato1;
  /* int dato2; */
  /* ... */
}Info;

 
typedef struct nodo {
  Info *datos;
  struct nodo *siguiente;
  struct nodo *anterior;
}Nodo;

 
typedef struct lista {
  Nodo *inicio;
  Nodo *fin;
  int tamano;
}Lista;


/* Funciones de las operaciones básicas*/
Lista *crearLista();
Nodo *crearNodo(Info *dato, Nodo *anterior, Nodo *siguiente);
Info * agregar(int dato1);
bool insertar(Lista *plista, char info);;

Realmente no sé cómo se insertan varios nombres en una sola lista... :/ solo logre insertar en una lista todos los carácteres de un nombre pero eso no es válido :( Y no solo eso me piden, ya que también me piden ingresar nombres en pilas y colas :/ ayuda por favor !
« Última modificación: 26 de Abril 2014, 01:03 por madness »

madness

  • Sin experiencia
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #5 en: 26 de Abril 2014, 05:30 »
Que tal ! Finalmente pude lograrlo ! después de unas horas modificando el código resultó :D. Cuando termine el plazo para entregar mi tarea la subiré por acá, ya que es posible que mis compañeros de Universidad pueden caer en esta página y me copian todo! jajaja xD. Saludos!

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #6 en: 26 de Abril 2014, 08:59 »
Si puedes subir el código te lo agradecemos, así aprendemos todos con las aportaciones. Saludos,
Responsable de departamento de producción aprenderaprogramar.com

madness

  • Sin experiencia
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #7 en: 26 de Abril 2014, 19:27 »
Pero por supuesto ! lo que pasa esque no quiero que me copien mis compañeros después de mucho esfuerzo ! pero a penas termine el plazo lo subo por acá :D ! Saludos!

madness

  • Sin experiencia
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #8 en: 07 de Mayo 2014, 23:47 »
Como prometí, aquí les traigo el código para insertar nombres en una lista, es decir, en cada nodo insertaremos un nombre:

Código: [Seleccionar]
#include "lista.h"


Lista *creaLista()
{
  Lista *nuevo;

  if(nuevo = (Lista *) malloc(sizeof(Lista))) // Pide memoria para la lista
    {
      nuevo->tamano = 0; // Lista vacía
      nuevo->inicio = nuevo->fin = NULL; // Inicio y Fin apuntan a NULL
    }
  return nuevo;
}


Nodo *crearNodoCola(Info *dato, Nodo *ptro)
{
  Nodo *nuevo;
  if(nuevo = (Nodo *) malloc(sizeof(Nodo))) // Pide memoria para el nodo
    {
      nuevo->datos = dato;
      nuevo->siguiente = ptro;
    }
  return nuevo;
}


Nodo *crearNodo(Info *dato, Nodo *anterior, Nodo *siguiente)
{
  Nodo *nuevo;
  if(nuevo = (Nodo *) malloc(sizeof(Nodo)))
    {
      nuevo->datos = dato;
      nuevo->anterior = anterior;
      nuevo->siguiente = siguiente;
    }
  return nuevo;
}


Info *agregar(char *dato1)
{
  Info *pdato;
  if(pdato = (Info *) malloc(sizeof(Info))){
      pdato->dato1 = dato1;
      return pdato;
  }else{
      printf("problemas en la inserción\n");
      exit(0);
  }
}

void ingresar(Info **pdato, char *dato1)
{
  if(*pdato = (Info *) malloc(sizeof(Info)))
    {
      (*pdato)->dato1 = dato1;
    }
  else
    {
      printf("problemas en el push\n");
      exit(0);
    }
}

bool insertar(Lista *plista, char *nombre)
{
Nodo *aux;
Info *dato = agregar(nombre);
  if(aux = crearNodo(dato, NULL, plista->inicio)){
      if(plista->tamano == 0)
        plista->fin = aux;
      else
        plista->inicio->anterior = aux;
      plista->inicio = aux;
      plista->tamano++;

      return true;
    }
  else
    return false;
}

void recorrer(Lista *plista)
{
  Nodo *i;
  i = plista->inicio;
  printf("La lista tiene = ");
  while(i != NULL)
    {
      printf("%s ", i->datos->dato1);
      i = i->siguiente;
    }
  printf("\n");
}


int main(int argc, char *argv[])
{
  Lista *nombres;
  nombres = creaLista();
 
  char n1[100]="Nicole", n2[100]="Sandra", n3[100]="Javiera", n4[100]="Camila", n5[100]="Johana";
 
  insertar(nombres, n1);
  insertar(nombres, n2);
  insertar(nombres, n3);
  insertar(nombres, n4);
  insertar(nombres, n5);
  recorrer(nombres);

  return 0;
}

A continuación lista.h

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

 
typedef struct{
  char* dato1;
}Info;
 
typedef struct nodo {
  Info *datos;
  struct nodo *siguiente;
  struct nodo *anterior;
}Nodo;

 
typedef struct lista {
  Nodo *inicio;
  Nodo *fin;
  int tamano;
}Lista;


Lista *crearLista();
Nodo *crearNodo(Info *dato, Nodo *anterior, Nodo *siguiente);
void destruirLista(Lista *plista);
bool insertar(Lista *plista, char *nombre);
void recorrer(Lista *plista);

Espero que les sirva :). Ahora voy por árboles binarios xD. Saludos :)
« Última modificación: 07 de Mayo 2014, 23:50 por madness »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Programacion en C - Listas Simplemente enlazadas
« Respuesta #9 en: 08 de Mayo 2014, 22:41 »
Gracias por acordarte! Si estás con árboles binarios supongo que los generas con recursión... interesante pero complicado! Saludos ;)
Responsable de departamento de producción aprenderaprogramar.com

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".