Jump to content

array e lista ligada


luismsantana

Recommended Posts

sim, resulta ... mas o programa está a crashar na avaliação do aux->prox!=NULL ... nao consigo perceber pq ...

dêm aí uma olhadela, por favor ...

#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 coloca_pedra(jogad p, Matrix d, Matrix * mat)
{
   int i, linha, coluna, celula;
   jogad novo = (jogad) malloc(sizeof(jog)), aux;
   novo->tab = (jogad) 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("nn");
       printf("adicionou!n");
       break;
       } else
       printf("tem de escolher outra posicao!n");
   } while (1);
   printf("chega aqui 1n");
   memcpy(novo->tab, mat->valores, sizeof(Matrix));
   novo->prox = NULL;
   printf("mete o novo->prox a NULL, checkn");
   aux = p;
   printf("aux=pn");
   while (aux->prox == NULL) {
       printf("...n");
       aux = aux->prox;
       printf("aux=aux->proxn");
   }
   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 %snn", jog.nome1);
   else
       printf("Vez do Jogador %snn", jog.nome2);
   do {
       for (i = 0, j = 0; i < dim.n_linhas * dim.n_colunas; i++, j++) {
       if (j == dim.n_colunas) {
           printf("nn");
           j = 0;
       }
       printf("%dt", matrix->valores[i]);
       }
       printf("o que pretende fazer?n");
       printf("1- colocar pedran");
       printf("2- mover pecan");
       printf("3- inserir linha ou colunan");
       printf("4- voltar atrasn");
       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);
   memcpy(novo->tab, m->valores, sizeof(Matrix));
   printf("primeiro nó da listan");
   if (p == NULL)
   p = novo;
   for (i = 0; i < m->n_colunas * m->n_linhas; i++)
   printf("%d ", m->valores[i]);
   printf("n");
   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 %snintroduza o numero de linhas que pretende:", t.nome1);
   scanf("%d", &dim.n_linhas);
   do {
       printf("jogador %snintroduza o numero de linhas que pretende:", t.nome2);
       scanf("%d", &l2);
   } while (l2 != dim.n_linhas);
   printf("jogador %snintroduza o numero de colunas que pretende:", t.nome1);
   scanf("%d", &dim.n_colunas);
   do {
       printf("jogador %snintroduza 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 1nintroduz o numero de jogadas que pretendes:");
   scanf("%d", &j1);
   do {
   printf("jogador 2nintroduz 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 matrixn");
       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);
}

o programa crasha na função jogad coloca_pedra(jogad p, Matrix d, Matrix *mat), e as funções, de onde vem o ponteiro, são a main, função primeiro_no e função jogar ... postei o programa todo caso tenham curiosidade em ver ... ainda falta muito para o acabar, muito mesmo ..

abração

ps-> o programa está bem indentado, aqui fica assim :\

Link to comment
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.