Dinamicke strukture u C-u. Linearne liste...

Dinamicke strukture u C-u. Linearne liste...

offline
  • Pridružio: 23 Sep 2005
  • Poruke: 6

Ovo ide copy-paste vec par dana sa foruma na forum. Cisto da znate ako ga sretnete negde, heh Smile
Dakle, molim za pomoc:
-Znam sintaksu strukture, znam i kako se pristupa podacima i sve sto je osnov za rad sa njima. E, sad nastupa problem...
Sva literatura koju imam, a imam je sasvim dovoljno, osim informacije da u jednostruku (takozvanu linearnu) listu moram da uvezem (z kao zaba)samoreferencirajuce liste ne daju mi objasnjenje kako da to uradim na ovom nivou na kome sam ja, vec to poprilicno zakomplikuju.
Sta mi treba?
Evo ovako: Uzmimo strukturu koja ima samo jedan int (ili neki drugi) clan i onaj neophodan pokazivac na "samu sebe". Ovde svaki udzbenik krene sa budalastinama tipa: "e, sad,recimo da lista ima 4 clana(cvora)...." ili ovako:"Posto prvi(head) pokazuje na drugi cvor, napravicemo jos jedan..."
Pretpostavimo da nisam glup.
Molim da mi neko "laicki" objasni najprostiji postupak sa pomenutom najprostijom strukturom, uz objasnjenje KAKO pokazivac jedne inicijalizujem na adresu sledece strukture.
Najbolje bi bilo klasicno: neki maleni kod uz komentar sa strane.
Pravljenje novih i brisanje postojecih cvorova cu onda i sam shvatiti.
'Ajde, please, pomozite Smile
PS: ako moze bez pokazivaca na pokazivac, slozene konstrukcije te vrste nisam jos ucio pa mi je to dodatni smor...



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Čisto sumnjam de će moći bez pokazivača na pokazivač. U suštini, moglo bi, ali ćeš tek onda zakomplikovati stvari. Pazi ovako. Za početak napravi samoreferencirajuću listu (kad bih samo znao šta je ovo), i poigraj se sa njom. Šta sve može da radi i kako joj pristupaš (ubacivanje prvog člana, ubacivanje nekog drugog člana, brisanje prvog, brisanje bilo kog, ...). Posle toga, ako baš ne želiš pokazivač na pokazivač (ili na listu) napravi struct koji će sadržati tu listu i, recimo, broj članova u listi koju struct sadrži. Trebalo bi da ti je ovo relativno jednostavno. Posle ti jedino ostaje da u struct ubaciš pokazivač na sledeći struct istog tipa, i eto ti liste.

PS. Ako pretpostavimo da sam dobro shvatio šta ti želiš da radiš, ovo je ono što bih ja uradio. Mislim da je mnogo bolje objašnjenje nego da sam ti napisao parče koda, ali možda ti drugačije razmišljaš.



offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Meni je seminarski iz C++ bio da napisem klasu za Linked List (iz tvog posta sam skontao da je to to sto trazis). Ako hoces, mogu da nakacim ovde ceo kod.

offline
  • Pridružio: 23 Sep 2005
  • Poruke: 6

bobby ::Meni je seminarski iz C++ bio da napisem klasu za Linked List (iz tvog posta sam skontao da je to to sto trazis). Ako hoces, mogu da nakacim ovde ceo kod.

Ne znam ni C, a kamoli C++ Shocked

