Jump to content
pxdc

[Ajuda]- lista ligada de listas ligadas

Recommended Posts

pxdc

Boas tenho um trabalho para fazer, que ainda está no inicio mas para poder avançar tenho que resolver um problema que estou a ter.

O enunciado  é complexo, apenas importa dizer que para já se pretende adicionar um "Cartão", adiciono o 1º sem problemas o problema está na adição do 2º, não consigo adicionar...

Aqui fica a estrutura de dados e respetiva função inserir:

typedef struct tipo2{
        int cdg;
        int quantidade;
        float valor;
        char descricaocompra [60];
        struct tipo2 * seguinte;
        } * Compra;
       
typedef struct tipo1{
        char id[10];
        float saldo;
        char nome[50];
        struct tipo1 * seguinte;
        struct tipo2 * dados;
        } * Cartao;

a função inserir:

    Cartao inserir(Cartao c, char * id, char * nome, float s=500){
           Cartao novo;
           novo=(Cartao)malloc(sizeof(struct tipo1));
          strcpy( novo->id,id);
           novo->saldo=s;
           strcpy(novo->nome,nome);
           
           if(c==NULL){
                            novo->seguinte=novo;
                            return (novo);
                            }
                            else{
                                 novo->seguinte=c->seguinte;
                                 c->seguinte=novo;
                                 return(c);
                                 }
                                 }

e na main tenho:

    int main (int argc, char *argv[]){
       Cartao c = NULL;
       int opcao;
       float s;
       char n[50],id[10];
        menu();
    scanf("%d",&opcao);
      while(opcao!=0)
        {
         switch(opcao)
         {case 1:
       //c = inserir(c, "a""-","Manuel""-",500);
       //c = inserir(c, "b""-","Pedro""-",500);
    //inserir(c, id, n, s);
    //{
                 printf("Codigo?");
                 scanf("%s",&id);
             if (!existe(c,id))
             {printf("Nome?");
              scanf("%s",n);
              printf("Saldo?");
              scanf("%f",&s);
        c=inserir(c, id,n,s);
        }
             else printf("Codigo ja existe!");
       break;
          case 2: listar(c);
                  break;
    case 0: break;
          default: printf("Opcao invalida\n");
         }       
       menu();
       scanf("%d",&opcao);         
      }

      system("PAUSE");   
      return 0;
    }   

Agradeço toda a ajuda possivel pois para avançar tenho mesmo de resolver isto.

Abraços

Share this post


Link to post
Share on other sites
Rui Carlos

Não olhei com muita atenção para o código, mas parece-me que devias ter

if(c==NULL){
  novo->seguinte=NULL;
  return (novo);
}

e não

if(c==NULL){
  novo->seguinte=novo;
  return (novo);
}

Aliás, eu substituiria

if(c==NULL){
  novo->seguinte=novo;
  return (novo);
}
else{
  novo->seguinte=c->seguinte;
  c->seguinte=novo;
  return(c);
}

por

novo->seguinte = c;
return novo;

A menos que tenhas alguma razão para não inserir o novo elemento na cabeça.

Share this post


Link to post
Share on other sites
pxdc

obrigado rui carlos de facto tens razão assim já consegui adicionar mais cartões.

tenho outra dúvida (estou a começar é normal):

agora tenho que listar os cartões por ordem de inserção (toda a informação a eles associada), ou seja supondo que o id 1 da estrutura "Cartao"  é mais antigo e a seguir o mais antigo é o id 2 ...por ai fora.

eu tinha na função listar:

void listar(Cartao c){
     Cartao aux=c;
// Testar se a lista não é vazia
if (c != NULL){
  // Se a lista circular contém somente uma célula
  if (c == c -> seguinte){
         printf("%s""%s""%.3f\n", c->id,c->nome,c->saldo);
  }
  // Senão se a lista circular contém pelo menos duas células
  else 
  do{
       printf("%s""%s""%.3f\n", aux->id,aux->nome,aux->saldo);
   aux = aux->seguinte;
  }
  while(aux !=  NULL);
}
}

o problema é que ao listar ele lista a informação do id 1 e depois o que estiver à cabeça, ou seja, se inserir id1, id2, id3 ele dá-me a informação do id 1, id 3, id 2 e não 1,2,3..

