[ Milan Aksic @ 21.07.2001. 19:14 ] @
U ucenju C/C++ definitivno najvise me koce povezane liste. Ubice me. Neke osnove liste kapiram ali kada u knjizi naidjem na primer koji se prostire na nekoliko stranica i onda daju neko sturo objasnjenje ... izbaci me odmah. Da li bi neko prvenstveno predator, mogao da mi objasni sledeci primer.
Nisam naveo sve izveden klase jer su ostale tri izvedene klase slicne izvedenoj klasi 'Administrator'.

// definicija roditeljske klase
class ACC
{
friend class Payroll;
protected:
char LastName[NAME_LENGHT],
FirstName[NAME_LENGHT],
Title[TITLE_LENGHT],
SSNumber[SOCIAL_SECURITY_LENGHT];
int DateHired;
ACC *pointer;
ACC *NextNodePtr;
public:
ACC(char *LName, char *FName, char *SS, char *Job, int DHired)
{
strcpy(LastName, LName);
strcpy(FirstName, FName);
strcpy(SSNumber, SS);
strcpy(Title, Job);
DateHired = DHired;
NextNodePtr = 0;
}
ACC()
{
LastName[0] = NULL;
FirstName[0] = NULL;
SSNumber[0] = NULL;
Title[0] = NULL;
DateHired = 0;
NextNodePtr = 0;
}
void InitLastName(char *LName)
{
strcpy(LastName, LName);
}

void InitFirstName(char *FName)
{
strcpy(FirstName, FName);
}

void InitSSNumber(char *SS)
{
strcpy(SSNumber, SS);
}

void InitTitle(char *OName)
{
strcpy(Title, OName);
}

void InitDateHired(int DHired)
{
DateHired = DHired;
}

virtual void Add_Data(void)
{}

virtual void Send_Data(void)
{
cout << "nn" << LastName << ", " << FirstName
<< "n Broj socijalnog osiguranja: #" << SSNumber
<< "n Ime posla: " << Title
<< "n Godina zaposljavanja: " << DateHired;
}
};

// Definicija klase potomka, ovo je prva izvedena klasa koju sam naveo
// i zadnja jer su ostale tri slicne, sa istom shemom
class Administrator:public ACC
{
friend class Payroll;
private:
float YearlySalary;
public:
Administrator(char *LName, char *FName, char *SS, char *Job,
int DHired, float YSalary):
ACC(LName, FName, SS, Job, DHired)
{
YearlySalary = YSalary;
}

Administrator():ACC()
{
YearlySalary = 0.0;
}

void InitYearlySalary(float Salary)
{
YearlySalary = Salary;
}

void Add_Data(void)
{
pointer = this;
}

void Send_Data(void)
{
ACC::Send_Data();
cout << "n Godisnja plata: $" << YearlySalary;
}
};

// DEFINICIJA KLASE PRIJATELJA
class Payroll
{
private:
ACC *location;
public:
Payroll(void)
{
location = 0;
}
void PrintPayroll(void);
void AddEmployee(ACC *node);
void RemoveEmployee(char *SSNumver);
};

void Payroll::PrintPayroll(void)
{
ACC *present = location;
while (present != 0)
{
present -> Send_Data();
present = present -> NextNodePtr;
}
}
void Payroll::AddEmployee(ACC *node)
{
ACC *current_node = location;
ACC *previous_node = 0;
while (current_node != 0 &&
strcmp(current_node -> LastName, node -> LastName) < 0)
{
previous_node = current_node;
current_node = current_node -> NextNodePtr;
}
node -> Add_Data();
node -> pointer -> NextNodePtr = current_node;
if (previous_node == 0)
location = node -> pointer;
else
previous_node -> NextNodePtr = node -> pointer;
}

