Problem z zadaniem: listy

0

Witam, mam problem z następującym zadaniem:

Dla zadanego wielomianu anxn + an-1x</sup>(n-1) + … + a1*x + a0 o współczynnikach całkowitych, znajdź i zapisz na listę dwukierunkową wszystkie jego pierwiastki wymierne.
Posortuj tę listę w porządku niemalejącym i wypisz jej zawartość na standardowe wyjście.
Zastosuj w programie odpowiednie funkcje.

Problem polega na tym, że program się kompiluje, jednak w czasie jego działania występuje błąd. Napisałem funkcje odpowiadające za znalezienie pierwiastków oraz stworzenie listy. Program kompilowany w MS Visual Studio 2010. Tablica wynikowa zawierająca pierwiastki to tabWynik.


#include "stdafx.h"
#include <iostream>
#include <cmath>

using namespace std;

struct lista {
    double x;
    lista *last;
    lista *next;
};

int znajdzPierwiastki (int an, int a0, int tabAn[], int tabA0[], int &licznik1, int &licznik2, double tabWynik[])
{
    licznik1 = 0;

    for (int i = 1; i <= an; i++)
    {
        if ( an%i == 0)
        {
            tabAn[licznik1] = i;
            tabAn[licznik1+1] = (-1)*i;
            licznik1 += 2;
        }
    }

    licznik2 = 0;

    for (int i = 1; i <= a0; i++)
    {
        if ( a0%i == 0)
        {
            tabA0[licznik2] = i;
            tabA0[licznik2+1] = (-1)*i;
            licznik2 += 2;
        }
    }

    double tymczas;
    int ileZuzyto = 0;
    bool czyByl;

    for (int i = 0; i < licznik1; i++)
    {
        for (int j = 0; j < licznik2; j++)
        {
            czyByl = false;

            tymczas = (double)tabA0[i] / (double)tabAn[j];
            tymczas = ceil(tymczas);
            for(int z = 0; z < ileZuzyto; z++)
            {
                if (tabWynik[z] == tymczas)
                {
                    czyByl = true;
                }
            }

            if (czyByl == false)
            {
                tabWynik[ileZuzyto] = tymczas;
                ileZuzyto++;
            }
        }
    }

    return ileZuzyto;

}

/* gdzies tu jest blad */

void zrobListe(lista* &head, lista* &last, lista* &temp, double tabWynik[], int ileZu)
{
    temp = new lista;

    for (int i = 0; i < ileZu; i++)
    {

        if (head == NULL) // jezeli glowka jest pusta
        {
            temp->last = NULL;
            temp->next = NULL;
            temp->x = tabWynik[i];
            head = temp;

        } else if (head->next == NULL) // jezeli mamy glowke, ale nie wskazuje ona na kolejny element listy
        {

            temp->last = head;
            temp->next = NULL;
            temp->x = tabWynik[i];
            last = temp;
            head->next = last;

        } else // w kazdym innym wypadku
        {
            temp->last = last;
            temp->next = NULL;
            temp->x = tabWynik[i];
            last = temp;
        }

    }
}

void wypisz (lista *head)
{
    lista *temp = new lista;
    temp = head;

    while (temp != NULL)
    {
        cout << temp->x << endl;
        temp = temp->next;
    }
}

int main ()
{
    int an, a0, licznik1, licznik2;
    int tabAn[30], tabA0[30], ileZu;
    double tabWynik[30];

    lista* head = new lista;
    lista* last = new lista;
    lista* temp = NULL;

    cin >> a0 >> an;

    ileZu = znajdzPierwiastki(an, a0, tabAn, tabA0, licznik1, licznik2, tabWynik);

    zrobListe(head, last, temp, tabWynik, ileZu);

    return 0;
}

z góry dziękuję za znalezienie oraz wytłumaczenie gdzie leży błąd.

Pozdrawiam!

0

Zaglądnij do tego tematu http://4programmers.net/Forum/C_i_C++/189874-c++_wezly_i_listy_ciag_dalszy i zobacz jak wygląda implementacja listy

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