array e lista ligada ( linguagem C )

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
smile.gif


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
smile.gif
 
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);
}
 
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:
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;
}
 
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:
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;
 
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
 
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.
 
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?
 
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
 
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
 
Back
Topo