void Payroll::RemoveEmployee(char *SSNumber)
{
ACC *current_node = location;
ACC *previous_node = 0;
while (current_node != 0 &&
strcmp(current_node -> SSNumber, SSNumber) != 0)
{
previous_node = current_node;
current_node = current_node -> NextNodePtr;
}
if (current_node != 0 && previous_node == 0)
{
location = current_node -> NextNodePtr;
// brise current_node; bilo bi potrebno delete da je koriscen
// new() u Add_Data()
}
else if (current_node != 0 && previous_node != 0)
{
previous_node -> NextNodePtr = current_node -> NextNodePtr;
// brise current_node; bilo bi potrebno delete da je koriscen
// new() u Add_Data()
}
}

void main(void)
{
Payroll EmployeeList;
Administrator VP1 ("Williams", "Ken", "111-12-2121",
"Potpresednik", 1980, 40000.00);
Administrator VP2 ("Hardgrave", "Bob", "987-99-9653",
"Direktor Prodaje", 1984, 45000.00);

// ovde dolaze i deklaracije objekata ostale tri izvedene
// klase koje nisam naveo
EmployeeList.AddEmployee(&VP1);
EmployeeList.AddEmployee(&VP2);

EmployeeList.PrintPayroll();

EmployeeList.RemoveEmployee("111-12-2121");

cout << "nn=================================";

EmployeeList.PrintPayroll();
}

I to je ceo program. E sada najbolje bi bilo kada bi neko mogao da mi objasni celu povezanu listu 'mislim na predatora :)' ali ako se ne moze onda ovako. Ko do k**** uvecava i menja prvi put pokazivac 'location' klase Payroll, isto i za pokazivac 'NextNodePtr' klase ACC ko menja taj pokazivac. Onda koje svrhe ima da na kraju funkcije clanice 'AddEmployee()' u klasi Payroll stavljaju:
else
previous_node -> NextNodePtr = node -> pointer;
kada se pokazivac 'previous_node' brise kada se izadje iz funkcije, jer je lokalna, koja je onda svrha postavljanje na drugi objekat?

Svako dodatno objasnjenje ove liste u vezi mehanizma ce mi dobro doci.

Pozdrav.
[ Vojislav Milunovic @ 22.07.2001. 01:36 ] @
U listama nisam neki majstor,znam osnovne operacije nad njima,dovoljno da mogu da razumem sta i kako kada citam neku listu. (taskovi u okviru samog kernela ili lista modula):

Evo dacu ti jedan najobicniji pimer liste koja ima dva pravca i nije kruzna : kraj i pocetak liste sam oznacio sa NULL.Svaki clan liste pokazuje na prethodni i sledeci.
Evo jednog primera takve liste:
Code:

#include<unistd.h>
#include<stdlib.h>

struct cvor {
 int pid;
 struct cvor *next;
 struct cvor *prev;
};

int insert_cvor(struct cvor *current){
  struct cvor *next;
  struct cvor *prev;
  next = malloc(sizeof(struct cvor));
  next -> next = current -> next;
  next -> prev = current;
  current -> next = next;
  next -> pid = current -> pid + 1;
}

int delete_cvor(struct cvor *current){
  struct cvor *hi,*low;
  hi = current -> next;
  low = current -> prev;
  low -> next = hi;
  hi -> prev = low;
  free(current);
}

int main(){
 int i;
 struct cvor pocetak,*p;
 p = &pocetak;
 p->pid = 0;
 p->next = NULL;
 p->prev = NULL;
 for ( i = 0 ; i < 20 ; i++ ){
    insert_cvor(p);
    p = p->next;
 }

 for (p = &pocetak ;p != NULL; p = p->next ){
   printf("%dn",p->pid);
   if ( p -> pid == 10 )
     delete_cvor(p);
 }
 for (p = &pocetak ;p != NULL; p = p->next )
   printf("%dn",p->pid);
}


ova druga for petlja stampa sve pidove i pokazuje da je lista sa pidom 10 izbrisana.

Mada uvek mozes da imas kruznu listu gde je oblik nesto ovakvog tipa:

Code:

struct cvor{
 int pid;
 struct cvor *next;
};


gde se lista vrti u krug.Zatim mozes da imas i listu gde se pokazuje na svaki prethodni clan (moduli na Linuxu 2.2.x kernel ,ne znam za 2.4.x)

