ayuda con colas en c/c++

Iniciado por alci06, 29 Mayo 2011, 22:23 PM

0 Miembros y 2 Visitantes están viendo este tema.

alci06

miren este es el codigo lo q no logro es q a la hora d imprimir los productos no salen todos nama sale el ultimo q ingrese segun yo es en ciclo for
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct nodo
{
char nome[30];
char empleado[30];
char empresa[30];
char prov[30];
char empprov[30];
char rfcpr[20];
char rfc[20];
char produ[30];
char dian[20];
int preci;
long int clave;
int prod;
long int debo;
int long inven;
struct nodo *siguiente;
};

typedef struct nodo NODO;
typedef NODO*NODOSIG;

void altemple(NODOSIG*,char[30],long int);
void mostrar_alta(NODOSIG*);
void empresa(NODOSIG*,char[30],int);
void mostrar_empresa(NODOSIG*);
void factura(NODOSIG*,char[30],char[20],char[20]);
void mostrar_factura(NODOSIG*);
void proveedor(NODOSIG*,char[30],char[30],char[20]);
void mostrar_provedor(NODOSIG*);
void producto(NODOSIG*,char[30],int,int,int);
void mostrar_producto(NODOSIG*,int);
void invetario(NODOSIG*);
void devol(NODOSIG*);

int main ()
{
    char nom[30],nomemp[30],RFC[20],dia[20];
    char nompr[30],emppr[30],RFCp[20],nomprd[30];
    long int clav,clav2;
    int op,arti,i,np,precio;
    NODOSIG cola=NULL;
    system("cls");
    printf("\n\t introduzca el nombre de la empresa: ");
    _flushall();
    gets(nomemp);
    printf("\n\t introduzca el rfc de la empresa: ");
    _flushall();
    gets(RFC);
    printf("\n\t introduzca el dia: ");
    _flushall();
    gets(dia);
    system("cls");
    factura(&cola,nomemp,RFC,dia);
    mostrar_factura(&cola);
    getch ();
    do
    {
      system("cls");
      printf("\n\t eliga una opccion del menu");
      printf("\n\t\t 1.-proveedor\n\t\t 2.-empleado\n\t\t 3.-inventario\n\t\t 4.-devoluciones");
      printf("\n\t que opcion desea:");
      scanf("%d",&op);
      switch(op)
       {
         case 1:
                   system("cls");
                   _flushall();
                   printf("\n\t proveedor");
                   printf("\n\t nombre del proveedor: ");
                    _flushall();
                   gets(nompr);
                   printf("\n\t nombre de la empresa del proveedor: ");
                   _flushall();
                   gets(emppr);
                   printf("\n\t rfc de la empresa del proveedor: ");
                   _flushall();
                   gets(RFCp);
                   proveedor(&cola,nompr,emppr,RFCp);
                   mostrar_provedor(&cola);
                   printf("\n\t cuantos atriculos se van a registrar: ");
                   scanf("%d",&arti);
                   for(i=0;i<arti;i++)
                    {
                       
                       system("cls");                 
                       printf("\n\t nombre del producto %d: ",i+1);
                       _flushall();
                       gets(nomprd);
                       printf("\n\t cantidad de producto %d: ",i+1);
                       scanf("%d",&np);
                       printf("\n\t precio del producto %d: ",i+1);
                       scanf("%d",&precio);
                       producto(&cola,nomprd,np,precio,arti);
                    }
                   mostrar_producto(&cola,arti);
                  getch();
         break;
         
         case 2:
                 system("cls");
                 printf("\n introduzca su nombre: ");
                 _flushall();
                 gets(nom);
                 printf("\n introduzca una clave: ");
                 scanf("\n%ld",&clav);
                 altemple(&cola, nom , clav);
                 mostrar_alta(&cola);
                 getch ();         
         break;
             
         case 3:
                 printf("\n\t para acceder al inventario necesita estar dado de alta");
                 printf("\n\t introduzca su clave: ");
                 scanf("%ld",clav2);
                 if (clav == clav2)
                   {
                     mostrar_producto(&cola,arti);
                     getch ();
                   }
                 else
                 {
                   printf("\n\t clave incorrecta presione cualquier tecla para volver al menu de inicio"); 
                   getch ();
                  } 
         break;         
                 }
         }while (op != 4);
         getch ();
            return 0;         
}   

void altemple(NODOSIG*cola,char nom[30], long int clav)
{
  NODOSIG nuevo,actual,previo;
  actual=*cola;
  nuevo = new(nodo);
  if (nuevo != NULL)
  {
   strcpy(nuevo->nome,nom);
   nuevo->clave = clav;
   nuevo->siguiente = NULL;
   nuevo -> siguiente = *cola;
   *cola = nuevo;
  }
}   


