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

[C++] Tablica dynamiczna w liście jednokierunowej

Ostatnio zmodyfikowano 2013-05-04 15:09
Autor Wiadomość
Luudziik
Temat założony przez niniejszego użytkownika
[C++] Tablica dynamiczna w liście jednokierunowej
» 2013-05-04 02:20:48
Stworzyłem listę zawierającą dynamiczną tablicę pozwalająca na zmianę kolejnych wartości listy, program miał działać w taki sposób:

Tworzy pierwszy element listy, zapisuje do niego tablicę, następuje zmiana wartości tablicy, tworzy się następnym element listy do którego jest zapisywana zmieniona tablica etc.

Jednakże okazało się, że w momencie zmiany wartości w tablicy następuje także zmiana w pierwszym elemencie listy.


Efekt jaki chciałem uzyskać
1 1 1
2 2 2
3 3 3

Efekt jaki uzyskałem
3 3 3
3 3 3
3 3 3

C/C++
#include <iostream>
using namespace std;

//definicja listy
struct lista {
    int * tabj; //dynamiczna tablica jednowymiarowa
    lista * nast; //wskaźnik do następnego elementu listy
};

//drukowanie listy
void drukuj( int n, lista * glowa ) {
    while( glowa != NULL ) {
        for( int i = 0; i < n; i++ )
             cout << glowa->tabj[ i ] << " ";
       
        glowa = glowa->nast;
        cout << endl;
    }
}

//usuwanie listy
void usun( lista *& glowa ) {
    lista * pom = glowa;
    while( pom != NULL ) {
        pom = glowa->nast;
        delete glowa;
        glowa = pom;
    } glowa = NULL;
   
   
}

//tworzenie listy, w liście przechowywana jednowymiarowa tablica
void tworz( lista *& glowa, int * cos ) {
    glowa = new lista;
    glowa->tabj = cos;
    glowa->nast = NULL;
}

//void tworzenie tablicy jednowymiarowej
void tworztablice( int n, int *& tab ) {
    tab = new int[ n ];
    for( int i = 0; i < n; i++ )
         tab[ i ] = 1;
   
}

//dodawanie 1 do tablicy
void dodaj( int n, int *& cos ) {
    for( int i = 0; i < n; i++ )
         cos[ i ] += 1;
   
}


int main() {
    int n = 3;
    lista * glowa, * pop, * akt;
    int * tablica;
    tworztablice( n, tablica );
   
    tworz( glowa, tablica );
    pop = glowa;
    for( int i = 0; i < 2; i++ )
    { dodaj( n, tablica ); //w tym momencie wartości zapisane w "glowa->tabj" ulegają zmianie
        tworz( akt, tablica );
        pop->nast = akt;
        pop = akt;
    }
    drukuj( n, glowa );
    usun( glowa );
    return 0;
}
P-81937
Admixior
» 2013-05-04 03:30:07
No i nic w tym dziwnego... Dokładnie tak jest zaprojektowany kod. Zauważ jak działają wskaźniki i adresy. Trzymasz adres do miejsca XYZ w pamięci(zawsze ten sam). Wpakowałeś numer! adresu XYZ do pierwszego węzła później posługując się tym samym adresem dodajesz po 1 do każdego el.

Zobrazowanie sytuacji:
Masz adres! czerwonego domu (0xfcfb2cde). Każesz malarzowi ABC pomalować go na niebieski kolor. Pójdziesz do kolegi XYZ i spytasz się go jaki kolor ma dom o tym adresie(0xfcfb2cde). Co ci odpowie kolega?
P-81940
Luudziik
Temat założony przez niniejszego użytkownika
» 2013-05-04 09:56:40
No tak, rzeczywiście masz rację... No to w takim razie mam problem, a w zasadzie to pytanie: Czy jest możliwe stworzenie listy, która by przechowywała tablicę dynamiczną?
P-81950
pekfos
» 2013-05-04 11:27:55
Czy jest możliwe stworzenie listy, która by przechowywała tablicę dynamiczną?
A dlaczego ma nie być możliwe?
P-81957
Luudziik
Temat założony przez niniejszego użytkownika
» 2013-05-04 12:53:55
Nie wiem, zadałem jedynie pytanie, bo nie byłem pewny.
Byłby ktoś łaskaw napisać jak tego dokonać lub podpowiedzieć lub odesłać do jakiejś strony gdzie byłoby to objaśnione?

Udało mi się to zrobić jedynie na zasadzie, że w liście są zapisywane kolejne wartości poszczególnych tablic dynamicznych i działa to poprawnie, jednakże ponieważ opisany przeze mnie problem jest jedynie uproszczoną wersją tego co muszę zrobić (dwuwymiarowa tablica dynamiczna, a lista wypisywana po 1 elemencie z przerwami). Domyślam się, że jest to w taki sposób do zrobienia, jednakże pytam się by upewnić się czy nie istnieje jakiś prostszy sposób.
P-81979
Admixior
» 2013-05-04 14:02:22
Jedyne co musisz zrobić to dla każdego nowego węzła alokować (tworzyć) nową tablicę i oczywiście przypisywać jej nowe wartości. (i ustawiać wartość względem poprzedniej tablicy). Jak to zrobisz zależy od ciebie, istnieje tutaj pełna dowolność.
P-81991
Luudziik
Temat założony przez niniejszego użytkownika
» 2013-05-04 15:09:36
Dzięki, do zamknięcia.
P-82002
« 1 »
  Strona 1 z 1