Nadam se da sam ovim postom nesto pomogao u vezi listica.
[ Milan Aksic @ 22.07.2001. 04:27 ] @
Pa predo da budem iskren i nisi bas :( Potrebno mi je objanjenj u vezi ovog mog koda, konkretno u vezi onih pitanja koje sam naveo. Jer prvu navedenu listu u knjizi sam razumeo, ali ovu ne, i ne da mi se da pocnem da ucim ostalo dok to dobro ne razumem.
Usput da mozda nezas da postoji neka knjiga, bilo strana ili domaca, a da govori o ovoj temi.
Pozdrav.
[ Vojislav Milunovic @ 22.07.2001. 12:11 ] @
hmm, probaj sa C programming language u njoj stvarno nema sta nema.
Ajde pogledacu ovaj kod pa cu da vidim sta je sta pa da vidim da pomognem
[ Vojislav Milunovic @ 22.07.2001. 13:25 ] @
U payroll klasi imas pointer *location koji se inicijalizuje na 0 po kreiranju samog objekta
Code:

// DEFINICIJA KLASE PRIJATELJA 
class Payroll 

private: 
ACC *location; 
public: 
Payroll(void) 

location = 0; 
}


Ok znaci kad se kreira objektat location pokazuje na 0.Znaci u main() kada napravis:
Code:

void main(void) 
 { 
 Payroll EmployeeList;


tu location unutar samog objekta pokazuje na 0 jer je konstruktor klase tako rekao ;o)

Code:

 Administrator VP1 ("Williams", "Ken", "111-12-2121", 
 "Potpresednik", 1980, 40000.00); 
  Administrator VP2 ("Hardgrave", "Bob", "987-99-9653", 
 "Direktor Prodaje", 1984, 45000.00);


Inicijalizacija i kreiranje dva objekta koje ces da ubacis u listu.

Code:

EmployeeList.AddEmployee(&VP1); 
EmployeeList.AddEmployee(&VP2);


E sad treba da se ubacimo u funkciju i nju pazljivo da analiziramo :

Code:

void Payroll::AddEmployee(ACC *node) 

ACC *current_node = location; 
ACC *previous_node = 0; 
while (current_node != 0 && 
strcmp(current_node -> LastName, node -> LastName) < 0) 

previous_node = current_node; 
current_node = current_node -> NextNodePtr; 



Za prvog Administratora se ovaj deo preskace jer je current_node = 0 (zato sto je location = 0 ) ili ovo strcmp() vrsi neku vrstu sortiranja u odnosu na prezimena.

Code:

node -> Add_Data(); 


setuje pointer na pokazivac this koji pokazuje na trenutni objekat unutar funkcije clanice klase(valjda tako bese)

Code:

node -> pointer -> NextNodePtr = current_node; 


Ovde se NextNodePtr postavlja da pokazuje na current.

Code:

if (previous_node == 0) 
location = node -> pointer; 
else 
previous_node -> NextNodePtr = node -> pointer; 



Ako je previous_node = 0 tj. ako je ovo prvi put da se ulece u ovu funkciju location se postavlja da pokazuje na prvi clan liste.

Sa delete je slican princip.a lista bi trebalo hmmm da bude jednosmerna i location pokazuje uvek na prvi clan liste.

