Witam serdecznie!
Miałem do napisania program w języku C mający za zadanie pobrać od użytkownika 2 liczby, wypisać każdą cyfrę danej liczby do stosów (2 liczby - 2 stosy), a następnie zsumować je w komórkach trzeciego stosu i wypisać na ekran.
Od kilku godzin zastanawiam się dlaczego program się sypie - powodem oczywiście są wskaźniki zmiennych "head1" i "head2" ustawione na NULL (zapewne nie mogę wywołać z nich wartości), ale nie mam pojęcia co zrobić...
Oto link do kodu źródłowego: http://pastebin.com/PN1qWUQf .
Serdecznie prosiłbym o pomoc.
Pozdrawiam!

- Rejestracja:ponad 10 lat
- Ostatnio:prawie 2 lata
- Postów:2500
void przepisz(struct STOS *headStary, struct STOS *headNowy)
Przecież operujesz tutaj na kopiach wskaźników, więc:
push(&headNowy, klucz);
wrzucasz element do nowego, tymczasowego stosu, a tamte w main
po wyjściu z funkcji nadal są nullami.

- Rejestracja:ponad 11 lat
- Ostatnio:ponad rok
- Postów:607
Akurat miałem robić rzeczy na uczelnię, więc oczywiście przerobiłem kod Twojego sumuj() i trochę zapisz(), żeby działał :p
Nie zrozumiałem w ogóle co chciałeś osiągnąć przez counter w sumowaniu. Trochę to przerobiłem
Tak jak mówił @twonek pomieszałeś ze wskaźnikami. Tutaj kod:
#include<stdio.h>
#include<stdio.h>
struct STOS
{
int key;
struct STOS *next;
}
;
void push(struct STOS **Head, int x)
{
struct STOS *newHead=NULL;
newHead=(struct STOS*)malloc(sizeof(struct STOS));
// zaalokowanie komórki pamięci o rozmiarze struktury "STOS"
newHead->key=x;
newHead->next=*Head;
*Head=newHead;
printf("Umieszczono %d na stosie\n", x);
}
void pop(struct STOS **Head)
{
if(Head==NULL) printf("Stos jest pusty!");
struct STOS *temporaryHead=*Head;
*Head=temporaryHead->next;
free(temporaryHead);
}
/* ******************************************************** */
void zapisz(int dana, struct STOS **head)
{
printf("\nZapisuje...\n");
int zapis;
if((dana%10)==0) push(head, dana);
else
{
while((dana % 10) != 0)
{
zapis = (dana % 10);
push(head,zapis);
dana = (dana/10);
}
}
}
/* ******************************************************** */
void przepisz(struct STOS *headStary, struct STOS **headNowy)
{
printf("\nPrzepisuje...n");
int klucz;
while(headStary)
{
klucz = (headStary -> key);
push(headNowy, klucz);
headStary=headStary->next;
}
}
/* ******************************************************** */
void sumuj(struct STOS *head1,struct STOS *head2,struct STOS **headWynik)
{
while(head1 != NULL || head2 != NULL)
{
int suma = 0;
if( head1 != NULL )
{
suma += head1 -> key;
head1 = head1 -> next;
}
if( head2 != NULL )
{
suma += head2 -> key;
head2 = head2 -> next;
}
push( headWynik, suma );
}
}
/* ******************************************************** */
int main()
{
struct STOS *head1start = NULL;
struct STOS *head2start = NULL;
struct STOS *head1nowy = NULL;
struct STOS *head2nowy = NULL;
struct STOS *headWynik = NULL;
int pierwsza, druga;
printf("\nPodaj pierwsza liczbe:");
scanf("%d", &pierwsza);
printf("\nPodaj druga liczbe:");
scanf("%d", &druga);
zapisz(pierwsza, &head1start);
zapisz(druga, &head2start);
przepisz(head1start, &head1nowy);
przepisz(head2start, &head2nowy);
sumuj(head1nowy, head2nowy, &headWynik);
printf("\nSuma podanych liczb wynosi:\n");
while(headWynik)
{
printf("%d\n", headWynik -> key);
headWynik = headWynik -> next;
}
system("PAUSE");
return 0;
}
Dodatkowo radzę zastanowić się nad funkcją zapisz(). Przetestuj program dla liczb 11 22. Wszystko działa. Ale dla np 10 20 już nie bardzo.
Liczby mogą mieć różne długości co uwzględniłem w moim kodzie.
No i jeszcze zatamuj wycieki pamięci ;)
Dziękuję za szybką odpowiedź!
"Counter" akurat był w celu sprawdzenia gdzie program się zatrzymuje (aby pętla while w ogóle mogła ruszyć). Program napisany przez Ciebie, @stryku, uruchamia się, jednak nie uwzględnia przypadku sumy cyfr większej od 9 (brakuje przeniesienia). Z tym jednak powinienem sobie poradzić. Jeszcze raz dziękuję bardzo i życzę dobrej nocy! :)
