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

[c++] Rekurencyjne dodawanie elementów do listy jednokierunkowej

Ostatnio zmodyfikowano 2014-06-22 11:30
Autor Wiadomość
Raan
Temat założony przez niniejszego użytkownika
[c++] Rekurencyjne dodawanie elementów do listy jednokierunkowej
» 2014-06-19 22:04:49
Witam, przy wpisaniu koniec, lista działa jak trzeba, w momencie, gdy chcę wpisać kolejny rekord, pomija część zapytania o nazwę i przechodzi do "opis". gdy wpisuję wszędzie koniec, zaczyna w nieskończoność zapętlać się drukując pytania o każdy z podpunktów.

Kod:
C/C++
void dodaj_element( element_listy * adres )
{
    element_listy * poprzednik;
    while( adres->wsk_nastepnika != NULL )
         adres = adres->wsk_nastepnika;
   
    adres->wsk_nastepnika = new element_listy;
    poprzednik = adres;
    adres = adres->wsk_nastepnika;
    cout << "Podaj nazwe lub wpisz koniec: " << endl;
    getline( cin, adres->nazwy );
    if( adres->nazwy == "koniec" )
    {
        poprzednik->wsk_nastepnika = NULL;
        delete adres;
    }
    else
    {
        cout << endl << "Opisz:";
        getline( cin, adres->opisy );
        cout << "Szerokosc geograficzna: ";
        cin >> adres->gszerokosci;
        cout << "Dlugosc geograficzna: ";
        cin >> adres->gdlugosci;
        cout << "Strefa czasowa UTC: ";
        cin >> adres->strefyczasowe;
        adres->wsk_nastepnika = NULL;
        dodaj_element( adres );
    }
}

Cały program (gdyby był potrzebny):
C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

struct element_listy
{
    string nazwy, opisy;
    long double gszerokosci, gdlugosci;
    int strefyczasowe;
    element_listy * wsk_nastepnika;
};


void drukuj_liste( element_listy * adres )
{
    while( adres != NULL )
    {
        cout <<( * adres ).nazwy << endl <<( * adres ).opisy << endl << "Szerokosc" <<( * adres ).gszerokosci << endl << "Dlugosc: " <<( * adres ).gdlugosci << endl << "Strefa czasowa: " <<( * adres ).strefyczasowe << endl << endl;
        adres = adres->wsk_nastepnika;
    }
};

void dodaj_element( element_listy * adres )
{
    element_listy * poprzednik;
    while( adres->wsk_nastepnika != NULL )
         adres = adres->wsk_nastepnika;
   
    adres->wsk_nastepnika = new element_listy;
    poprzednik = adres;
    adres = adres->wsk_nastepnika;
    cout << "Podaj nazwe lub wpisz koniec: " << endl;
    getline( cin, adres->nazwy );
    if( adres->nazwy == "koniec" )
    {
        poprzednik->wsk_nastepnika = NULL;
        delete adres;
    }
    else
    {
        cout << endl << "Opisz:";
        getline( cin, adres->opisy );
        cout << "Szerokosc geograficzna: ";
        cin >> adres->gszerokosci;
        cout << "Dlugosc geograficzna: ";
        cin >> adres->gdlugosci;
        cout << "Strefa czasowa UTC: ";
        cin >> adres->strefyczasowe;
        adres->wsk_nastepnika = NULL;
        dodaj_element( adres );
    }
}

