Jump to content
gaspar1423

Lista de caracteres

Recommended Posts

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| \ | \ | * | * | * | * | * | \ |

...

Share this post


Link to post
Share on other sites
pmg

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

char sopadeletras[3][3];

Edited by 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites
gaspar1423

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

Edited by gaspar1423

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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++;
	 }
 }
}

}

Edited by apocsantos

Share this post


Link to post
Share on other 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??!

Edited by pmg
Falta LP

Share this post


Link to post
Share on other 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

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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... :(

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
HappyHippyHippo

não

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

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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)

Edited by 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!

Share this post


Link to post
Share on other 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';
}
}

Edited by pmg
Falta LP

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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);

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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");
}

}

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.