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 #include <iostream> using namespace std;
struct lista { int * tabj; lista * nast; };
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; } }
void usun( lista *& glowa ) { lista * pom = glowa; while( pom != NULL ) { pom = glowa->nast; delete glowa; glowa = pom; } glowa = NULL; }
void tworz( lista *& glowa, int * cos ) { glowa = new lista; glowa->tabj = cos; glowa->nast = NULL; }
void tworztablice( int n, int *& tab ) { tab = new int[ n ]; for( int i = 0; i < n; i++ ) tab[ i ] = 1; }
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 ); tworz( akt, tablica ); pop->nast = akt; pop = akt; } drukuj( n, glowa ); usun( glowa ); return 0; }
|
|
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? |
|
|
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ą? |
|
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? |
|
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. |
|
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ść. |
|
Luudziik Temat założony przez niniejszego użytkownika |
» 2013-05-04 15:09:36 Dzięki, do zamknięcia. |
|
« 1 » |