Ir para o conteúdo
gaspar1423

Lista de caracteres

Mensagens Recomendadas

gaspar1423

Boas,

tenho de criar uma lista de caracteres para representar uma sopa de letras (3x3) e tenho uma duvida de como fazer a estrutura.

Tenho duas ideias e queria a vossa opinião qual é a melhor e se possível me ajudarem a inicializa-la.

Um hipotese é criar um lista em que o primeiro elemento, o 3º, o 7º e o 9º (cantos) têm 3 ligações, o 4º (elemento do meio) tem 8 ligações e os restantes (limites) têm 5.

seria algo assim:

|A|->|B|->|D|->|E|

|B|->|A|->|D|->|E|->|C|->|F|

|C|->|B|->|F|->|E|

|D|->|A|->|B|->|E|->|H|->|G|

|E|->|A|->|B|->|C|->|D|->|F|->|G|->|H|->|I|

...

OU

cada no da lista tem o caracter em, e os 8 apontadores. Caso seja o do canto superior direito, o campo dos apontadores para SUL, ESTE e SUDESTE aponta para os respectivos caracteres.

c N NO E SE S SO O NO

| |->|A| \ | \ | * | * | * | \ | \ | \ |

| |->|B| \ | \ | * | * | * | * | * | \ |

...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Sugestão: não compliques. Usa um array de arrays.

char sopadeletras[3][3];

Editado por pmg
Falta LP

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gaspar1423

E como faço as ligações entre os caracteres? e que depois ao pesquisar as palavras ele tem de percorrer a lista toda e ver s a palavra existe com os caracteres da lista.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Se tentares fazer um esquema complicado, ainda te queimas. Se fizesres um array de arrays, terás no máximo 2 ciclos for de vez em quando a verificar as coisas com variáveis auxiliares - simples.

Estás a querer complicar só para evitar 2 ciclos for e uma variável auxiliar? Well, if you insist...


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gaspar1423

E dessa maneira consigo fazer as ligações direitas? Como é que fica a estrutura?

Editado por gaspar1423

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

E como faço as ligações entre os caracteres? e que depois ao pesquisar as palavras ele tem de percorrer a lista toda e ver s a palavra existe com os caracteres da lista.

com função(ões) apropriada(s) criada(s) para o efeito.

quanto mais simples a estrutura de dados, mais simples será o código


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gaspar1423

Eu criei esta estrutura e fiz a função de inicialização. Podem me dizer o que está bem sff?

typedef struct nodo_char{
char c;
struct nodo_char *pnorte;
struct nodo_char *peste;
struct nodo_char *psul;
struct nodo_char *poeste;
struct nodo_char *pno;
struct nodo_char *pne;
struct nodo_char *pse;
struct nodo_char *pso;
}NODO_CHAR;

typedef struct mat_char{
NODO_CHAR *prim;
}MAT_CHAR;

void init_mat(MAT_CHAR *mt,int lin, int col){
NODO_CHAR *aux=(NODO_CHAR *)malloc(sizeof(NODO_CHAR));
int i=0,j=0;
int k=0;	 //variavel auxiliar para determinar a possicao na matriz
int inf_esq = lin * col - col;
int inf_dir = lin * col - 1;
int sup_dir = col - 1;

if (mt->prim==NULL) {
 aux=mt->prim;
 for (i=0; i<lin; i++) {
	 for (j=0; j<col; j++) {
		 aux->c=(rand() % ('Z' - 'A' + 1))+'A';
		 if (k==0) { //canto sup esq

		 }else if(k==sup_dir){ //canto sup dir

		 }else if(k==inf_esq){ //canto inf esq

		 }else if(k==inf_dir){ //canto inf dir

		 }else if (k > 0 && k < sup_dir) { //1a fila

		 } else if (k < inf_dir && k > inf_esq) { //ultima fila

		 } else if (j == 0) { //1a coluna

		 } else if (j == col - 1) { //ultima coluna

		 } else {	 //restantes nodos

		 }
		 k++;
	 }
 }
}

}

Editado por apocsantos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gaspar1423

Bem eu alterei o meu código e estuturas e fiquei assim:

typedef struct nodo_char{       //nodo da lista de caracteres
   char c;
   struct nodo_char *pnext,*pant;
}NODO_CHAR;
typedef struct mat_char{        //lista de caracteres
   NODO_CHAR **prim;
}MAT_CHAR;
MAT_CHAR * init_mat(int lin, int col){
   NODO_CHAR *aux=NULL,*prim=NULL,*ant=NULL;
   MAT_CHAR *mt=NULL;
   int i=0,j=0;

   //ciclo para inicializar a lista
   for (i=0; i<lin; i++) {
       for (j=0; j<col; j++) {
           mt=(MAT_CHAR *)malloc(sizeof(MAT_CHAR)*lin);
       }
   }
   for (i=0; i<lin; i++) {
       aux=(NODO_CHAR *)malloc(sizeof(NODO_CHAR));
       for (j=0; j<col; j++) {
           aux->c=(rand() % ('Z' - 'A' + 1))+'A';
       }
       if (i==0) {
           prim=aux;
       }
       if(ant != NULL)
       {
           ant->pnext = aux;
           aux->pant = ant;
       }
       ant = aux;
   }
   *(mt)->prim=prim;
   return mt;
}

