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

problem z wyszukiwaniem i usuwaniem elementu z listy

Ostatnio zmodyfikowano 2017-01-05 21:12
Autor Wiadomość
mikewazowski
Temat założony przez niniejszego użytkownika
problem z wyszukiwaniem i usuwaniem elementu z listy
» 2017-01-05 19:48:58
mam problem z funkcją wyszukiwania i usuwania z listy dwukierunkowej wg strint nazwisko; oznaczyłam w komentarzach 4 błędy których nie potrafie rozwiązać


C/C++
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
using namespace std;
struct Dane
{
    string imie;
    string nazwisko;
};
struct Student
{
    Dane dane;
    Student * next;
    Student * prev;
};
Student * stworzelement()
{
    Student * element;
    string imie;
    string nazwisko;
    cout << "podaj imie: ";
    cin >> imie;
    cout << "podaj nazwisko: ";
    cin >> nazwisko;
    element = new Student();
    element->next = NULL;
    element->prev = NULL;
    element->dane.imie = imie;
    element->dane.nazwisko = nazwisko;
    return element;
}
void dodajkoniec( Student ** head )
{
   
    Student * pom;
    Student * tmp = stworzelement();
    if( * head == NULL )
    {
        * head = tmp;
        cout << "dodano do bazy" << endl;
    } else {
        pom = * head;
        while( pom->next != NULL ) {
            pom = pom->next;
        }
        tmp->prev = pom;
        pom->next = tmp;
    }
}
void wyswietl( Student * head )
{
    Student * tmp;
    tmp = head;
    if( tmp == NULL )
         cout << "brak elementow";
    else
    {
        int n = 1;
        while( tmp != NULL )
        {
            cout << "imie: " << tmp->dane.imie << endl;
            cout << "nazwisko: " << tmp->dane.nazwisko << endl;
            tmp = tmp->next;
        }
    }
}
//***szukanie
Student * wyszukaj_element( Student * head, string nazwisko )
{
    Student * pom;
    pom = head;
    while( pom != NULL &&( pom->dane.nazwisko ).compare( nazwisko ) != 0 )
         pom = pom->next;
   
    return pom;
}
// usuwanie
void usuwan_wybrany_element( Student ** head )
{
    Student * tmp;
    Student * pom;
    string nazwisko;
    cout << "podaj nazwisko: ";
    cin >> nazwisko; //* brak komunikatu o błędzie
    //nazwisko = new Student(); //**komunikat o błędzie 'invalid conversion to char'
    tmp = wyszukaj_element( * head, nazwisko );
    if( tmp == NULL )
         cout << "nie ma takiej osoby na liście";
    else
    {
        if( tmp == * head )
        {
            * head =( * head )->next;
            if( tmp->dane.imie ) //*** could not convert from string to bool
                 free( tmp->dane.imie );
           
            if( tmp->dane.nazwisko )
                 free( tmp->dane.nazwisko );
           
            free( tmp );
        }
        else
        {
            pom = * head;
            while((( pom->next->dane.nazwisko ).compare( tmp->dane.nazwisko ) != 0 ) )
                 pom = pom->next;
           
            if( tmp->next != NULL )
                 pom->next->prev = tmp->prev;
           
            pom->next = tmp->next;
            if( tmp->dane.imie )
                 free( tmp->dane.imie );
           
            if( tmp->dane.nazwisko )
                 free( tmp->dane.nazwisko );
           
            free( tmp );
        }
    }
}
int main() // **** błąd 'function-definition is not allowed here before "{"
{
    Student * head = NULL;
    unsigned wybor;
    do
    {
        cout << "menu" << endl;
        cout << "1-dodaj osobe" << endl << "2-wyswietl liste" << endl << "3-usun z listy" << endl << "4-zakoncz" << endl;
        cout << "twoj wybor: ";
        cin >> wybor;
       
        switch( wybor )
        {
        case 1:
            dodajkoniec( & head );
            break;
        case 2:
            wyswietl( head );
            break;
        case 3:
            usuwan_wybrany_element( & head );
            break;
           
            default:
            cout << "blad, podaj numer z menu";
            break;
        }
    } while( wybor != 3 );
   
    return 0;
}
P-156047
czaffik
» 2017-01-05 20:51:50
Wiem że to dział C/C++ aczkolwiek tworzenie kodu będącego miszmaszem obu języków jest trochę mało dobrym pomysłem, bo potem może przyjść do głowy dziwny pomysł usuwania obiektu pokazywanego przez wskaźnik stworzony operatorem new funkcją free, jak już tworzymy operatorem new, to usuwamy operatorem delete i tymi operatorami działamy na wskaźniki a nie na typy nie będące wskaźnikami:

C/C++
if( tmp == * head )
{
    * head =( * head )->next;
    //if(tmp->dane.imie) //*** could not convert from string to bool - nic dziwnego, dane.imie to typ string a nie
    // bool
    //free(tmp->dane.imie);  // nie da się usunąć wskaźnika na dane->imie, bo to nie jest wskaźnik, wskutek czego nie
    // ma sensu tego usuwać
    delete tmp;
}
P-156049
karambaHZP
» 2017-01-05 20:52:55
http://www.p-programowanie.pl​/cpp/lista-jednokierunkowa-c/

C/C++
if( tmp->dane.imie ) //*** could not convert from string to bool
Co tutaj sparawdzasz?

Alokujesz
new
 zwalniaj
delete
, a nie
free()
 (poza tym i tak niepoprawnie).
Najlepiej poszukaj materiałów na temat smart pointerów. std::unique_ptr<> lub std::shared_ptr<>.
P-156050
pekfos
» 2017-01-05 21:07:49
Skąd w ogóle pomysł z tym free()? Nie zwalniasz pamięci z malloc(), ani nawet nie ze wskaźnika. Usiłujesz zwolnić pole ze struktury..
P-156052
mikewazowski
Temat założony przez niniejszego użytkownika
» 2017-01-05 21:12:32
rozwiązałam to w taki sposób
C/C++
void usuwan_wybrany_element( Student ** head )
{
    Student * tmp;
    Student * pom;
    string nazwisko;
    cout << "podaj nazwisko: ";
    cin >> nazwisko;
   
    tmp = wyszukaj_element( * head, nazwisko );
    if( tmp == NULL )
         cout << "nie ma takiej osoby na liście";
    else
    {
        if( tmp == * head )
        {
            * head =( * head )->next;
            tmp->dane.imie;
            tmp->dane.nazwisko;
            delete( tmp );
        }
        else
        {
            pom = * head;
            while((( pom->next->dane.nazwisko ).compare( tmp->dane.nazwisko ) != 0 ) )
                 pom = pom->next;
           
            if( tmp->next != NULL )
                 pom->next->prev = tmp->prev;
           
            pom->next = tmp->next;
            tmp->dane.imie;
            tmp->dane.nazwisko;
            delete( tmp );
        }
    }
}
P-156053
« 1 »
  Strona 1 z 1