Usuwanie elementu z listy jednokierunkowej C++
Ostatnio zmodyfikowano 2016-11-26 10:11
locf Temat założony przez niniejszego użytkownika |
Usuwanie elementu z listy jednokierunkowej C++ » 2016-11-23 18:28:48 Witam Mam utworzyć listę jednokierunkową, na końcu dopisać element z największą wartością, a potem usunąć element listy o jakimś numerze i zwrócić informację logiczną, czy element został usunięty. Prawie wszystko mam gotowe, tylko nie wiem jak usunąć ten element. Nie potrafię "złapać" adresu elementu poprzedzającego element usuwany i nie mogę połączyć listy po wywaleniu tego elementu. Byłbym wdzięczny za pomoc. To mój program #include <iostream>
using namespace std;
struct eList { int val; eList * next; };
eList * createList() { eList * start, * present, * tail; start = NULL; present = NULL; for( int i = 0; i < 5; i++ ) { tail = present; present = new eList; cout << "Podaj " << i + 1 << " element listy: "; cin >> present->val; present->next = NULL; if( start == NULL ) { start = present; } else { tail->next = present; } } return start; }
void printList( eList * start ) { eList * present; present = start; cout << "\nDrukuje liste: "; while( present ) { cout << present->val << " "; present = present->next; } }
eList * addBigestValueAtEnd( eList *& start ) { eList * present, * tempMax; present = start; tempMax = start; while( present ) { if( present->val > tempMax->val ) { tempMax = present; } present = present->next; } eList * helpPointer; present = start; if( present ) { while( present->next ) present = present->next; helpPointer = new eList; helpPointer->val = tempMax->val; helpPointer->next = NULL; present->next = helpPointer; } else { cout << "\nPusta lista. "; } return start; }
int countList( eList * start ) { eList * present; present = start; int howMany = 0; while( present ) { howMany++; present = present->next; } return howMany; }
bool isRemoved( eList *& start, int numberToRemove ) { eList * present, * helpPointer; eList * elementPrzedUsuwanym; present = start; int howMany = 0; while( present ) { howMany++; present = present->next; } bool lastResult = true; if( present == NULL ) lastResult = false; if( howMany < numberToRemove ) { cout << "\nW liscie jest za malo elementow \n"; lastResult = false; } else { for( int i = 1; i < numberToRemove; i++ ) { present = present->next; } elementPrzedUsuwanym = present; present->next = elementPrzedUsuwanym->next->next; delete elementPrzedUsuwanym->next; } return lastResult; }
int main() { eList * start; start = NULL; start = createList(); printList( start ); addBigestValueAtEnd( start ); printList( start ); bool removed; int numberToRemove = 0; cout << "\nKtory element listy chcesz usunac? "; cin >> numberToRemove; removed = isRemoved( start, numberToRemove ); if( removed ) { cout << "\nUsunieto element."; } else { cout << "\nNie usunieto elementu."; } printList( start ); return 0; }
|
|
karambaHZP |
» 2016-11-23 18:57:28 |
|
mateczek |
» 2016-11-23 20:03:37 bool isRemoved( eList *& start, int numberToRemove ) { eList * present, * helpPointer; eList * elementPrzedUsuwanym; present = start; int howMany = numberToRemove; while( present &&--howMany ) { elementPrzedUsuwanym = present; present = present->next; } bool lastResult = true; if( present == NULL ) lastResult = false; if( howMany ) { cout << "\nW liscie jest za malo elementow \n"; lastResult = false; } else { elementPrzedUsuwanym->next = present->next; delete present; } return lastResult; } |
|
locf Temat założony przez niniejszego użytkownika |
» 2016-11-24 21:17:01 Dzięki za pomoc!! Program śmiga. Tylko nie wiem dokładnie co oznacza warunek pętli while( present &&--howMany )
Dopóki element listy reprezentowany przez wskaźnik present nie ma w sobie NULL i jednocześnie zmniejszaj zmienną howMany ? Jak to należy rozumieć? |
|
mateczek |
» 2016-11-25 04:43:22 pracuj dopóki "present" różne od "NULL" i "howMany" różne od zera. pierwsze, które osiągnie zero kończy pętlę Gdy pętla się skończy (howMany==0) wskaźnik "present" będzie wskazywał element do usunięcia, a "elementPrzedPresent" należy połączać z "elementemPoPresent" |
|
locf Temat założony przez niniejszego użytkownika |
» 2016-11-26 10:11:36 Dziękuję za pomoc. |
|
« 1 » |