Błąd w dodaniu ostatniego elementu listy

0

Witam,

mam zadanie o treści: napisz listę o polach wartość1, wartość2. Usuń element pierwszy. Jako ostatni dopisz element, który w polu wartość1 będzie miał największą wartość elementów z listy (chyba chodzi o pola wartość1), a w polu wartość2 wpisz wartość przekazaną jako argument formalny funkcji.

Napisałem poniższy program, w którym w polu wartość1 i wartość2 są odpowiednio liczby i ich kwadraty. Po utworzeniu listy mam wartości -6 i 36; ....; 9 i 81. Po wykonaniu funkcji m.in. dodającej element moim zdaniem powinien być taki: -6 i 36; ....; 9 i 81, 9 i 81 (dwukrotnie element z 9 i 81.) Nie wiem dlaczego ostatni element nie jest dodany do listy.
Byłbym wdzięczny za pomoc.

 
#include <iostream>

using namespace std;

struct aList{
    int firstNumber;
    int secondNumber;
    aList *next;
};

aList *createList ( aList *& start ){
    aList *present, *tail;
    present = start;
    for( int i = -6; i < 10; i++ ){
        tail = present;
        present = new aList;
        present->firstNumber = i;
        present->secondNumber = i*i;
        present->next = NULL;

        if( tail == NULL ){
            start = present;
        } else {
            tail->next = present;
        }
    }
    return start;
}

void printList( aList *start ){
    aList *present;
    present = start;

    cout <<"\nDrukuje liste \n";
    while ( present ){
        cout << present->firstNumber <<" i " << present->secondNumber <<";";
        present = present->next;
    }
}

aList *deleteFirstAddGivenValue( aList *&start, int givenValue ){
    aList *present;
    present = start;

    if ( start->next == NULL || start == NULL )
        return false;

    aList *addressOfNewFirstElement = start->next;
    delete start;
    start = addressOfNewFirstElement;

    present = start;
    int biggestFirstNumber = start->firstNumber;
    while ( present ){
        if ( biggestFirstNumber < present->firstNumber ){
            biggestFirstNumber = present->firstNumber;
        }
        present = present->next;
    }

    present = start;
    aList *newLastElement = NULL;
    aList *currentLastElement = NULL;
    while ( present->next != NULL ){
        if ( present->firstNumber == biggestFirstNumber && present->secondNumber == givenValue ){
               newLastElement = new aList;
               newLastElement->firstNumber = biggestFirstNumber;
               newLastElement->secondNumber = givenValue;
               newLastElement->next = NULL;
        }
        present = present->next;
        currentLastElement = present; // element, ktory w polu 'next' ma NULL, czyli ostatni element listy
    }
// nadpisuje pole 'next' ostatniego elementu adresem nowego elementu, tj. 'newLastElement'
    currentLastElement->next = newLastElement;

    return start;
}

int main()
{
    aList *start = NULL;
    start = createList ( start );
    printList (start );

    int givenValue = 81;
    start = deleteFirstAddGivenValue( start, givenValue );
    printList (start );

    return 0;
}

0
while (present->next != NULL) {
		if (present->firstNumber == biggestFirstNumber && present->secondNumber == givenValue) {
			newLastElement = new aList;
			newLastElement->firstNumber = biggestFirstNumber;
			newLastElement->secondNumber = givenValue;
			newLastElement->next = NULL;
		}
		present = present->next;
		currentLastElement = present; // element, ktory w polu 'next' ma NULL, czyli ostatni element listy
	}

Pętla while nie wykona się dla ostatniego elementu więc newLastElement nie zostanie przypisany.

0

Dzięki za wskazanie błędu. Problem rozwiązany.

0

To jeszcze zerknij sobie na tą linię:

 if ( start->next == NULL || start == NULL )

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