Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: josue_tux en 27 Junio 2011, 23:39 pm



Título: ayuda en listas
Publicado por: josue_tux en 27 Junio 2011, 23:39 pm
hola tengo una consulta como puedo modificar mi programa para que acepte cadenas y no solo un caracter: aqui adjunto mi programa.
Código:
#include <stdio.h>
#include <stdlib.h>
typedef struct nodo
{
   char elemento;
  struct nodo *siguiente;
  struct nodo *anterior;
} NODOLISTA;

typedef NODOLISTA *PtrNodo;
typedef NODOLISTA *Lista;

void insertar(Lista*, char);
void mostrar(Lista);

main()
{
      Lista lista=NULL;
      insertar(&lista,'Juan');
      insertar(&lista,'Homero');
           
      mostrar(lista);
      getchar();
      return 0;
}

void insertar(Lista *lista, char nombre)
{
   PtrNodo nuevo, actual;
   nuevo = (PtrNodo)malloc(sizeof(NODOLISTA));
   nuevo->elemento = nombre;
   actual = *lista;
   if(actual)
     {
         while(actual->anterior)
              {
                actual = actual->anterior;
              }
     }
   if(!actual || actual->elemento > nombre)
     {
        nuevo->siguiente = actual;
        nuevo->anterior = NULL;
        if(actual)
          {
            actual->anterior = nuevo;
          }
        if(!*lista)
          {
            *lista = nuevo;
          }
     }
   else
      {
         while(actual->siguiente &&actual->siguiente->elemento <= nombre)
              {
                 actual = actual->siguiente;
              }
         nuevo->siguiente= actual->siguiente;
         actual->siguiente = nuevo;
         nuevo->anterior = actual;
         if(nuevo->siguiente)
           {
         nuevo->siguiente->anterior = nuevo;
      }
   }
}

void mostrar(Lista lista)
{
  PtrNodo nodo = lista;
  if(!lista)
    {
      printf("\"La Lista esta Vacia\"");
    }
  else
     {
         while(nodo->anterior)
              {
                 nodo = nodo->anterior;
              }
         while(nodo)
              {
                 printf("-> %s", nodo->elemento);
                 nodo = nodo->siguiente;
              }

     }   
  printf("\n");
}



o alguien no tiene alguna funcion de insertar de una lista de la siguiente forma
insertar(lista,'juan');


Título: Re: ayuda en listas
Publicado por: leogtz en 28 Junio 2011, 01:00 am
Aquí te dejo un ejemplo que acabo de hacer. Fijate en el puntero a char. Debes de asignarle memoria a la cadena.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct lista
  6. {
  7.    char *cadena;
  8.    struct lista *sig;
  9. };
  10.  
  11. struct lista *new(void)
  12. {
  13.    return malloc(sizeof(struct lista));
  14. }
  15.  
  16. void liberar(struct lista **inicio)
  17. {
  18.    struct lista *aux = *inicio;
  19.    while(*inicio != NULL)
  20.    {
  21.        struct lista *nuevo = new();
  22.        nuevo = *inicio;
  23.        *inicio = (*inicio)->sig;
  24.        free(nuevo->cadena);
  25.        free(nuevo);
  26.    }
  27. }
  28.  
  29. void insertar(struct lista **inicio, char *s)
  30. {
  31.    struct lista *nuevo = new();
  32.  
  33.    /* Asignamos espacio a la cadena */
  34.    nuevo->cadena = malloc(sizeof(char) * 100);
  35.    strncpy(nuevo->cadena, s, strlen(s));
  36.  
  37.    nuevo->sig = *inicio;
  38.    *inicio = nuevo;
  39. }
  40.  
  41. void ver(struct lista *l)
  42. {
  43.    struct lista *aux = l;
  44.    while(aux != NULL)
  45.    {
  46.        puts(aux->cadena);
  47.        aux = aux->sig;
  48.    }
  49. }
  50.  
  51. int main(void)
  52. {
  53.    /* Creamos nuestra lista, inicialmente vacia */
  54.    struct lista *inicio = NULL;
  55.    insertar(&inicio, "Leo");
  56.    insertar(&inicio, "Lala");
  57.    insertar(&inicio, "Hola");
  58.    insertar(&inicio, "Mundo");
  59.  
  60.    ver(inicio);
  61.  
  62.    /* Liberamos la memoria ocupada tanto de los nodos como de las cadenas */
  63.    liberar(&inicio);
  64.    ver(inicio);
  65.  
  66. return EXIT_SUCCESS;
  67. }
  68.  

Otra cosa, utiliza el GeShi del foro para resaltar el código.