Sumowanie elementów listy jednokierunkowej

0

Witam
Chce napisac program, który wczytuje liste kierunkowa z pliku, wypisuje ja, oblicza sumę liczb znajdujących się w liście i wypisuje ją. Po włączeniu programu wyskakuje "segmentation fault(core dumb)". Wnioskuje ze jest cos zle w funkcji sumujacej. Jak moge to naprawic?
Moj kod:

{
	unsigned x;
	unsigned y;
	struct analiza *next;
};
typedef struct analiza analiza;
analiza* pobierajaca(analiza *head)
{
	analiza *biezacy=NULL;
	while(!feof(stdin))
	{
		analiza *data=(analiza*) malloc(sizeof(analiza));
		scanf("%u%u", &data->x,&data->y);
		if(biezacy)
			biezacy->next=data;
		else
			head=data;
		biezacy=data;
	}
	biezacy->next=NULL;
	return head;
}
void wypisujaca(analiza *head)
{
	analiza *biezacy=head;
	while(biezacy)
	{
		printf("%u\t%u\n", biezacy->x, biezacy->y);
		biezacy=biezacy->next;
	}
}
int sumujaca(analiza *head)
{
	int suma=0;
	analiza *biezacy=head;
	while(biezacy)
	{
		suma+=head->x;
		head=head->next;
	}
	return suma;
}
int main(void)
{
	analiza *kwiat;
	kwiat=pobierajaca(kwiat);
	wypisujaca(kwiat);
        int sum=sumujaca(kwiat);
	printf("Suma x to %d\n", sum);
	return 0;
}```
0

chciałem odpalić w https://www.onlinegdb.com/
ale się widzę nie kompiluje pewnie nie wszystko wrzuciłeś.

Ale rada odpal w debugerze loklanie.

  1. Jak walnie powinieneś zobaczyć stos
  2. Jak coś dalej będzie nie jasne idź korkowo debugerem

edit:
też sobie ogarnij
https://clang.llvm.org/docs/ClangFormat.html
poprawi ci formatowanie kodu.

0
  1. zmień nazewnictwo teraz jest błędogenna, ja rozumiem że jak ktoś lubi się anal-izować no to jest jego własny wybór, ale zapewniam cię że w ten sposób ... to nie tędy droga.
  2. zmień strukturę teraz jest błędogenna.
typedef struct item { unsigned x,y; struct item *next; } item;
typedef struct stack { struct item *head; } stack;
  1. uprość sobie życie zrób dodatkowe funkcje obsługi tej listy
item *makeitem(unsigned x,unsigned y,item *next)
{ 
    item *ret=malloc(sizeof(item)); // jak nie kompilujesz kompilatorem c++ to nie jest potrzebna konwersja na (item*)
    ret->next=next;
    ret->x=x;
    ret->y=y;
    return ret;
} 
  1. do funkcji przekazuj wskaźnik na nagłówek:
void readstack(FILE *source,stack *s)
{
    for(unsigned x,y;fscanf("%u%u",&x,&y)==2;) s->head=makeitem(x,y,s->head);
}

wtedy możesz czytać zarówno z stdin jak z pliku za pomocą jednej funkcji, zaś z funkcją pomocniczą to masz proste jak drut.
5. narysuj sobie to na kartce wtedy napisanie kodu będzie prostsze.

0

sumujaca powinna wyglądać tak samo jak wypisujaca tylko zamiast wypisywać powinna sumować, zakładając że wypisujaca działa to napisz sumujaca jeszcze raz od zera to znajdziesz błąd
spoiler alert: zmieniasz head zamiast biezacy

2

Tu dałem przykład na bardzo podobny problem: https://4programmers.net/Forum/C_i_C++/352675-stos_funkcje_zapisu_i_odczytu_pliku_binarnego?p=1772196#id1772196
Wystarczy przerobić do własnych potrzeb.
Można użyć UniversalStackForEachItemDo do obliczania sumy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1