void producto(NODOSIG*cola,char nomprd[30],int np,int precio,int arti)
{   
NODOSIG nuevo,actual,previo;
actual=*cola;
nuevo = new(nodo);
if (nuevo != NULL)
   {
    strcpy(nuevo->produ,nomprd);
    nuevo->prod = np;
    nuevo->preci = precio;
    nuevo->siguiente = NULL;
    nuevo -> siguiente = *cola;
    *cola = nuevo;
   }

}

void proveedor(NODOSIG*cola,char nompr[50],char emppr[50],char RFCp[50])
{
   NODOSIG nuevo,actual,previo;
  actual=*cola;
  nuevo = new(nodo);
  if (nuevo != NULL)
  {
   strcpy(nuevo->prov,nompr);
   strcpy(nuevo->empprov,emppr);
   strcpy(nuevo->rfcpr,RFCp);
   nuevo->siguiente = NULL;
   nuevo -> siguiente = *cola;
   *cola = nuevo;
  }
}   
     

void factura(NODOSIG*cola,char nomemp[30],char RFC[30],char dia[20])
{
  NODOSIG nuevo,actual,previo;
  actual=*cola;
  nuevo = new(nodo);
  if (nuevo != NULL)
  {
   strcpy(nuevo->empresa,nomemp);
   strcpy(nuevo->dian,dia);
   strcpy(nuevo->rfc,RFC);
   nuevo->siguiente = NULL;
   nuevo -> siguiente = *cola;
   *cola = nuevo;
  }
}   

void mostrar_alta(NODOSIG* cola)
{
NODOSIG actual=*cola;
printf("\n-nombre: %s\n clave: %ld",actual->nome,actual->clave);
}

void mostrar_provedor(NODOSIG* cola)
{
NODOSIG actual=*cola;
printf("\n\tnombre del proveedor: %s",actual->prov);
printf("\n\t empresa del proveedor: %s",actual->empprov);
printf("\n\t RFC del proveedor: %s",actual->rfcpr);
}

void mostrar_producto(NODOSIG* cola,int arti)
{
int i; 
for(i=0;i<arti;i++)
{
  NODOSIG actual=*cola;
  printf("\n\t nombre del producto: %s\n\t cantidad del producto: %d\n\t precio del producto: %d",
               actual->produ,actual->prod,actual->preci);
}
}


         
void mostrar_factura(NODOSIG* cola)
{
NODOSIG actual=*cola;
printf("\n\t dia: %s",actual->dian);
printf("\n\t nombre de la empresa: %s",actual->empresa);
printf("\n\t RFC: %s",actual->rfc);
}

Akai

#1
Tu problema es que no avanzas el puntero que recorre la cola y por otro lado, aprecio problemas con punteros.

Tu código:
void mostrar_producto(NODOSIG* cola,int arti)
{
int i;
for(i=0;i<arti;i++)
{
 NODOSIG actual=*cola;
 printf("\n\t nombre del producto: %s\n\t cantidad del producto: %d\n\t precio del producto: %d",
              actual->produ,actual->prod,actual->preci);
}
}


Una aproximación que mantiene la mayor parte de tu código:

void mostrar_producto(NODOSIG* cola,int arti)
{
int i;
NODOSIG *actual=cola;
for(i=0;i<arti;i++)
{
 printf("\n\t nombre del producto: %s\n\t cantidad del producto: %d\n\t precio del producto: %d",
              actual->produ,actual->prod,actual->preci);
actual=actual->siguiente;
}
}


Cambiar el tipo de "actual" de NODOSIG a NODOSIG* evita que tengas que cambiar todo "actual->" por "actual." (actual punto) para acceder a los campos, ya que NO sería un puntero.

alci06

amigo ia lo ise asi como m dijiste y m salen errores m dice q no sta validado produ, prod, preci en mostrar_producto

Akai

Fallo mío, no me había leído el código completo y tienes un typedef que "rompe" las referencias.


void mostrar_producto(NODOSIG* cola,int arti)
{
int i;
NODOSIG actual=*cola;
for(i=0;i<arti;i++)
{
 
  printf("\n\t nombre del producto: %s\n\t cantidad del producto: %d\n\t precio del producto: %d",
               actual->produ,actual->prod,actual->preci);
actual=actual->siguiente;
}
}

alci06

ia lo ise amigo y m imprime lo ultimo q ingrese namas q imprime el numero de veces del ciclo