[C++]Listy jednokierunkowe - wstawianie elementu wewnątrz listy.
Ostatnio zmodyfikowano 2014-02-14 08:02
Amakesh Temat założony przez niniejszego użytkownika |
[C++]Listy jednokierunkowe - wstawianie elementu wewnątrz listy. » 2014-02-13 17:24:54 Witam! Mam funkcję, która ma wstawiać podaną wartość w wybrame miejsce listy. Program się kompiluje i uruchamia, dodaję kilka przykładowych elementów za pomocą pierwszej funkcji a potem próbuję dodać jakiś w wybrane miejsce pomiędzy nimi za pomocą funkcji z tematu, ale za każdym razem dostaję komunikat że lista jest pusta. Dlaczego? Kod: #include <iostream> #include <cstdlib> #include <stdio.h> using namespace std;
struct ele { int dana; ele * nast; void wypisz() { cout << dana << endl; } }; void tworz( ele *& em, int data ) { } void insert_koniec( ele *& kon, int data ) { cout << "Podaj dowolną liczbę: "; cin >> data; ele * elem = new ele; elem->dana = data; elem->nast = NULL; if( kon == NULL ) { kon = elem; } else { ele * tmp = kon; while( tmp->nast ) tmp = tmp->nast; tmp->nast = elem; } } void insert_poczatek( ele *& pocz, int x ) { cout << "Podaj dowolną liczbę: "; cin >> x; ele * elem2 = new ele; elem2->dana = x; elem2->nast = pocz; pocz = elem2; } void insert_dowolne( ele *& pocz, int x, int i ) { cout << "Podaj liczbę, którą chcesz dodać do listy: "; cin >> x; cout << "Podaj numer elementu listy, którym ma się stać podana wcześniej liczba: "; cin >> i; ele * it = pocz; int licznik = 0; if( pocz == NULL ) { cout << "Lista jest pusta. Dodaj najpierw jakiś element "; return; } while( it->nast != NULL ) { licznik++; if( licznik == i ) { ele * tmp = new ele; tmp->dana = x; tmp->nast = it->nast; it = tmp; return; } it = it->nast; } } void wypisz_wszystko( ele * pocz ) { cout << "Wszystkie dane: \n"; while( pocz != NULL ) { pocz->wypisz(); pocz = pocz->nast; } }
int main( int argc, char ** argv ) { int inst; int x; int i; int data; ele * pocz = NULL; ele * kon = NULL; cout << "Co chcesz zrobić? \n" << "[1}Dodać nowy element na początek listy \n" << "[2]Dodać element na koniec listy \n" << "[3]Dodać element w wybrane miejsce listy \n" << "[4]Usunąć element z początku listy \n" << "[5]Usunąć element z końca listy \n" << "[6]Usunąć wybrany element listy \n" << "[7]Wypisać całą listę \n" << "[8}Wypisać wybrany element listy \n" << "[9]Wypisać wskaźnik do elemtu zawierającego wybraną wartość \n"; while( cin >> inst ) { switch( inst ) { case 1: insert_poczatek( pocz, x ); break; case 2: insert_koniec( kon, data ); break; case 3: insert_dowolne( pocz, x, i ); case 7: wypisz_wszystko( pocz ); break; } } return 0; }
|
|
Wiesiek |
» 2014-02-14 08:02:44 Przede wszystkim w funkcji insert_dowolne już widać błąd. Zamiast it = tmp; powinno być it->nast =tmp; Zastanów się też jak zadziała Twoja funkcja, gdy lista ma 1 element i chcesz wstawić element na miejscu 1 (czyli jako drugi na liście.
Niejasne jest znaczenie wskaźnika kon. Na pewno nie wskazuje na początek listy, tylko na początek zupełnie innej listy. Gdy kon==NULL - funkcja insert_koniec tworzy nową listę, gdy zaś kon!=NULL - funkcja ta dopisuje element na końcu listy kon. Czyli jest prawie dobrze, trzeba tylko z main wyrzucić wskaźnik kon i inaczej wołać funkcję insert_koniec. |
|
« 1 » |