1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

array e lista ligada ( linguagem C )

Discussão em 'Programação' iniciada por luismsantana, 25 de Agosto de 2012. (Respostas: 13; Visualizações: 1587)

  1. boa tarde

    estou com uma duvida aqui no meu projecto ...

    o que eu quero é criar uma lista ligada e, de cada vez que o jogador faz uma jogada, armazenar num array, que é alterado a cada jogada, e, a cada jogada, "copiá-lo" para a lista ligada fazendo um novo nó ... eu faço isso, na minha cabeça está bem, simplesmente da erro ...

    se conseguirem me dar uma ajudinha, agradeço [​IMG]

    Código:
    typedef struct jgd jog, *jogad;
    
    typedef struct jogadores{
        char nome1[10];
        char nome2[10];
    }jogador;
    
    struct jgd{
        int *tab;
        jogad prox;
    };
    
    typedef struct
    {
            int n_jogadas;
            int * valores;
            int n_linhas;
            int n_colunas;
    } Matrix;
    
    jogad jogar(jogad p,Matrix dim,jogador jog, Matrix *matrix)
    {
        int j,i,op,jogd,pedra;
        jogad aux;
    
        for(jogd=0;jogd<2;jogd++)
        {
            if(jogd==1)
                printf("Vez do Jogador %s\n\n",jog.nome1);
            else
                printf("Vez do Jogador %s\n\n",jog.nome2);
    
            do{
                for(i=0,j=0;i<dim.n_linhas*dim.n_colunas;i++,j++){
                    if(j==dim.n_colunas){
                        printf("\n\n");
                        j=0;
                    }
                printf("%d\t",matrix->valores[i]);
                }
                printf("o que pretende fazer?\n");
                printf("1- colocar pedra\n");
                printf("2- mover peca\n");
                printf("3- inserir linha ou coluna\n");
                printf("4- voltar atras\n");
                printf("\nopcao:");
                scanf("%d",&op);
            
                switch(op)
                {
                case 1: pedra=verifica_pedras(matrix);
                        if(pedra==1)
                            p=coloca_pedra(p,dim,matrix);
                        else{
                            printf("Nao pode colocar mais pedras!\n");
                            break;
                        }
                case 2:mover_peca(); break;
                case 3:break;
                case 4:return 0;
                }
            }while(1);
        }
                
        return p;
    }
    
    jogad coloca_pedra(jogad p, Matrix d, Matrix *mat)
    {
        int  i, linha, coluna,celula;
        jogad novo=(jogad) malloc(sizeof(jog)), aux;
    
        novo->tab=malloc(sizeof(Matrix)*mat->n_colunas*mat->n_linhas);
    
        if(novo==NULL){
            printf("nao foi possivel!\n");
            return p;
        }
        else{
    
        do{
            printf("onde pretende colocar a pedra?\n");
            printf("ATENCAO: a pedra é representada pelo numero 9!\n");
            printf("linha: "); scanf("%d",&linha);
            printf("coluna: "); scanf("%d",&coluna);
            
            celula=linha*d.n_colunas+coluna;
    
            if(mat->valores[celula]==0){
                mat->valores[celula]=9;
                printf("\n\n");
                printf("adicionou!\n");
                break;
            }
            else
                printf("tem de escolher outra posicao!\n");
        }while(1);
    
        
    
        for(i=0;i<d.n_linhas*d.n_colunas;i++)
                novo->tab[i]=mat->valores[i];
            novo->prox=NULL;
    
        if(p==NULL)
            p=novo;
        else
        {
            aux=p;
            while(aux->prox!=NULL)
                aux=aux->prox;
            aux->prox=novo;
        }
        }
        
        return p;
    
    }
    
    
    o ponteiro para a lista está inicializado na main a NULL.

    abraços [​IMG]
     
  2. nym-ph

    nym-ph Power Member

    Que erro te dá, e onde?

    Podes colocar o código completo?
     
  3. nao da erro de compilação, só warnings ... o executavel deixa de funcionar quando vai inserir os numeros no array da lista ...

    o codigo é um bocado grande xD é um jogo ..
    Código:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    
    typedef struct jgd jog, *jogad;
    
    typedef struct jogadores{
        char nome1[10];
        char nome2[10];
    }jogador;
    
    struct jgd{
        int *tab;
        jogad prox;
    };
    
    typedef struct
    {
            int n_jogadas;
            int * valores;
            int n_linhas;
            int n_colunas;
    } Matrix;
    
    jogad nova_jogada(jogad p, Matrix *a)
    {
        int i;
        jogad novo=(jogad) malloc(sizeof(jog)),aux;
    
        if(novo == NULL)
        {
            printf("Erro na alocacao de memoria\n");
            return p;
        }
    
        for(i=0;i<a->n_linhas*a->n_colunas;i++)
            novo->tab[i]=a->valores[i];
        novo->prox=NULL;
    
        if(p==NULL)
            p=novo;
        else
        { 
            aux=p;
            while(aux!=NULL)
                aux=aux->prox;
            aux->prox=novo;
        }
    
        return p;
    }
    
    void mostra_tabuleiro(jogad p, Matrix d)
    {
        int i,j;
        jogad aux=NULL;
    
        while(p!=NULL)
        {
            aux=p;
            p=p->prox;
        }
    
        for(i=0;i<d.n_linhas;i++){
            for(j=0;j<d.n_colunas;j++)
                printf("%c\t",aux->tab[i*d.n_linhas+j]);
            printf("\n\n");
        }
    }
    
    jogad direciona_ponteiro(jogad p)
    {
        jogad aux=p,anterior=NULL;
    
        while(p!=NULL)
        {
            anterior=aux;
            aux=aux->prox;
        }
    
        return anterior;
    }
    
    jogad coloca_pedra(jogad p, Matrix d, Matrix *mat)
    {
        int  i, linha, coluna,celula;
        jogad novo=(jogad) malloc(sizeof(jog)), aux;
    
        novo->tab=malloc(sizeof(Matrix)*mat->n_colunas*mat->n_linhas);
    
        if(novo==NULL){
            printf("nao foi possivel!\n");
            return p;
        }
        else{
    
        do{
            printf("onde pretende colocar a pedra?\n");
            printf("ATENCAO: a pedra é representada pelo numero 9!\n");
            printf("linha: "); scanf("%d",&linha);
            printf("coluna: "); scanf("%d",&coluna);
            
            celula=linha*d.n_colunas+coluna;
    
            if(mat->valores[celula]==0){
                mat->valores[celula]=9;
                printf("\n\n");
                printf("adicionou!\n");
                break;
            }
            else
                printf("tem de escolher outra posicao!\n");
        }while(1);
    
        
    
        for(i=0;i<d.n_linhas*d.n_colunas;i++)
                novo->tab[i]=mat->valores[i];
            novo->prox=NULL;
    
        if(p==NULL)
            p=novo;
        else
        {
            aux=p;
            while(aux->prox!=NULL)
                aux=aux->prox;
            aux->prox=novo;
        }
        }
        
        return p;
    
    }
    
    int    verifica_pedras(Matrix *r)
    {
        int i,cont=0,maximo;
        for(i=0;i<r->n_linhas*r->n_colunas;i++)
        {
            if(r->valores[i]==9)
                cont++;
        }
    
        if(cont>(r->n_linhas*r->n_colunas)*0.10)
            return 0;
        else
            return 1;
    }
    
    jogad mover_peca()
    {
    
    }
    
    jogad jogar(jogad p,Matrix dim,jogador jog, Matrix *matrix)
    {
        int j,i,op,jogd,pedra;
        jogad aux;
    
        for(jogd=0;jogd<2;jogd++)
        {
            if(jogd==1)
                printf("Vez do Jogador %s\n\n",jog.nome1);
            else
                printf("Vez do Jogador %s\n\n",jog.nome2);
    
            do{
                for(i=0,j=0;i<dim.n_linhas*dim.n_colunas;i++,j++){
                    if(j==dim.n_colunas){
                        printf("\n\n");
                        j=0;
                    }
                printf("%d\t",matrix->valores[i]);
                }
                printf("o que pretende fazer?\n");
                printf("1- colocar pedra\n");
                printf("2- mover peca\n");
                printf("3- inserir linha ou coluna\n");
                printf("4- voltar atras\n");
                printf("\nopcao:");
                scanf("%d",&op);
            
                switch(op)
                {
                case 1: pedra=verifica_pedras(matrix);
                        if(pedra==1)
                            p=coloca_pedra(p,dim,matrix);
                        else{
                            printf("Nao pode colocar mais pedras!\n");
                            break;
                        }
                case 2:mover_peca(); break;
                case 3:break;
                case 4:return 0;
                }
            }while(1);
        }
                
        return p;
    }
    
    
    Matrix * matrixCriar(int n_linhas, int n_colunas)
    {
            Matrix  *m = NULL;
    
            /* validar argumentos */
            if (n_linhas < 1 || n_colunas < 1)
                    return NULL;
    
            /* alocar memória para a matrix
             * (Nota : este cast foi porque testei no compilador de c++) */
            if ((m = (Matrix *)malloc(sizeof(Matrix))) == NULL)
                    return NULL;
    
            /* alocar memória para guardar as células da matrix
             * (Nota : este cast foi porque testei no compilador de c++) */
            if ((m->valores = (int *)calloc(n_linhas * n_colunas, sizeof(int))) == NULL)
            {
                    free(m);
                    return NULL;
            }
    
            /* inicializar os dados da matrix */
            m->n_linhas = n_linhas;
            m->n_colunas = n_colunas;
    
            return m;
    }
    
    jogad primeiro_no(jogad p,Matrix *m)
    {
        int i;
        jogad novo=(jogad) malloc(sizeof(jog));
    
        novo->tab=malloc(sizeof(Matrix)*m->n_colunas*m->n_linhas);
    
        for(i=0;i<m->n_colunas*m->n_linhas;i++)
            novo->tab[i]=m->valores[i];
        novo->prox;
    
        if(p==NULL)
            p=novo;
    
        return p;
    }
    
    void inicializa_valores(Matrix *matriz)
    {
        int i,j;
    
        for(i=0;i<matriz->n_colunas*matriz->n_linhas;i++)
            matriz->valores[i]=0;
        
        matriz->valores[10]=1;
        matriz->valores[2]=1;
        matriz->valores[6]=1;
        matriz->valores[3]=2;
        matriz->valores[7]=2;
        matriz->valores[11]=2;
    }
    
    jogador nome_jogadores()
    {
        jogador jogado;
    
        printf("nome do jogador 1:");
        scanf("%s",&jogado.nome1);
        printf("nome do jogador 2:");
        scanf("%s",&jogado.nome2);
    
        return jogado;
    }
    
    Matrix numero_celulas(jogador t)
    {
        int l1, l2, c1, c2, i, j, linha, j1,j2;
        Matrix dim;
    
        do{
            printf("jogador %s\nintroduza o numero de linhas que pretende:",t.nome1); scanf("%d",&dim.n_linhas);
            do{
                printf("jogador %s\nintroduza o numero de linhas que pretende:",t.nome2); scanf("%d",&l2);
            }while(l2!=dim.n_linhas);
    
            printf("jogador %s\nintroduza o numero de colunas que pretende:",t.nome1); scanf("%d",&dim.n_colunas);
            do{
                printf("jogador %s\nintroduza o numero de colunas que pretende:",t.nome2); scanf("%d",&c2);
            }while(c2!=dim.n_colunas);
        }while(dim.n_colunas*dim.n_linhas<12 || dim.n_colunas*dim.n_linhas>25);
        
        printf("jogador 1\nintroduz o numero de jogadas que pretendes:");
        scanf("%d",&j1);
        do{
            printf("jogador 2\nintroduz o numero de jogadas que pretendes:");
            scanf("%d",&j2);
        }while(j2!=j1);
    
        dim.n_jogadas=j2;
    
        return dim;
    }
    
    int main()
    {
        int opcao, jo=0;
        jogad play=NULL;
        jogador jogado;
        Matrix dimensao, *m=NULL;
    
        do{
            puts("1-novo jogo");
            puts("2-retomar jogo anterior");
            puts("3-sair");
            scanf("%d",&opcao);
    
            switch(opcao)
            {
            case 1: jogado=nome_jogadores();
    
                    dimensao=numero_celulas(jogado);
    
                    if ((m = matrixCriar(dimensao.n_linhas, dimensao.n_colunas)) == NULL)
                    {
                        printf("Erro ao criar a matrix\n");
                        return -1;
                    }
                    
                    inicializa_valores(m);
                    play=primeiro_no(play,m);
                    play=jogar(play,dimensao,jogado,m);
                break;
            case 2:; break;
            case 3: return;
            }
        }while(1);
    }
     
  4. nym-ph

    nym-ph Power Member

    hmm, aqui não consigo passar disto ...

    Código:
    [FONT=Menlo][B]1-novo jogo[/B][/FONT]
    [FONT=Menlo][B]2-retomar jogo anterior[/B][/FONT]
    [FONT=Menlo][B]3-sair[/B][/FONT]
    [FONT=Menlo]1[/FONT]
    [FONT=Menlo][B]nome do jogador 1:[/B]Nuno[/FONT]
    [FONT=Menlo][B]nome do jogador 2:[/B]Dias[/FONT]
    [FONT=Menlo][B]jogador Nuno[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de linhas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Dias[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de linhas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Nuno[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de colunas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Dias[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de colunas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Nuno[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de linhas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Dias[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de linhas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Nuno[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de colunas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Dias[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de colunas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Nuno[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de linhas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Dias[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de linhas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Nuno[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de colunas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Dias[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de colunas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Nuno[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de linhas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Dias[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de linhas que pretende:[/B]10[/FONT]
    [FONT=Menlo][B]jogador Nuno[/B][/FONT]
    [FONT=Menlo][B]introduza o numero de colunas que pretende:[/B][/FONT]

    Não me passa daqui...

    E assim por alto, o teu switch, tem um case 2, sem nada. um case 3 a fazer um return, que não retorna nada e sem break. Convém retornares 0/1. e falta-lhe uma cláusula default: break;

    ... vou ver se apanho o que te faz crashar a app


    nota de rodapé, devias corrigir os warnings que tens antes de avançar.
     
    Última edição: 25 de Agosto de 2012
  5. O programa nao passa daí porque as escolhas têm restrições ... as celulas (linhas*colunas) nao podem ser superiores a 25 nem inferiores a 12 ;)

    Código:
    Matrix numero_celulas(jogador t)
    {
        int l1, l2, c1, c2, i, j, linha, j1,j2;
        Matrix dim;
    
        do{
            printf("jogador %s\nintroduza o numero de linhas que pretende:",t.nome1); scanf("%d",&dim.n_linhas);
            do{
                printf("jogador %s\nintroduza o numero de linhas que pretende:",t.nome2); scanf("%d",&l2);
            }while(l2!=dim.n_linhas);
    
            printf("jogador %s\nintroduza o numero de colunas que pretende:",t.nome1); scanf("%d",&dim.n_colunas);
            do{
                printf("jogador %s\nintroduza o numero de colunas que pretende:",t.nome2); scanf("%d",&c2);
            }while(c2!=dim.n_colunas);
        }while(dim.n_colunas*dim.n_linhas<12 || dim.n_colunas*dim.n_linhas>25);
        
        printf("jogador 1\nintroduz o numero de jogadas que pretendes:");
        scanf("%d",&j1);
        do{
            printf("jogador 2\nintroduz o numero de jogadas que pretendes:");
            scanf("%d",&j2);
        }while(j2!=j1);
    
        dim.n_jogadas=j2;
    
        return dim;
    }
     
  6. nym-ph

    nym-ph Power Member

    Ele aqui,

    Código:
    [FONT=Menlo]            [COLOR=#bb2ca2]while[/COLOR](aux->[COLOR=#4f8187]prox[/COLOR]!=[COLOR=#bb2ca2]NULL[/COLOR]) {[/FONT]
    [FONT=Menlo]                aux=aux->[COLOR=#4f8187]prox[/COLOR];[/FONT]
    [FONT=Menlo]            }[/FONT]
    Tenta mexer em memória que não lhe pertence. Dai rebentar ...

    Já fizeste debug a isto? O teu elemento "NOVO" tem apontadores para "prox" que nunca mais acabam!! oO Ao que me parece a lista não está a ser terminada com o prox a NULL.
     
    Última edição: 25 de Agosto de 2012
  7. nao, porque o "novo" tem campo prox a NULL ...
    Código:
    for(i=0;i<d.n_linhas*d.n_colunas;i++)
                novo->tab[i]=mat->valores[i];
            novo->prox=NULL;
    
    e depois tenho o aux, que está a apontar para o ultimo elemento da lista, a apontar para o novo ...

    Código:
    aux=p;
            while(aux->prox!=NULL)
                aux=aux->prox;
            aux->prox=novo;
    
     
  8. nym-ph

    nym-ph Power Member

    Código:
    [FONT=Menlo][COLOR=#4f8187]jogad[/COLOR] primeiro_no([COLOR=#4f8187]jogad[/COLOR] p,[COLOR=#4f8187]Matrix[/COLOR] *m)[/FONT]
    [FONT=Menlo]{[/FONT]
    [FONT=Menlo]    [COLOR=#bb2ca2]int[/COLOR] i;[/FONT]
    [FONT=Menlo]    [COLOR=#4f8187]jogad[/COLOR] novo=([COLOR=#4f8187]jogad[/COLOR]) [COLOR=#3d1d81]malloc[/COLOR]([COLOR=#bb2ca2]sizeof[/COLOR]([COLOR=#4f8187]jog[/COLOR]));[/FONT]
    
    [COLOR=#4F8187][FONT=Menlo][COLOR=#000000]    novo->[/COLOR]tab[COLOR=#000000]=[/COLOR][COLOR=#3d1d81]malloc[/COLOR][COLOR=#000000]([/COLOR][COLOR=#bb2ca2]sizeof[/COLOR][COLOR=#000000]([/COLOR]Matrix[COLOR=#000000])*m->[/COLOR]n_colunas[COLOR=#000000]*m->[/COLOR]n_linhas[COLOR=#000000]);[/COLOR][/FONT][/COLOR]
    
    [FONT=Menlo]    [COLOR=#bb2ca2]for[/COLOR](i=[COLOR=#272ad8]0[/COLOR];i<m->[COLOR=#4f8187]n_colunas[/COLOR]*m->[COLOR=#4f8187]n_linhas[/COLOR];i++)[/FONT]
    [FONT=Menlo]        novo->[COLOR=#4f8187]tab[/COLOR][i]=m->[COLOR=#4f8187]valores[/COLOR][i];[/FONT]
    [FONT=Menlo]    novo->[COLOR=#4f8187]prox[/COLOR];  // <- aqui por exemplo, vê lá se é isso que queres aqui[/FONT]
    
    [FONT=Menlo]    [COLOR=#bb2ca2]if[/COLOR](p==[COLOR=#bb2ca2]NULL[/COLOR])[/FONT]
    [FONT=Menlo]        p=novo;[/FONT]
    
    [FONT=Menlo]    [COLOR=#bb2ca2]return[/COLOR] p;[/FONT]
    [FONT=Menlo]}[/FONT]
    Não resolve, mas saltou-me agora à vista
     
  9. nym-ph

    nym-ph Power Member

    Supõe aí um teste de mesa.

    2 jogadores, ambos com 3 linhas e 5 colunas.

    escolha Colocar pedra, Linha 3, Coluna 5.

    Quantos elementos deverias ter na lista, neste caso? Ou seja, apontadores para prox != NULL.
     
  10. pois nao resolve, mas era um erro que com tanto codigo nunca iria reparar :O obrigado xD

    continua a crashar :\
     
  11. nao percebi ...
     
  12. entretanto ja vi que o problema é mesmo no na avaliação prox!=NULL ... nao percebo pq, foi como eu aprendi a fazer ... enquanto o campo prox do elemento que se está a ler nao for NULL, passa-se para o proximo, senao o ponteiro fica a apontar para o ultimo elemento ... :s

    alguem me consegue ajudar?
     
  13. Boas,


    comecei a ver o teu código e reparei numa coisa, na função:
    jogador nome_jogadores()
    {
    jogador jogado;


    printf("nome do jogador 1:");
    scanf("%s",&jogado.nome1);
    printf("nome do jogador 2:");
    scanf("%s",&jogado.nome2);


    return jogado;
    }

    no scanf deveria ser scanf("%s",jogado.nome); nao tem o operador &!!

    Quanto ao resto vou ver...
    Que problema tens agora?

    Cumps
     
  14. Introduzi 2 jogadores com 5 linhas e 3 colunas, inseri peças e funcionou corretamente..
    Qual é o problema que tens no teu programa? (Resolvi os warnings).

    Cumps
     

Partilhar esta Página