Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ASHASHIN

[Resolvido] má "impressão" de lista

Recommended Posts

ASHASHIN

Boas, tenho como trabalho pegar no tamanho de uma lista, um numero e uma lista e somar a cada elemento da lista esse mesmo número

EX:

Input: 5 1 [1,1,1,1,1]

Output: [2,2,2,2,2]

mas o meu output sem a linha "printf (",%d", s->value); //confirmar se os numeros estão a ser somados" é [] (e com a mesma é "22222[]") alguém me pode explicar o porquê?

#include <stdio.h>
#include <stdlib.h>
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

// Listas
//definição de Lista

typedef struct lnode *List;
typedef struct lnode {
int value;
List next;
} List_node;

List list_cons (int x, List s)
{
List r = (List) malloc (sizeof (List_node));
r -> value = x;
r -> next = s;
return r;
}

List list_read_some(FILE *f, int n)
{
List result = NULL;
if (n > 0)
{
	int x;
	fscanf(f, "%d", &x);
	result = list_cons(x, list_read_some(f, n-1));
}
 return result;
}

void list_show(FILE *f, List s)
{
fprintf(f, "[");
if (s)
   {
   fprintf(f, "%d", s -> value);
   s = s->next;
   while (s)
	   {
		   fprintf(f, ",%d", s -> value);
		   s = s -> next;
	   }
	}
	fprintf(f, "]\n");
}

// adiciona acc a cada elemento da lista e imprime a mesma
List list_accumulate (List s, int acc)
{
while (s)
 {
	s->value += acc;
	printf ("%d", s->value); //confirmar se os numeros estão a ser somados
	s = s->next;

 }
return s;
}

void test_list_accumulate ()
{
int acc, size;
//criação lista vazia
List s = NULL;
while (scanf ("%d%d", &size, &acc) != EOF)
{
	s = list_read_some(stdin, size);
	s = list_accumulate (s, acc);
	list_show(stdout, s);
}
}

int main ()
{
test_list_accumulate ();
return 0;
}

EDIT1: esqueci-me de copiar a main no código acima

EDIT2: adicionar identação (quando eu fiz guardar alterações após o EDIT1 o código estava identado não percebo porque é que não ficou no post), em relação à minha definição do NULLL (e quanto ao tanto ser para C como C++ que acho qu referes porcausa da definição de NULL) já estava no ficheiro original tal como a funçãod e leitura e escrita, List s = NULL é a minha unica variavel global e declarei-a assim para não ter que estar sempre a escrever essa linha noutras funções)

EDIT3: adicionei função em falta e removi a variavel global e adicionei os includes

EDIT4: retirada a virgula no printf da "list_accumulate"

Edited by ASHASHIN
Falta LP no GeSHi

Share this post


Link to post
Share on other sites
pmg

Primeiro: porque achas que a tua definicao de NULL é preferivel a definicao do proprio compilador?

NULL esta definido em muitos headers (pelo menos <stddef.h>, <stdio.h>, <stdlib.h>).

Segundo: sugiro que nao escrevas codigo que seja valido tanto em C como em C++. Se o fizeres ficas com uma coisa que nem é carne nem peixe. Escolhe uma linguagem e trabalha com essa linguagem.

Terceiro: evita variaveis globais

Quarto: melhora a indentacao do teu codigo

PS Vou estudar o teu codigo e tentar perceber porque nao imprime como queres.

Edit

Quinto: o scanf() devolve EOF quando ha erro na leitura. O teu scanf() na funcao test_list_accumulate() pode devolver EOF, 0, 1, ou 2. Os valores EOF, 0, e 1 indicam que algo correu mal ... mas so averiguas o caso EOF: nos outras casos prossegues o programa como se tivesse corrido tudo bem.

Sugiro que verificas se o resultado for diferente de 2 em vez de igual a EOF

while (scanf("%d%d", &size, &acc) == 2)

Edit #2

