[ Príspevkov: 7 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Linked list -  insert

Registrovaný: 09.04.11
Prihlásený: 11.01.14
Príspevky: 257
Témy: 26 | 26
Bydlisko: Kesa
NapísalOffline : 24.05.2012 21:21 | Linked list - insert

Program mi funguje, mám len takú menšiu otázku. Vytvorím si pomocnú dynamickú štruktúru (vlastne sú dve). Z jednej spravím kópiu hlavnej a do druhej uložím nový prvok. Keď si všetko vložím a pospájam (a nedám delete help), tak vo first mám všetky hodnoty + tú novú, čo je v poriadku. Ale ako náhle dám delete help, tak sa mi zmaže ten pridaný prvok a aj to, čo je naňho napojé. Myslel som si, že kedže mám kópiu firstu, tak aj keď vymažem to help, tak mi zostanú tie prvky vo firste.
Takže otázka je taká, či sa to dá nejak z efektívniť, aby som tú nepotrebnú pamäť mohol odstrániť.

Kód:
struct Item* insert(struct Item* first, struct Item* Where, int data)
{
   Item* temp = first; //vytvori v pamati miesto pre pomocnu strukturu a vlozi do nej first
   Item* help = new Item; //vytvori v pamati miesto pre novy prvok

   if(Where == NULL) //ked funckia find nenasla prvok, vratime NULL
      return first;

   while(temp != Where) //posuvame sa po najdeny prvok
      temp = temp->next;

   help->data = data; //do pomocneho prvku vlozime hodnotu
   help->next = temp->next; //ako dalsi prvok k tej hodnote napojime prvky kde sme predtym skoncili
   temp->next = help; //nakoniec k pomocnemu zoznamu doplnime postupnost

   return first;
}


_________________
NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n
Offline

Skúsený užívateľ
Skúsený užívateľ
Linked list -  insert

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 24.05.2012 21:27 | Linked list - insert

street_punk píše:
Takže otázka je taká, či sa to dá nejak z efektívniť, aby som tú nepotrebnú pamäť mohol odstrániť.

Ale ved ona nie je nepotrebna, je predsa sucastou zoznamu, tak ako aj ostatne prvky. Tie si taktiez niekde predym alokoval rovnakym sposobom. Zmazat to mozes kedykolvek neskor, ak tuto bunku uz potrebovat nebudes, pripadne pri mazani celeho zoznamu.


Offline

Užívateľ
Užívateľ
Linked list -  insert

Registrovaný: 09.04.11
Prihlásený: 11.01.14
Príspevky: 257
Témy: 26 | 26
Bydlisko: Kesa
Napísal autor témyOffline : 24.05.2012 21:48 | Linked list - insert

Ja to chápem tak, že tá pamäť mi poslúžila nato, aby som si do nej uložil ten nový prvok. A naňho som napojil zvyšok tempu. Temp je vlastne kópia firstu, takže je to zhodne. Help nie je ničoho kópia, takže keď ho odstranim, nemalo by sa nič stať, kedže je to už všetko uložene vo firste. Lenže keď tam dám to delete help, tak sa mi z firstu zmaže práve tá časť help a to čo je na ňu napojené. A práve to nechápem, kedže stým first nemá nič spoločné.


_________________
NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 24.05.2012 21:59 | Linked list - insert

To, čo je na help napojené sa ti v skutočnosti nezmaže, len prídeš o prístup k ten pamäti = memory leak. (ak nemáš definovaný rekurzívny deštruktor)

Kadopádne, chápeš to celé úplne zle. temp nie je kópia first, temp je len nový ukazateľ, ktorý ukazuje na rovnakú pamäť ako first (aj first je len ukazateľ)
Ďalej help, ty operátorom new povieš: "Ja chcem pamäť a chcem jej toľkoto!" (toľkoto = sizeof(štruktúra)) a tú pamäť aj dostaneš a ako bonus dostaneš aj ukazateľ na jej začiatok, aby si k nej vedel pristupovať. No a keď si ju zmažeš, tak si ju holt zmažeš, tvoja smola :P

Prečítaj si niečo o organizovaní pamäte. Ktoré premenné sa kde ukladajú (heap/stack/data sector) a hlavne si ešte raz prejdi kapitolu o ukazateľoch a dynamickej alokácií pamäte :)


Offline

Skúsený užívateľ
Skúsený užívateľ
Linked list -  insert

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 24.05.2012 22:04 | Linked list - insert

Pokusim sa ti to vysvetlit, len dufam, ze sa do toho este viac nezamotas.

street_punk píše:
Temp je vlastne kópia firstu, takže je to zhodne

Nie tak celkom. Smernik je iba premenna, ktora nesie adresu. Temp nesie tu istu adresu, aku first. Ak nieco zapises na *temp, prejavi sa to aj na *first. Cize neda sa povedat, ze je to kopia

street_punk píše:
Help nie je ničoho kópia, takže keď ho odstranim, nemalo by sa nič stať, kedže je to už všetko uložene vo firste

Vo firste nemoze byt nic ulozene, nakolko first je stale iba smernik - smernik na prvu polozku zoznamu. Musis si uvedomit, ze cely zoznam je iba zhluk alokovanych casti pamate, ktore navzajom jedna na druhu ukazuju a tym padom sa da prechadzat cez jednotlive polozky pomocou smernikov.