Há alguma maneira de alterar esta função ou a "inserir" acima postada de modo a resolver isto?

Ou terei que criar um array de ids e depois ordena-los e imprimir a informação? Como faço isso?

Share this post


Link to post
Share on other sites
Ziro360

Não percebo muito bem a tua função de listagem mas eu fazia a minha assim:

void listar(Cartao c){
     Cartao aux=c; 
While(aux!=NULL){ // Enquanto não for NULL, isto é enquanto não chegar ao final da lista executa o codigo abaixo.
         printf("%s""%s""%.3f\n", aux->id,aux->nome,aux->saldo); // O teu printf

   aux = aux->seguinte; // o aux fica a apontar para o aux->seguinte
  }
}

Se não funcionar penso que o erro deve estar na função de inserção.

Share this post


Link to post
Share on other sites
pxdc

Não percebo muito bem a tua função de listagem mas eu fazia a minha assim:

void listar(Cartao c){
     Cartao aux=c; 
While(aux!=NULL){ // Enquanto não for NULL, isto é enquanto não chegar ao final da lista executa o codigo abaixo.
         printf("%s""%s""%.3f\n", aux->id,aux->nome,aux->saldo); // O teu printf

   aux = aux->seguinte; // o aux fica a apontar para o aux->seguinte
  }
}

Se não funcionar penso que o erro deve estar na função de inserção.

já consegui resolver não foi pela tua solução mas já consegui. obrigado

Share this post


Link to post
Share on other sites
Nadilson.linux

Eu aconcelho vc a definir bem as tuas estruturas  para puder usar bem a lista, nao hora de inserir  escolher o local

aonde vc quer inserir os seus dados (no principio, no meio, fim)

Share this post


Link to post
Share on other sites
pxdc

obrigado pela ajuda que me têm dado, tenho agora outro problema. Com vêm a estrutura cartão está ligada a outra estrutura chamada compra

typedef struct tipo1{
        char id[10];
        int bi;
        float saldo;
        char nome[50];
        struct tipo1 * seguinte;
        struct tipo2 * dados;
        } * Cartao;

typedef struct tipo2{
        int cdg;
        int quantidade;
        float valor;
        char descricaocompra [60];
        struct tipo2 * seguinte;
        } * Compra;

typedef struct tipo3{
        int codigo;
        char nome[15];
        float preco;
        int stock;
        char descricaoproduto [60];
        struct tipo3 * seguinte;
        } * Artigo;

o meu problema é que eu tenho que ir adicionando (caso exista alguma compra) ao respetivo cartão de cliente

eu fiz assim:

/ Acrescentar nova compra
Cartao novaCompra(Cartao c,char * id, int cdg, int quantidade, float valor, char * descricaocompra)
{Cartao caux;
Compra maux, maux2;
caux = existe(c,id);
if (caux!=NULL) // acontece se id existir
{maux2 = caux->dados;
  if (maux2==NULL)
  {maux = (Compra)malloc(sizeof(struct tipo2));
   maux->cdg=cdg;
   maux->quantidade=quantidade;
   maux->valor=valor;
   strcpy(maux->descricaocompra,descricaocompra);
   maux->seguinte=caux->dados; // (1)
   caux->dados=maux; // (2)
  }
  return(c);
}
else // se id não existir na estrutura 
{caux = (Cartao)malloc(sizeof(struct tipo1)); // nova célula de Tipo1
  maux = (Compra)malloc(sizeof(struct tipo2)); // nova célula de Tipo2
  strcpy(caux->id,id); // (1)
  caux->seguinte=c; // (2)
  caux->dados=maux; // (3)
  maux->cdg=cdg; // (4)
  maux->quantidade=quantidade; // (5)
  maux->valor=valor;// (6)
   strcpy(maux->descricaocompra,descricaocompra);// (7)
  maux->seguinte=NULL; // (8)
  return(caux);
}
}

acho que esta parte está certa. eu queria saber como é que posso ir descontando ao saldo inicial o valor de cada compra (preço dos artigos comprados) e ir decontando no stock dos artigos o numero de artigos comprados.

Será que me expliquei bem?

agradeço qualquer ajuda, qualquer dúvida perguntem.

Cumprimentos

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.