problem z wyszukiwaniem i usuwaniem elementu z listy
Ostatnio zmodyfikowano 2017-01-05 21:12
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ć #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; } } }
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; }
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; if( tmp->dane.imie ) 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() { 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; }
|
|
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: if( tmp == * head ) { * head =( * head )->next; delete tmp; }
|
|
karambaHZP |
» 2017-01-05 20:52:55 |
|
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.. |
|
mikewazowski Temat założony przez niniejszego użytkownika |
» 2017-01-05 21:12:32 rozwiązałam to w taki sposób 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 ); } } }
|
|
« 1 » |