Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dany haster en 19 Noviembre 2013, 04:54 am



Título: piladinamica caracteres
Publicado por: dany haster en 19 Noviembre 2013, 04:54 am
hola necesito que alguien me diga en donde estoy mal en este programa lo corre pero no em lee las cadenas de ante mano gracias =)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <string>
#include<conio.h>
#define n 20
using namespace std;

typedef struct nodo
{
    string dat[n];
    struct nodo *p;
}nod;
nod *tope=NULL;

void push(string ndat)
{
     nod *nvo;
     nvo=new nod;
     nvo->dat[n]=ndat;
     if(tope==NULL)
     nvo->p=NULL;
     else
     {
         nvo->p=tope;
     }
     tope=nvo;
}
void pop()
{
     nod *aux=tope;
     if(tope==NULL)
     {
                   cout<<"\n La pila esta vacia\n";
                   system("pause");
                   return;
     }
     tope=aux->p;
     cout<<"\n Sale: "<<aux->dat<<endl;
     system("pause");
     delete(aux);
}

void imprimepila()
{
     nod *aux=tope;
     if(tope==NULL)
     {
                   cout<<"\n La pila esta vacia\n";
                   system("pause");
                   return;
     }
     while(aux!=NULL)
     {
                 cout<<aux->dat<<endl;
                 aux=aux->p;
     }
     cout<<endl;
     system("pause");
}

void busca(string bus)
{
     nod *aux=tope;
     int contador=0;
     if(tope==NULL)
     {
                   cout<<"\n La pila esta vacia\n";
                   system("pause");
                   return;
     }
     while(aux!= NULL)
     {
                 
                 if(aux->dat[n]==bus)
                 {
                      cout<<"\nDato encontrado en la posicion: "<<contador<<endl;
                      system("pause");
                      return;
                 }
                 aux=aux->p;  contador++;
     }
     cout<<"\nEl "<<bus<<" no esta en la pila.\n";
}

void ultima()
{
     nod *aux=tope;
     if(tope==NULL)
     {
                   cout<<"\n La pila esta vacia\n";
                   system("pause");
                   return;
     }
      while(aux->p!= NULL)
      {
                  aux=aux->p;
      }
      cout<<"\nEl dato que esta en el fondo de la pila es: "<<aux->dat<<endl;;
      system("pause");
}

void primero()
{
     if(tope==NULL)
     {
                   cout<<"\n La pila esta vacia\n";
                   system("pause");
                   return;
     }
     cout<<tope->dat<<endl;
}

void numelemento(string bus)
{
     nod *aux=tope;
     int contador=0;
     if(tope==NULL)
     {
                   cout<<"\n La pila esta vacia\n";
                   system("pause");
                   return;
     }
     while(aux!= NULL)
     {
          contador++;
          aux=aux->p;
     }
     cout<<"\nLa pila tiene: "<<contador<<" elementos";
}

void elimina()
{
     nod *aux=tope;
     int contador=0;
     if(tope==NULL)
     {
                   cout<<"\n La pila esta vacia\n";
                   system("pause");
                   return;
     }
     while(aux!= NULL)
     {
          aux=aux->p;
          pop();
     }
     cout<<"\n La pila esta vacia\n";
}

main()
{
      int opc;
      string dato[n], buscado[n];
      string dat[n];
      cout<<"\nEscoja una opcion: \n";
      do{
          cout<<"\n 1.Insertar en la pila";
          cout<<"\n 2.Sacar de la pila";
          cout<<"\n 3.Imprimir pila";
          cout<<"\n 4.Buscar en la pila";
          cout<<"\n 5.Elemento ubicado en el fondo de la pila";
          cout<<"\n 6.Elemento ubicado al principio de la pila";
          cout<<"\n 7.Numero del elemento en la pila";
          cout<<"\n 8.Eliminar toda la pila";
          cout<<"\n 9.salir\n\n";
          cin>>opc;
         
          switch(opc)
          {
                 case 1:
                      cout<<"\nDato a insertar: ";
                      fflush(stdin);
                      getline(cin,dato[n]);
                      push(dato[n]);
                      system("pause");
                      break;
                 case 2:
                      pop();
                      break;
                 case 3:
                      imprimepila();
                      break;
                 case 4:
                      cout<<"\nDar dato a insertar: ";
                      fflush(stdin);
                      getline(cin,buscado[n]);
                      busca(buscado[n]);
                      break;
                 case 5:
                      ultima();
                      break;
                 case 6:
                      primero();
                      break;
                 case 7:
                      cout<<"\nQue elemento deseas buscar: ";
                      fflush(stdin);
                      getline(cin,dat[n]);
                      numelemento(dat[n]);
                      break;
                 case 8:
                      elimina();
                      break;
                 case 9:
                      cout<<"\nFin del programa. ";
                      system("pause");
                      break;
                 default:
                         cout<<"\nOpcion incorrecta vuelve a intentarlo ";
          }
      }while(opc!=9);
}


Título: Re: piladinamica caracteres
Publicado por: rir3760 en 20 Noviembre 2013, 03:17 am
Lo primero a cambiar son los nombres de los encabezados (los correctos son <cstdio> y <cstdlib>) y no deberías utilizar la biblioteca conio de Borland. Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

En C++ no necesitas de typedef para eliminar el uso de "struct" en una declaración, puedes utilizar sin problemas:
Código
  1. struct nodo { // nodo == etiqueta de la declaracion
  2.   string dat[n];
  3.   struct nodo *p;
  4. }
  5.  
  6. // La declaracion solo requiere la etiqueta
  7. nodo *tope = NULL;

El problema principal se debe a la declaración del nodo:
Código
  1. typedef struct nodo
  2. {
  3.    string dat[n];
  4.    struct nodo *p;
  5. }nod;
  6. nod *tope=NULL;
Con el indicas que cada nodo contendrá un array de cadenas y, al parecer, esa no es la intención. Si se trata de almacenar una cadena por nodo solo necesitas un objeto de tipo "string".

En la función que sigue (la función "push") tratas de asignar con:
Código
  1. nvo->dat[n] = ndat;
Eso no funcionara porque los indices validos para el array son 0 .. n-1, el elemento n no existe.

Y en la función "pop" tratas de imprimir el array:
Código
  1. cout << "\n Sale: " << aux->dat << endl;
Eso no tendrá el efecto indicado, en su lugar imprimirá la dirección del array (funcionaria correctamente si "dat" no fuera un array).

Bueno, primero tienes que corregir esa parte del programa.

Un saludo