Ir para o conteúdo
ASHASHIN

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

Mensagens Recomendadas

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"

Editado por ASHASHIN
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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())

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 "[]"

Editado por ASHASHIN

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Editado por ASHASHIN

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :(

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

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.