Sumowanie elementów STOS ANSI C

0

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!

1
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.

1

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 ;)

0

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! :)

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