V tomto clanku som popisal, ako funguju smerniky. Z tem, ktore si tu uz zalozil, usudzujem, ze ty nemas problemy so smernikmi, len v tomto konkretnom pripade si zrejme nevies dat do suvisu, ako su navzajom previazane. Prezri si v tom clanku aspon obrazky, mozno ti to trocha pomoze. V skratke: zoznam je zlozeny z jednotlivych kuskov, ktore su dynamicky alokovane. Preto nemozes ak alokujes pamat ( hoc jej das nazov temp, je to iba kus pamate ) a priradis ju niekde do tvojho zoznamu, tuto pamat zmazat, lebo prerusis tym samotny zoznam.


Offline

Užívateľ
Užívateľ
Linked list -  insert

Registrovaný: 09.04.11
Prihlásený: 11.01.14
Príspevky: 257
Témy: 26 | 26
Bydlisko: Kesa
Napísal autor témyOffline : 25.05.2012 10:11 | Linked list - insert

hej, ja v celku chápem tým smerníkom, len to neviem moc popísať, píšem to po svojom. Vedel som že, temp mi nevytvorí nejakú novú pamäť a z kopíruje mi do ten všetky údaje z hlavnej pamäte. to by som musel použiť new aby sa tak stalo. Vedel som, že robím s tou istou pamäťou len pod inými "menami" .
A teraz keď som si to tak prešiel v hlave, už viem prečo nemôžem vymazať help.
Kód:
 temp->next = help; //nakoniec k pomocnemu zoznamu doplnime postupnost

Práve v tomto riadku sa mi napájama help a kedže teraz help nie je nič iný, ako jedno z mien pre tú pamäť, a ja ho odstránim, tak stratím prístup k tej pamäti s hocijakým iným menom.
P.s: Keď to aj tak nie je napísané správne, tak to nechajte tak, ja to chápem, len to neviem dobre popísať :D

Ten článok je vynikajúci. Všimol som si, že plánuješ napísať podobný článok aj o dvojrozmerných poliach. Ten by som aj ja uvítal, s dvojrozmernými poliami som sa nejak moc nezaoberal.


_________________
NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n
Offline

Skúsený užívateľ
Skúsený užívateľ
Linked list -  insert

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 25.05.2012 10:18 | Linked list - insert

street_punk píše:
Práve v tomto riadku sa mi napájama help a kedže teraz help nie je nič iný, ako jedno z mien pre tú pamäť, a ja ho odstránim, tak stratím prístup k tej pamäti s hocijakým iným menom.

Presne tak, teraz tomu chapes spravne :) A ano, niekedy zaciatkom juna dufam pribudne aj druhy clanok, vdaka za pochvalu.


 [ Príspevkov: 7 ] 


Linked list - insert



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

mnohonásobný insert

v Backend

2

524

26.04.2010 2:39

Feko

V tomto fóre nie sú ďalšie neprečítané témy.

Insert ID

v Databázy

4

789

21.06.2009 11:26

neopagan

V tomto fóre nie sú ďalšie neprečítané témy.

INSERT INTO

v Backend

15

1226

01.06.2009 17:15

Draex

V tomto fóre nie sú ďalšie neprečítané témy.

Veľky insert - problem

v Databázy

8

858

06.05.2009 14:54

Hue

V tomto fóre nie sú ďalšie neprečítané témy.

SQL INSERT INTO SELECT

v Databázy

1

562

18.10.2015 15:48

BX

V tomto fóre nie sú ďalšie neprečítané témy.

TinyMCE Insert Link - otazka

v Ostatné

1

580

09.06.2010 14:24

Revolution

V tomto fóre nie sú ďalšie neprečítané témy.

Insert correct SIM card

v Prenosné zariadenia

4

1111

15.12.2009 21:45

dom34

V tomto fóre nie sú ďalšie neprečítané témy.

vynechanie tabulky pri INSERT INTO

v Backend

5

609

02.03.2008 21:56

max-m

V tomto fóre nie sú ďalšie neprečítané témy.

[SQL] Oracle - vnoreny INSERT vo Fukcii

v Databázy

15

1296

13.05.2010 13:04

coldak

V tomto fóre nie sú ďalšie neprečítané témy.

TODO LIST

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Oznámenia a návrhy

34

4568

16.06.2006 0:18

JanoF

V tomto fóre nie sú ďalšie neprečítané témy.

White List!

v Hry a herné konzoly

7

881

08.03.2012 17:56

MAFI5

V tomto fóre nie sú ďalšie neprečítané témy.

Kontakt list

v Backend

8

1335

05.07.2008 10:13

Mysql_dodo

V tomto fóre nie sú ďalšie neprečítané témy.

crawler list

v SEO, marketing a reklama

3

857

07.09.2010 20:18

shaggy

V tomto fóre nie sú ďalšie neprečítané témy.

Záručný list

v Obchody, reklamácie a právo

1

1737

13.07.2017 16:09

michalesku

Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie.

Crawler list

v SEO, marketing a reklama

2

104275

12.05.2007 2:46

JanoF

V tomto fóre nie sú ďalšie neprečítané témy.

zarucny list (faktura)

v Obchody, reklamácie a právo

2

1308

23.02.2008 21:06

prkyyynko



© 2005 - 2026 PCforum, edited by JanoF