Mas da-me erro de memoria :s

Estou mesmo empancado, podem-me ajudar sff??!

Editado por pmg
Falta LP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

MAT_CHAR *mt=NULL;

// ...

for (i=0; i<lin; i++) {                           // ciclos e
 for (j=0; j<col; j++) {                         // ciclos de
   mt=(MAT_CHAR *)malloc(sizeof(MAT_CHAR)*lin);  // atribuição à mesma variável
 }
}

// o resto não faz absolutamente nada

*(mt)->prim = prim; // = *(mt->prim) = prim; -> acesso inválido de memória

já te disseram :

matrix 3x3 :

char matrix[3][3]; // ponto

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gaspar1423

Eu sei que já me disseram isso, mas o problema é que não posso usar matrizes... :s

Peço desculpa pela minha capacidade de vos levar a perder paciência, eu sei que posso ser um bocado chato e explicar mal o que quero... :(

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Eu sei que já me disseram isso, mas o problema é que não posso usar matrizes... :s

NODO_CHAR **prim;

isto para mim é uma matriz, sem tamanho definido, mas uma matriz


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não

é um ponteiros para ponteiros para inteiros NODO_CHAR, mas funcionalmente é a (quase) a mesma coisa que uma matrix.

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Depois de

NODO_CHAR **prim;

tens que prim é um ponteiro (para um ponteiro)

tens que *prim é um ponteiro (para um objecto de tipo NODO_CHAR) (se prim tiver um valor valido)

tens que **prim é um objecto de tipo NODO_CHAR (se prim e *prim tiverem um valor valido)

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gaspar1423

Ah ok.

OK então vamos por partes:

Para inicializar o array de apontadores para apontadores basta isto, certo?

ARRAY_PT *ap=(ARRAY_PT *)malloc(sizeof(ARRAY_PT)*n);

depois tenho de fazer dois ciclos for para percorrer o array e incializar todas as restantes listas:

for (i=0; i<lin; i++) {
       aux=(NODO_CHAR *)malloc(sizeof(NODO_CHAR)*col);
       for (j=0; j<col; j++) {
           aux->c=(rand() % ('Z' - 'A' + 1))+'A';
}
}

Editado por pmg
Falta LP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Para inicializar o array de apontadores para apontadores basta isto, certo?

ARRAY_PT *ap=(ARRAY_PT *)malloc(sizeof(ARRAY_PT)*n);

Um array de apontadores para apontadores é definido assim

SOMETYPE **teste[1000]; // teste é um array de 1000 apontadores para apontadores
                       // nenhum dos 1000 apontadores esta inicializado
SOMETYPE **test2[1000] = {0}; // test2 é um array de 1000 apontadores para apontadores
                             // todos os 1000 apontadores estao inicializados a NULL

No teu codigo, ap é um ponteiro. Depois da linha que publicaste esse ponteiro aponta para um objecto nao inicializado de tipo ARRAY_PT. Esse objecto pertence a uma area de memoria (é o primeiro elemento) com capacidade para n objectos. Para aceder a esse objecto podes usar a sintaxe de ponteiros ( *ap ) ou a sintaxe de arrays ( ap[0] ); para aceder ao objecto seguinte com sintaxe de ponteiros usa ( *(ap + 1) ) e com sintaxe de arrays usa ( ap[1] ).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gaspar1423

Bem vendo as vossas sugestões fiz assim:

typedef struct nodo_char{	 //nodo da lista de caracteres
char c;
struct nodo_char *pnext,*pant;
}NODO_CHAR;
typedef struct mat_char{	 //lista de caracteres
NODO_CHAR **prim;
}MAT_CHAR;
void init_mat(MAT_CHAR **matriz, int lin, int col){
char letra;
NODO_CHAR *aux=NULL,*ptemp=NULL;
int i=0,j=0;
for(i=0; i<lin; i++) // percorre as linhas do quadro
{
 aux=(NODO_CHAR *)malloc(sizeof(NODO_CHAR)); // aloca memoria para NODO_CHAR
 if(aux==NULL)
 {
	 printf("Nao existe memoria disponivel");
	 return;
 }
 else
 {
	 letra=(rand() % ('Z' - 'A' + 1))+'A'; // gera uma letra aleatoria
	 aux->c=letra; // guarda a letra na estrutura do nodo criado
	 aux->pnext=NULL; // apontador do proximo nodo toma o valor de nulo
	 aux->pant=NULL; //apontador para o anterio toma o valor de nulo
	 ptemp=aux; // prim vai apontar para o nodo criado
 }
 for(j=0; j<col; j++) // percorre as colunas
 {
	 letra=(rand() % ('Z' - 'A' + 1))+'A'; // gera uma letra aleatoria
	 aux=(NODO_CHAR *)malloc(sizeof(NODO_CHAR)); // aloca memoria para estrutura quadro
	 if(aux==NULL)
	 {
		 printf("Nao existe memoria disponivel");
		 return;
	 }
	 else
	 {
		 aux->c=letra; // letra e guardada na estrutura do nodo criado
		 aux->pnext=NULL; // apontador do proximo nodo toma o valor de nulo
		 ptemp->pnext=aux; // apontador do nodo anterior aponta para o novo nodo
		 ptemp=aux; // ptemp passa a apontar o novo nodo
	 }
 }
}

for (int i=0; i<lin; i++) {
 for (int j=0; j<col; j++) {
	 printf("%c ",aux->c);
 }
 printf("\n");
}
}

ele insere só insere um elemento pois não está a atulizar o apontador.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

que valores tem a variável aux durante todo o processo ?

bem ... uma exemplo de alocação de memória :

int ** matrix;
int lines = 3, columns = 2, i, j;

matrix = malloc(sizeof(int *) * lines);
for (i = 0; i < lines; i++)
 matrix[i] = malloc(sizeof(int) * columns);

for(i = 0; i < lines; i++)
{
 for (j = 0; j < columns; j++)
   printf("%d ", matrix[i][j]);
 printf("\n");
}

for (i = 0; i < lines; i++)
 free(matrix[i]);
free(matrix);

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gaspar1423

Utilizando a vossa ajuda e outros programas que encontrei, cheguei a esta solução mas está a dar erro de memória numa parte e quando não da erro de memória, só insere elementos na 1ª lista pois não está a actualizar o indice das colunas ou linhas.

Aqui está o código que fiz com as novas estruturas:

typedef struct nodo_char{	 //nodo da lista de caracteres
char c;
struct nodo_char *pnext,*pant;
}NODO_CHAR;
typedef struct mat_char{	 //array de apontadores das listas de caracteres
NODO_CHAR *prim;
}MAT_CHAR;
typedef struct ap_mat{ //apondador para o 1o elemento do array de apontadores
MAT_CHAR *prim;
}AP_MAT;

AP_MAT *init_mat(int lin, int col){ //funcao de inicializacao do array de apontadores; tudo a nulo
AP_MAT *ap=NULL;
int i=0,j=0;

ap=(AP_MAT *)malloc(sizeof(AP_MAT));
ap->prim=(MAT_CHAR *)malloc(sizeof(MAT_CHAR)*lin);

for (i=0; i<lin; i++) {
 for (j=0; j<col; j++) {
	 (*(ap->prim+1)).prim=NULL;
 }
}
return ap;
}
void inserir_letras(AP_MAT *ap){	 //inserir nodos carateres nas listas
int lin=6, col=6;
NODO_CHAR *novo=NULL, *next=NULL, *ant=NULL;

novo=(NODO_CHAR *)malloc(sizeof(NODO_CHAR)*col);


for (int i=0; i<lin; i++) {
 ap->prim[i].prim=novo;	 // !!!!ERRO DE MEMORIA!!!!
 novo->c=(rand() % ('Z' - 'A' + 1))+'A';
 novo->pnext=NULL;
 novo->pant=NULL;

 for (int j=0; j<col; j++) {
	 novo=(NODO_CHAR *)malloc(sizeof(NODO_CHAR)*col);
	 novo->c=(rand() % ('Z' - 'A' + 1))+'A';
	 novo->pnext=NULL;
	 novo->pant=NULL;

	 if (ap->prim[i].prim==NULL) {
		 ap->prim[i].prim=novo;
	 }
	 else{
		 next=ap->prim[i].prim;
		 ant= ap->prim[i].prim;

		 while(next!=NULL) {
			 ant=next;
			 next=next->pnext;
		 }
		 if (ant==ap->prim[j].prim && next==ap->prim[j].prim) {
			 novo->pnext=ant;
			 novo->pant=ap->prim[j].prim;
			 ap->prim[j].prim=novo;
		 }
	 }
 }
}

}
void print_letras(AP_MAT *ap,int lin, int col){	 //imprimir lista de caracteres
NODO_CHAR *paux=NULL;
int i=0, j=0;

for (i=0; i<lin; i++) {
 paux=ap->prim[i].prim;
 for (j=0; j<col; j++) {
	 printf("%c ",paux->c);
 }
 paux=paux->pnext;
 printf("\n");
}

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.