void kasuj( element_listy * adres )
{
    element_listy * aktualny, * poprzedni;
    aktualny = adres;
    while( aktualny != NULL )
    {
        poprzedni = aktualny;
        aktualny = aktualny->wsk_nastepnika;
        delete poprzedni;
    }
}
void wstaw_domyslny( element_listy * adres )
{
    element_listy * glowa, * aktualny, * poprzedni;
    string nazwa, opis;
    long double gszerokosc, gdlugosc;
    int strefaczasowa;
    bool miejscebezpieczne;
   
    aktualny = NULL;
    poprzedni = NULL;
    glowa = poprzedni;
   
    nazwa = "Mariana Trench";
    opis = "The Mariana Trench or Marianas Trench is the deepest part of the world's oceans. It is located in the western Pacific Ocean, to the east of the Mariana Islands. The trench is about 2,550 kilometres (1,580 mi) long but has an average width of only 69 kilometres (43 mi). It reaches a maximum-known depth of 10.911 km (10,911 ± 40 m) or 6.831 mi (36,069 ± 131 ft) at the Challenger Deep, a small slot-shaped valley in its floor, at its southern end, although some unrepeated measurements place the deepest portion at 11.03 kilometres (6.85 mi).";
    gszerokosc = 11.316667;
    gdlugosc = 142.25;
    strefaczasowa = 4;
    poprzedni = aktualny;
    aktualny = new element_listy;
    aktualny->nazwy = nazwa;
    aktualny->opisy = opis;
    aktualny->gszerokosci = gszerokosc;
    aktualny->gdlugosci = gdlugosc;
    aktualny->strefyczasowe = strefaczasowa;
    glowa = aktualny;
    poprzedni = aktualny;
   
   
    nazwa = "Tajlandia";
    opis = "państwo w południowo-wschodniej Azji, graniczące z Laosem i Kambodżą na wschodzie, z Malezją na południu oraz z Mjanmą. Tajlandia była niegdyś nazywana Syjamem, gdyż była to jej oficjalna nazwa do 11 maja 1949. Międzynarodowe określenie \"Thai\" (ไทย) znaczy po tajsku wolny.";
    gszerokosc = 13.75;
    gdlugosc = 100.516667;
    strefaczasowa = 6;
    aktualny = new element_listy;
    poprzedni->wsk_nastepnika = aktualny;
    aktualny->nazwy = nazwa;
    aktualny->opisy = opis;
    aktualny->gszerokosci = gszerokosc;
    aktualny->gdlugosci = gdlugosc;
    aktualny->strefyczasowe = strefaczasowa;
    poprzedni = aktualny;
   
    nazwa = "Glass Beach (Fort Bragg, California)";
    opis = "Glass Beach is a beach in MacKerricher State Park near Fort Bragg, California that is abundant in sea glass created from years of dumping garbage into an area of coastline near the northern part of the town.";
    gszerokosc = 39.445833;
    gdlugosc = - 123.805278;
    strefaczasowa = - 8;
    aktualny = new element_listy;
    poprzedni->wsk_nastepnika = aktualny;
    aktualny->nazwy = nazwa;
    aktualny->opisy = opis;
    aktualny->gszerokosci = gszerokosc;
    aktualny->gdlugosci = gdlugosc;
    aktualny->strefyczasowe = strefaczasowa;
    aktualny->wsk_nastepnika = NULL;
   
    * adres =* glowa;
}
int main( int argc, char * argv[] )
{
    element_listy * adres;
    adres = new element_listy;
    adres->wsk_nastepnika = NULL;
    wstaw_domyslny( adres );
    dodaj_element( adres );
   
   
    drukuj_liste( adres );
    kasuj( adres );
   
    return 0;
}
P-112343
pekfos
» 2014-06-19 22:40:18
Nie zabezpieczasz się przed wystąpieniem błędu w strumieniu. Np przez wpisanie 'koniec' do liczby..
P-112347
Raan
Temat założony przez niniejszego użytkownika
» 2014-06-20 11:40:25
To juz poprawiam. A W takim razie czemu po wpisaniu dobrze przy następnym działaniu funkcji dodaj, nie da się wpisać nazwa/koniec tylko przechodzi do opisu.
P-112365
pekfos
» 2014-06-20 11:43:04
Bo operator>> zostawia w strumieniu znak nowej linii.
P-112366
Raan
Temat założony przez niniejszego użytkownika
» 2014-06-20 19:01:38
A jak wczytac double przez get, wyrzuca błąd...
P-112399
pekfos
» 2014-06-20 22:25:35
Znak nowej linii możesz pominąć przez ignore().

wyrzuca błąd
get()? To nie służy do pobierania liczb.
P-112410
Raan
Temat założony przez niniejszego użytkownika
» 2014-06-22 11:30:56
dziękuję. Problem rozwiązany.
P-112492
« 1 »
  Strona 1 z 1