Jump to content
AprendizZ

Assignar int (ou char) a uma struct

Recommended Posts

AprendizZ

Pretendo fazer que o comando C 2 -1 -1 crie uma árvore binária em que o valor do nó é 2 e os seus "filhos" sejam nulos.

Para tal criei uma estrutura:

typedef struct tnode *Tree;
typedef struct tnode {
    int value;
    Tree child [2];
    Tree parent;
  } Tree_node;

e criei uma função para criar a árvore:

Tree tree_cons (int x, Tree t, Tree u)
{
  Tree result = NULL;
printf("teste");
  assert (t == NULL || t->parent == NULL);
  assert (u == NULL || u->parent == NULL);
  result = (Tree) malloc (sizeof (Tree_node));
  result -> value = x;
  result -> child[0] = t;
  if (t != NULL)
    t -> parent = result;
  result -> child[1] = u;
  if (u != NULL)
    u -> parent = result;
  result -> parent = NULL;
  return result;
}

Para tal o programa recolhe os valores através de:

	Tree tnew, tesq = NULL, tdir=NULL;
char m;
int y, z, w;
while (fscanf (f,"%c", &m) != EOF)
{
	if (m == 'C') //C
	{
		fscanf(f,"%d %d %d", &y, &z, &w);
		if (z == -1)
		{
			tesq = NULL;
		}
		if (w == -1)
		{
			tdir = NULL;
		}
		tnew = tree_cons(y,tesq,tdir);

mas imaginemos que os valores -1 são outros números, ou seja são os índices de outras árvores?

Atribuir NULL a um tipo Tree não tive problemas, mas caso seja diferente de -1, não consigo atribuir o valor dado (que é um int) à mesma variável do tipo Tree.

Alguma ajudinha? Obrigado, desde já.

Share this post


Link to post
Share on other sites
KTachyon

Visto que tens que construir os nós filhos... faz sentido que chames o tree_cons() para os criar:

if (z == -1) {
    tesq = NULL;
}
else {
    tesq = tree_cons(z, NULL, NULL);
}

if (w == -1) {
    tdir = NULL;
}
else {
    tdir = tree_cons(w, NULL, NULL);
}

Agora, não me parece que isto seja muito viável para construir uma árvore com mais que 3 nós.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
AprendizZ

Pois não é muito viável, meu caro, mas vamos por a questão de outra maneira que eu ainda não queria mencionar visto que também não estou a conseguir resolver (por isso pretendia chegar à solução por partes).

Se eu fizer sequencialmente C 1 1 -1 -1, C 2 2 -1 -1 e C 3 3 1 2 deverá dar uma árvore com 3 nós (construída para "cima") em que o primeiro valor (a seguir ao C) é o índice da própria árvore e os dois últimos valores os índices das árvores filhos.

Como também ainda não consegui ver como atribuir esse índice a uma variável dentro da função (sem fazer parte da struct), então seprarei o problema por partes.

Mas sinceramente não sei como resolver uma e outra questão.  :P

Share this post


Link to post
Share on other sites
KTachyon

Ou seja, são os valores dos nós que queres utilizar como indices, correcto? Repara que, para isso tens que utilizar uma outra estrutura que te permita guardar e percorrer os nós enquanto a árvore não está construída. Por exemplo, uma linked list, ou um array.

Se depois quiseres optimizar os acessos, podes remover da lista ligada os elementos que entretanto foram ligados a um nó pai, minimizando o número de elementos dessa lista que tens que percorrer.

Mas, isto só funciona especificamente para o teu caso, em que a construção é feita de baixo para cima.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
AprendizZ

Decidi colocar o "indice" de cada árvore num array do tipo Tree.

Mas neste caso a função detecta os valores NULL (-1) e cria a árvore, só que rebenta

ao inserir no array:

Tree arvores[256] = {0};
char m;
int x, y, z, w;
while (fscanf (f,"%c", &m) != EOF)
{
	if (m == 'C') //C  constrói árvore
	{
		fscanf(f,"%s %d %d %d", &x, &y, &z, &w);
		if (z == -1 && w == -1)
		{
			arvores[x] = tree_cons(y,NULL,NULL);
		}
		if (z == -1 && w != -1)
		{
			arvores[x] = tree_cons(y,NULL,arvores[w]);;
		}
		if (z != -1 && w == -1)
		{
			arvores[x] = tree_cons(y,arvores[z],NULL);;
		}
		if (z != -1 && w != -1)
		{
			arvores[x] = tree_cons(y,arvores[z],arvores[w]);
		}

Estarei a fazer alguma coisa mal????

Share this post


Link to post
Share on other sites
AprendizZ

Descobri, afinal a variável x recolha um número (%d), não uma string.

Share this post


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