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

[C++]Listy jednokierunkowe - wstawianie elementu wewnątrz listy.

Ostatnio zmodyfikowano 2014-02-14 08:02
Autor Wiadomość
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:
C/C++
#include <iostream>
#include <cstdlib>
#include <stdio.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
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;
}
P-104603
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.
P-104624
« 1 »
  Strona 1 z 1