// kratak pocetni tutorial za jednostavno povezane liste
// by [email protected]
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
typedef struct _imenik
{
char ime[30];
char prezime[30];
char adresa[50];
char telefon[20];
} imenik ;
typedef struct _automobil
{
char model[30];
char snagaks[3];
char maksbrzina[3];
char cena[6];
} automobil ;
// sledeca struktura sadrzi same podatke u vidu pokazivaca na bilo koju strukturu ili tip (void*) kao i pokazivac na sledeci element liste.
// pNext se koristi kao veza izmedju aktuelnog i sledeceg elementa ,
// u ovom slucaju govorimo o jednostavno povezanoj listi. Duplopovezane liste sadrze dodatno i pokazivac
// pPrev koji omogucuje kretanje po listi u obadva pravca jer pokazuje na predhodni element
typedef struct _element
{
[B][COLOR="Red"]void* [/COLOR][/B] pData;
_element* pNext;
} element;
// Pokazivac PListHead pokazuje uvek na pocetak Liste inicializira se samo jednom u dodaj_element funkciji
element* pListHead = NULL;
// Pokazivac PListWork je radni pokazivac i koristi se za pretrazivanje liste , kretanju po istoj
element* pListWork = NULL;
///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
// funkcija pronadji_zadnjiElement prolazi listu do kraja i vraca zadnji element
////////// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
element* pronadji_zadnjiElement()
{
// krecemo iz pocetka zato radni pokazivac stavljamo na pocetak.
pListWork = pListHead;
element* pLast = NULL;
// Dok ima elemenata u listi
while(pListWork != NULL)
{
pLast = pListWork;
pListWork = pListWork->pNext;
}
return pLast;
}
///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
// funkcija dodaj element rezervise memoriju za novi element i dodaje ga u listu
// kao i obezbedjuje ukoliko je lista prazna da se initializira PListHead pokazivac
////////// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
element* dodaj_element([B][COLOR="Red"]void* [/COLOR][/B]pNoviPodaci)
{
element* pZadnji = NULL;
// alokiraj memoriju za novi element liste
element* pNoviElement = (element*) malloc(sizeof(element));
// ukoliko nema dovoljno memorije za malloc vrati NULL
if(pNoviElement == NULL)
return NULL;
// ukoliko lista nije prazna
if(pListHead != NULL)
pZadnji = pronadji_zadnjiElement(); // idi do kraja liste i vrati zadnji element
else
pListHead = pNoviElement; // u suprotnom novo rezervisani element postaje i pocetak liste
// , a kako bi bilo drugacije :)
pNoviElement->pData = pNoviPodaci; // dodeli novom elementu liste i podatke
// zadnji element u listi ima na pokazivacu pNext uvek NULL zato
// dodeljujemo novom elementu koji ce kad se doda upravo biti zadnji i tu vrednost.
pNoviElement->pNext = NULL;
if(pZadnji != NULL) // ukoliko je postojao zadnji
pZadnji->pNext = pNoviElement; // povezujemo aktuelni zadnji element sa novim elementom.
// vrati novi element
return pNoviElement;
}
///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
// funkcija ucitaj , preuzima podatke od korisnika i vraca rezervisani objekat sa podacima nazad
////////// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
imenik* ucitaj()
{
// rezervisi memoriju za novi imenik
imenik* pNoviImenik = (imenik*) malloc(sizeof(imenik));
// ukoliko nema dovoljno memorije za malloc vrati NULL
if(pNoviImenik == NULL)
return NULL;
// preuzmi podatke od korisnika
printf("\n");
printf("Unesite ime osobe: ");
scanf("%s",pNoviImenik->ime);
printf("Unesite prezime osobe: ");
scanf("%s",pNoviImenik->prezime);
printf("Unesite adresu osobe: ");
scanf("%s",pNoviImenik->adresa);
printf("Unesite telefon osobe: ");
scanf("%s",pNoviImenik->telefon);
printf("\n");
// vrati objekat sa unetim podacima
return pNoviImenik;
}
///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
// funkcija ucitaj , preuzima podatke od korisnika i vraca rezervisani objekat sa podacima nazad
////////// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
automobil* ucitaj_auto()
{
// rezervisi memoriju za novi automobil
automobil* pNoviAuto = (automobil*) malloc(sizeof(automobil));
// ukoliko nema dovoljno memorije za malloc vrati NULL
if(pNoviAuto == NULL)
return NULL;
// preuzmi podatke od korisnika
printf("\n");
printf("Unesite model automobila : ");
scanf("%s",pNoviAuto->model);
printf("Unesite snagu automobila: ");
scanf("%s",pNoviAuto->snagaks);
printf("Unesite brzinu automobila: ");
scanf("%s",pNoviAuto->maksbrzina);
printf("Unesite cenu automobila: ");
scanf("%s",pNoviAuto->cena);
printf("\n");
// vrati objekat sa unetim podacima
return pNoviAuto;
}
void stampaj_listu()
{
// krecemo iz pocetka zato radni pokazivac stavljamo na pocetak.
pListWork = pListHead;
// dok ima elemenata u listi
while(pListWork != NULL)
{
printf("%s %s %s %s\n",((imenik*)pListWork->pData)->ime,
((imenik*)pListWork->pData)->prezime,
((imenik*)pListWork->pData)->adresa,
((imenik*)pListWork->pData)->telefon);
pListWork = pListWork->pNext;
}
}
void stampaj_listu_automobil()
{
// krecemo iz pocetka zato radni pokazivac stavljamo na pocetak.
pListWork = pListHead;
// dok ima elemenata u listi
while(pListWork != NULL)
{
printf("%s %s %s %s\n",((automobil*)pListWork->pData)->model,
((automobil*)pListWork->pData)->snagaks,
((automobil*)pListWork->pData)->maksbrzina,
((automobil*)pListWork->pData)->cena);
pListWork = pListWork->pNext;
}
}
///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
// funkcija obrisi_listu , cisti sve rezervisane elemente odnosno alokiranu memoriju za iste.
// obavezno je pozivanje na kraju programa !
////////// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// ///// /////
void obrisi_listu()
{
if(pListHead == NULL) // ako je lista prazna nemamo sta da brisemo
return;
// krecemo iz pocetka zato radni pokazivac stavljamo na pocetak.
pListWork = pListHead;
// sve dok ima sledeceg elementa u listi
while(pListWork != NULL)
{
element* pElement = pListWork;
// pre nego ocistimo aktuelni element prebacujemo pokazivac na
// sledeci u suprotnom bi izgubili tu informaciju
pListWork = pListWork->pNext;
// oslobodi memoriju za podatke
free(pElement->pData);
// oslobodi memoriju za element
free(pElement);
}
// sobzirom da smo sve izbrisali ponovo mozemo staviti pListHead na vrednost NULL
pListHead = NULL;
}
int main(int argc, char* argv[])
{
char odluka[3];
do
{
// ucitaj podatke za novi imenik
imenik* pImenik = ucitaj();
if(pImenik != NULL) // ukoliko nije doslo do neke greske
dodaj_element(pImenik); // dodaj nove podatke u listu
printf("Da li zelite da unesete jos podataka (da/ne): ");
scanf("%s",odluka);
}
while(strcmp(odluka,"da") == 0);
printf("\npodaci osoba koje ste uneli su :\n ");
stampaj_listu();
obrisi_listu();
/////////////////////////////////////////////////////////
do
{
// ucitaj podatke za novi automobil
automobil* pAutomobil = ucitaj_auto();
if(pAutomobil != NULL) // ukoliko nije doslo do neke greske
dodaj_element(pAutomobil); // dodaj nove podatke u listu
printf("Da li zelite da unesete jos podataka (da/ne): ");
scanf("%s",odluka);
}
while(strcmp(odluka,"da") == 0);
printf("\npodaci automobila koje ste uneli su :\n ");
stampaj_listu_automobil();
obrisi_listu();
return 0;
}