Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Usuwanie elementu z listy jednokierunkowej C++

Ostatnio zmodyfikowano 2016-11-26 10:11
Autor Wiadomość
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
C/C++
#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; // tu chciałbym "złapać adres elementu poprzedzającego element usuwany
        present->next = elementPrzedUsuwanym->next->next; // tu chciałem połączyć elementy listy
        //helpPointer = present;
        //elementPrzedUsuwanym->next = present->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;
}
P-154053
karambaHZP
» 2016-11-23 18:57:28
P-154055
mateczek
» 2016-11-23 20:03:37
C/C++
bool isRemoved( eList *& start, int numberToRemove ) {
    eList * present, * helpPointer;
    eList * elementPrzedUsuwanym;
    present = start;
    int howMany = numberToRemove;
    while( present &&--howMany ) {
        elementPrzedUsuwanym = present; //tutaj łap !!!
        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; // tu chciałem połączyć elementy listy
        delete present;
    }
    return lastResult;
}
P-154056
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
C/C++
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ć?
P-154090
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" 
P-154108
locf
Temat założony przez niniejszego użytkownika
» 2016-11-26 10:11:36
Dziękuję za pomoc.
P-154145
« 1 »
  Strona 1 z 1