[Ovu poruku je menjao predator dana 07-22-2001 u 12:31 PM GMT]
[ kajla @ 22.07.2001. 17:37 ] @
Citat:
passanger je napisao:
Pa predo da budem iskren i nisi bas :( Potrebno mi je objanjenj u vezi ovog mog koda, konkretno u vezi onih pitanja koje sam naveo. Jer prvu navedenu listu u knjizi sam razumeo, ali ovu ne, i ne da mi se da pocnem da ucim ostalo dok to dobro ne razumem.
Usput da mozda nezas da postoji neka knjiga, bilo strana ili domaca, a da govori o ovoj temi.
Pozdrav.


Imam ja super knjigu na engleskom, gde je lepo objasnjeno sve u vezi sa LINKED LISTS, mozda bi mogao da iskeniram poglavlje: "ARRAYS,LINKED LISTS AND STACKS" pa da ti posaljem posto je knjiga dosta stara(izdata je pre oko 20 - ne znam tacno), pa ne verujem da ces je naci.

poz.
[ Vojislav Milunovic @ 22.07.2001. 17:40 ] @
Ako si iz bg,ja sam uvek zainteresovan za bilo kakvo stivo u vezi C ;o)
[ Milan Aksic @ 22.07.2001. 20:59 ] @
Citat:
kajla je napisao:
Citat:
passanger je napisao:
Pa predo da budem iskren i nisi bas :( Potrebno mi je objanjenj u vezi ovog mog koda, konkretno u vezi onih pitanja koje sam naveo. Jer prvu navedenu listu u knjizi sam razumeo, ali ovu ne, i ne da mi se da pocnem da ucim ostalo dok to dobro ne razumem.
Usput da mozda nezas da postoji neka knjiga, bilo strana ili domaca, a da govori o ovoj temi.
Pozdrav.


Imam ja super knjigu na engleskom, gde je lepo objasnjeno sve u vezi sa LINKED LISTS, mozda bi mogao da iskeniram poglavlje: "ARRAYS,LINKED LISTS AND STACKS" pa da ti posaljem posto je knjiga dosta stara(izdata je pre oko 20 - ne znam tacno), pa ne verujem da ces je naci.

poz.


E kalja daj ako ti nije problem vidi da li mozes da iskeniras i posaljes mi, stvarno mi puno znaci.
Pozdrav.
[ Milan Aksic @ 22.07.2001. 21:03 ] @
Thanks predo, ali mi nisi odgovorio na mozda najvaznije pitanje. Zasto se pod else u funkciji AddEmployee() pokazivac 'prevous_node -> NextNodePtr' na kraju inicijalizuje da pokazuje na 'node_pointer', kada je 'prevous_node' lokalni pokazivac, jer je deklarisan u funkciji, i onda kada se izadje iz funkcije on se brise, jel tako? Koja je onda svrha inicijalizovati ga na kraju???
[ Vojislav Milunovic @ 22.07.2001. 22:26 ] @
Code:

void Payroll::AddEmployee(ACC *node) 

ACC *current_node = location; 
ACC *previous_node = 0; 
while (current_node != 0 && 
strcmp(current_node -> LastName, node -> LastName) < 0) 

previous_node = current_node; 
current_node = current_node -> NextNodePtr; 

node -> Add_Data(); 
node -> pointer -> NextNodePtr = current_node; 
if (previous_node == 0) 
location = node -> pointer; 
else 
previous_node -> NextNodePtr = node -> pointer; 



pointer pokazuje na samog sebe . Ova funkcija ubacuje Administratora u listu tako sto nadje po sortiranju ili kraj ili neku zlatnu sredinu. Zatim pravi previous -> pre ubacivanja i current koja je sledeca i izmedju njih ubacuje jednog clana liste.
Znaci :
previous_node -> NextNodePtr = node -> pointer kaze ovako nesto :

previous -> node -> current -> ... -> NULL

Nadam se da sam sad bio donekle jasniji,ako nije jasno opet da objasnim ovaj deo.
[ kajla @ 23.07.2001. 14:03 ] @
Citat:
passanger je napisao:
E kalja daj ako ti nije problem vidi da li mozes da iskeniras i posaljes mi, stvarno mi puno znaci.
Pozdrav.

OK, danas ili sutra cu da iskeniram pa cu da posaljem.

poz.

PS. iz bg sam...
[ leka @ 03.08.2001. 11:39 ] @
Zao mi je sto ne pomazem nego samo zezam, ali sam samo hteo da dodam da mi odmah nije dobro kad vidim void main(void)
[ Vojislav Milunovic @ 03.08.2001. 17:44 ] @
Citat:
leka je napisao:
Zao mi je sto ne pomazem nego samo zezam, ali sam samo hteo da dodam da mi odmah nije dobro kad vidim void main(void)


Uuuuuuuuuuuuuuuuuuaaaaaaaaaaaaaaa ;o))