Znao sam da me necete razumeti, skroz se lose izrazavam Sad ....
Evo ovde imam primer zadatka sa ispita. Znaci prosto ko' pasulj ali ja nemam lekcije ni beleske sa predavanja i samo mi treba komentar zadatka da skapiram sta se radi u donjem delu zadatka kad se dinamicki dodeljuje memorija novim cvorovima (ako sam skapirao kako treba).
----------------------------- kod -------------------------------------- //Прављење уланчане листе //Претпоставимо да су чворови листе структуре које садрже две //промељиве један податак (типа int) и једну //адресу на наредну структуру. Подаци које треба да садржи листа су //2, 15, 8, 24, 34. //Решење: #include<stdio.h> #include<malloc.h> struct jedna_lista {          int podatak;          struct jedna_lista *sled_adresa; }; main() {            struct jedna_lista *prvi, *poslednji, *novi_cvor;            int vrednost[5]={2,15,8,24,34};            int i;            prvi=NULL;            poslednji=NULL;            novi_cvor=NULL;            for(i=0; i<5; i++)           {           novi_cvor = malloc(sizeof(struct jedna_lista));                     if(novi_cvor)                      {                      novi_cvor->podatak=vrednost[i];                      novi_cvor->sled_adresa=NULL;                      }                      else                      break;                      if(prvi==NULL)                      {                      prvi=novi_cvor;                      poslednji=novi_cvor;                       }                       else           {             poslednji->sled_adresa=novi_cvor;             poslednji=novi_cvor;             }             }   } ------------------------- kraj koda --------------------------------------------
Znaci, samo precizan komentar ovog zadatka i nista vise mi ne treba.
Hvala na trudu Smile

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Iskomentarisaću samo for petlju, pošto ako ono iznad čovek ne zna (ne samo ti, dejančo), knjigu u šake i sve iz početka. Daklem...
novi_cvor = malloc(sizeof(struct jedna_lista));
sizeof vraća veličinu struct jedna_lista, a malloc alocira memoriju u veličini parametra. Daklem, pseudo kod bi glasio `alociraj memoriju veličine koliko je potrebno za struct jedna_lista i postavi adresu te memorije u novi_cvor`.

if(novi_cvor) {     novi_cvor->podatak=vrednost[i];     novi_cvor->sled_adresa=NULL; }
Pseudokod: ako je novi čvor dobio adresu koja nije NULL, podatak postavi na i-tu vrednost, a adresu sledećeg čvora u listi postavi na NULL

else break;
Pseudokod: ako je novi čvor dobio adresu NULL, znači da malloc nije uradio posao kako valja i izađi iz for petlje

if(prvi==NULL) {     prvi=novi_cvor;     poslednji=novi_cvor; }
Pseudokod: ako je lista prazna, novi_cvor postaje i prvi i poslednji

else {     poslednji->sled_adresa=novi_cvor;     poslednji=novi_cvor; }
Pseudokod: Ako lista nije prazna, neka sled_adresa trenutno poslednjeg čvora pokazuje na novi_cvor, a potom neka novi_cvor postane poslednji.

Dovoljno jasno?

PS. OBAVEZNO nauči da formatiraš source kako treba. Ne moraš kao ja, samo da je čitljivo!!! Više mi je vremena trebalo da povijam koji else se na koji if odnosi i sl. U prevodu, pomozi nam da ti pomognemo

offline
  • Pridružio: 23 Sep 2005
  • Poruke: 6

E, hvala ti , sad cu da prostudiram sta si napisao...
meka ::Iskomentarisaću samo for petlju, pošto ako ono iznad čovek ne zna (ne samo ti, dejančo), knjigu u šake i sve iz početka.

Ma, razumljivo. Zato sam i rekao:
ja u prethodnom postu: ::..samo mi treba komentar zadatka da skapiram sta se radi u donjem delu zadatka kad se dinamicki dodeljuje memorija novim cvorovima (ako sam skapirao kako treba)...
a to je for petlja, zar ne Wink

meka ::
PS. OBAVEZNO nauči da formatiraš source kako treba. Ne moraš kao ja, samo da je čitljivo!!! Više mi je vremena trebalo da povijam koji else se na koji if odnosi i sl. U prevodu, pomozi nam da ti pomognemo


Ja znam da je ruzno, ali kad sam ga iskopirao u prostor za poruke ovde na forumu, on ga je poravnao po levoj strani. Ceo dan blejim u ekran i bas sam nameravao da jednom legnem pre ponoci, tako da sam ofrlje poravnao zagrade... E, sad, mislim da sam samo zadnju else zeznuo, posto sam ucen da pomeram na unutra samo one koje se gnezde. Doduse, pokoji [enter] ne bi bio suvisan...

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Da ti forum ne bi poravnao tekst po levoj strani, koristi CODE tagove:
[code] Programski kod [/code]

offline
  • Pridružio: 23 Sep 2005
  • Poruke: 6

bobby ::Da ti forum ne bi poravnao tekst po levoj strani, koristi CODE tagove:
[code] Programski kod [/code]


Kako sam glup !

Ko je trenutno na forumu
 

Ukupno su 846 korisnika na forumu :: 4 registrovanih, 0 sakrivenih i 842 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: draggan, MilosKop, Shilok, zlaya011