Sexto: o teu programa nao compila: a funcao list_cons() nao esta definida em lado nenhum.

Edit #2

Setimo: apaga a variavel global! Nao esta la a fazer nada! Todas as funcoes que usam 's' usam a partir de um parametro, ou como variavel local (na funcao test_list_accumulate())

Edited by pmg
Quinto e Sexto e Setimo

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
ASHASHIN

Oops, a virgula ficou de quando eu tentei imprimir sem a "list_show" mas não muda o facto de que os elementos da lista continuam de fora dos "[]"

Edited by ASHASHIN

Share this post


Link to post
Share on other sites
HappyHippyHippo

porque os número que estão a ser apresentados não são da função list_show !!!

List list_accumulate (List s, int acc)
{
       while (s)
        {
               s->value += acc;
               printf ("%d", s->value); //confirmar se os numeros estão a ser somados
               s = s->next;

        }
return s; // <-- qual o valor de s nesta instrução ? (após o ciclo)
}
void test_list_accumulate ()
{
// ...
               s = list_accumulate (s, acc); // <--- qual o valor de s ?
               list_show(stdout, s);         // qual o valor de s ?
// ...
}


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

Share this post


Link to post
Share on other sites
pmg

Mete isto na primeira linha da funcao list_show()

printf("list_show() called\n");


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
ASHASHIN

porque os número que estão a ser apresentados não são da função list_show !!!

List list_accumulate (List s, int acc)
{
	while (s)
	 {
			s->value += acc;
			printf ("%d", s->value); //confirmar se os numeros estão a ser somados
			s = s->next;

	 }
return s; // <-- qual o valor de s nesta instrução ? (após o ciclo)| se o imput foi 5 1 1 1 1 1 1 s deveria valer [2,2,2,2,2]
}
void test_list_accumulate ()
{
// ...
			s = list_accumulate (s, acc); // <--- qual o valor de s ?| se o imput foi 5 1 1 1 1 1 1 s deverá ser [1,1,1,1,1]
			list_show(stdout, s);		 // qual o valor de s ?| se o imput foi 5 1 1 1 1 1 1 s deverá [2,2,2,2,2]
// ...
}

porque os número que estão a ser apresentados não são da função list_show !!!

Então quais são?

Share this post


Link to post
Share on other sites
ASHASHIN

Eu já respondi (acho eu que era aquilo que estavas a perguntar) na quotação com código quando perguntei "Então quais são?" (percebi depois que te estavas a referir ao printf da "list_accumulate"

Edited by ASHASHIN

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu comentei o código ... e nesse comentário estão questões ...

responde à perguntas que saberás qual é o problema


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

Share this post


Link to post
Share on other sites
ASHASHIN

1- return s; // <-- qual o valor de s nesta instrução ? (após o ciclo)| se o imput foi 5 1 1 1 1 1 1 s deveria valer [2,2,2,2,2]

2- s = list_accumulate (s, acc); // <--- qual o valor de s ?| se o imput foi 5 1 1 1 1 1 1 s deverá ser [1,1,1,1,1]

3- list_show(stdout, s); // qual o valor de s ?| se o imput foi 5 1 1 1 1 1 1 s deverá [2,2,2,2,2]

2- s em " list_accumulate" vale [1,1,1,1,1] e s=list_accumulate (s, acc) deveria ser [2,2,2,2,2]

3- o s deveria ser [2,2,2,2,2] mas o que aparece "imprimido" é []

Lamento se não estou a perceber bem o que queres dizer :(

Share this post


Link to post
Share on other sites
HappyHippyHippo

"s" é um ponteiro ... logo nunca, mas nunca digas que um ponteiro tem o valor de "[2,2,2,2,2]" !!!

um ponteiro é um número, e esse número representa a posição de memória.

logo, responde novamente às perguntas

se necessário, usa a seguinte função para descobrir:

printf("%p", s);


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

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

×

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.