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