You are on page 1of 17

PROGRAMIRANJE II

A09 – Liste (2. dio)

dr Dražen Brđanin (bdrazen@etfbl.net)


Goran Banjac (goran.banjac@etfbl.net)
Danijela Banjac (danijela.banjac@etfbl.net)
Aleksandar Keleč (aleksandar.kelec@etfbl.net)

2016.
A09 JEDNOSTRUKO POVEZANA LISTA
Napisati program u kojem treba:
• definisati tip CVOR kojim se reprezentuje čvor jednostruko povezane kružne liste
(informacioni sadržaj treba da bude cijeli broj),
• definisati funkciju koja dodaje novi čvor na početak liste,
• definisati funkciju koja dodaje novi čvor na kraj liste,
• definisati funkciju koja dodaje novi čvor iza zadatog čvora,
• definisati funkciju koja dodaje novi čvor ispred zadatog čvora,
• definisati funkciju koja briše čvor iza zadatog čvora,
• definisati funkciju koja briše listu,
• definisati funkciju koja omogućava pretraživanje liste,
• definisati funkciju koja ispisuje sadržaj liste,
• definisati funkciju koja omogućava spajanje dvije liste,
• u glavnom programu ilustrovati rad sa jednostruko povezanom kružnom listom tj.
definisanim funkcijama.

Liste (2. dio) 2


A09 JEDNOSTRUKO POVEZANA LISTA
#include <stdio.h>
#include <stdlib.h>

typedef struct cvor { int podatak; struct cvor *sljedeci; } CVOR;

CVOR* dodaj_pocetak(CVOR **plista, int podatak) {


CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
novi->podatak = podatak;
if (*plista == 0) *plista = novi;
else novi->sljedeci = (*plista)->sljedeci;
(*plista)->sljedeci = novi;
return novi;
}

CVOR* dodaj_kraj(CVOR **plista, int podatak) {


CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
novi->podatak = podatak;
if (*plista == 0) novi->sljedeci = novi;
else {
novi->sljedeci = (*plista)->sljedeci;
(*plista)->sljedeci = novi;
}
*plista = novi;
return novi;
}
Liste (2. dio) 3
A09 JEDNOSTRUKO POVEZANA LISTA
CVOR* dodaj_iza(CVOR **plista, CVOR *cvor, int podatak) {
CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
novi->podatak = podatak;

novi->sljedeci = cvor->sljedeci;
cvor->sljedeci = novi;

if (*plista == cvor) *plista = novi;

return novi;
}

CVOR* dodaj_ispred(CVOR **plista, CVOR *cvor, int podatak) {


CVOR *novi = (CVOR *)malloc(sizeof(CVOR));

novi->podatak = cvor->podatak;
novi->sljedeci = cvor->sljedeci;

cvor->podatak = podatak;
cvor->sljedeci = novi;

if (*plista == cvor) *plista = novi;

return cvor;
}
Liste (2. dio) 4
A09 JEDNOSTRUKO POVEZANA LISTA
int brisi_iza(CVOR **plista, CVOR *cvor) {
CVOR *p = cvor->sljedeci;
if (cvor == p) return 0; void pisi(CVOR *lista) {
cvor->sljedeci = p->sljedeci; if (lista == 0) return;
if (*plista == p) *plista = cvor; CVOR *p = lista;
free(p); do {
return 1; p = p->sljedeci;
} printf(" %d", p->podatak);
} while (p != lista);
void brisi_listu(CVOR **plista) { }
if (*plista == 0) return;
CVOR *p = *plista; void spoji(CVOR **plista1, CVOR *lista2) {
do { if (*plista1 == 0) *plista1 = lista2;
CVOR *q = p->sljedeci; else if (lista2 == 0) return;
free(p); p = q; CVOR *p = (*plista1)->sljedeci;
} while (p != *plista); (*plista1)->sljedeci = lista2->sljedeci;
*plista = 0; lista2->sljedeci = p;
} *plista1 = lista2;
}
CVOR* trazi(CVOR *lista, int podatak) {
if (lista == 0) return 0;
CVOR *p;
for (p = lista; p->podatak != podatak && p->sljedeci != lista; p = p->sljedeci);
return p->podatak == podatak ? p : 0;
}
Liste (2. dio) 5
A09 JEDNOSTRUKO POVEZANA LISTA
int main() {
CVOR *lista1 = 0, *lista2 = 0; int br;
CVOR *c1 = dodaj_pocetak(&lista1, 1);
dodaj_pocetak(&lista1, 2); dodaj_kraj(&lista1, 3);
dodaj_iza(&lista1, c1, 4); dodaj_ispred(&lista1, c1, 5);

dodaj_pocetak(&lista2, 6); dodaj_kraj(&lista2, 7);

printf("Lista 1:"); pisi(lista1); printf("\n");


printf("Lista 2:"); pisi(lista2); printf("\n");

spoji(&lista1, lista2);

printf("Lista 1 (nakon spajanja):"); pisi(lista1); printf("\n");

printf("Unesite broj: "); scanf("%d", &br);


printf("Broj %d %spostoji u Lista 1: 2br,
listi.\n", 5 1trazi(lista1,
4 3 br) ? "" : "ne ");
Lista 2: 6 7
brisi_iza(&lista1, c1); Lista 1 (nakon spajanja): 2 5 1 4 3 6 7
printf("Lista (nakon brisanja):");
Unesitepisi(lista1);
broj: 1 printf("\n");
Broj 1 postoji u listi.
brisi_listu(&lista1);
// brisi_listu(&lista2); Lista (nakon brisanja): 2 5 4 3 6 7
return 0;
}
Liste (2. dio) 6
A09 DVOSTRUKO POVEZANA LISTA
Napisati program u kojem treba:
• definisati tip CVOR kojim se reprezentuje čvor dvostruko povezane liste (informacioni
sadržaj treba da bude string),
• definisati funkciju koja dodaje novi string u listu tako da je poredak elemenata u listi
uvijek u rastućem redoslijedu (ukoliko dati string postoji u listi, ignorisati pokušaj
dodavanja istog stringa),
• definisati funkciju koja upisuje sadržaj liste u datoteku (parametar funkcije),
• definisati funkciju koja omogućava brisanje stringa iz liste,
• definisati funkciju koja briše listu,
• u glavnom programu:
 pročitati sve riječi iz datoteke, čiji je naziv prvi argument komandne linije, i
formirati odgovarajuću dvostruko povezanu listu,
 iz formirane liste izbaciti sve riječi koje se pojavljuju u datoteci čiji je naziv drugi
argument komandne linje,
 sadržaj liste upisati u datoteku čiji je naziv treći argument komandne linije.

Liste (2. dio) 7


A09 DVOSTRUKO POVEZANA LISTA
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct cvor { char rijec[21]; struct cvor *lijevi, *desni; } CVOR;

CVOR* trazi(CVOR *glava, CVOR *rep, char *rijec) {


if (glava == 0) return 0;
while (strcmp(glava->rijec, rijec) < 0 && strcmp(rep->rijec, rijec) > 0)
{ glava = glava->desni; rep = rep->lijevi; }
return strcmp(glava->rijec, rijec) == 0 ? glava :
(strcmp(rep->rijec, rijec) == 0 ? rep : 0);
}
void pisi(CVOR *glava, FILE *f) {
while (glava) { fprintf(f, "%s\n", glava->rijec); glava = glava->desni; }
}
int brisi(CVOR **pglava, CVOR **prep, char *rijec) {
CVOR *p = trazi(*pglava, *prep, rijec);
if (p == 0) return 0;
else if (p == *pglava && p == *prep) *pglava = *prep = 0;
else if (p == *pglava) { *pglava = (*pglava)->desni; (*pglava)->lijevi = 0; }
else if (p == *prep) { *prep = (*prep)->lijevi; (*prep)->desni = 0; }
else { p->lijevi->desni = p->desni; p->desni->lijevi = p->lijevi; }
free(p); return 1;
}
Liste (2. dio) 8
A09 DVOSTRUKO POVEZANA LISTA
void dodaj(CVOR **pglava, CVOR **prep, char *rijec) {
if (trazi(*pglava, *prep, rijec) != 0) return;
CVOR *p, *q, *novi = (CVOR *)malloc(sizeof(CVOR));
strcpy(novi->rijec, rijec); novi->lijevi = 0; novi->desni = 0;
if (*pglava == 0) *pglava = *prep = novi;
else if (strcmp((*pglava)->rijec, rijec) > 0)
{ novi->desni = *pglava; (*pglava)->lijevi = novi; *pglava = novi; }
else if (strcmp((*prep)->rijec, rijec) < 0)
{ novi->lijevi = *prep; (*prep)->desni = novi; *prep = novi; }
else {
for (p = *pglava, q = (*prep)->lijevi;
strcmp(p->desni->rijec, rijec) < 0 && strcmp(q->rijec, rijec) > 0;
p = p->desni, q = q->lijevi);

if (strcmp(q->rijec, rijec) < 0) p = q;


novi->desni = p->desni; novi->lijevi = p;
p->desni->lijevi = novi; p->desni = novi;
}
}
void brisi_listu(CVOR **pglava, CVOR **prep) {
while (*pglava)
{ CVOR *p = (*pglava)->desni; free(*pglava); *pglava = p; }
*prep = 0;
}

Liste (2. dio) 9


A09 DVOSTRUKO POVEZANA LISTA
int main(int argc, char *argv[]) {
if (argc < 4) { return printf("Greska!"), 1; }
CVOR *glava = 0, *rep = 0;
char rijec[21];
FILE *f;
if (f = fopen(argv[1], "r")) {
while (fscanf(f, "%s", rijec) != EOF)
dodaj(&glava, &rep, rijec);
fclose(f);
}
if (f = fopen(argv[2], "r")) {
while (fscanf(f, "%s", rijec) != EOF)
brisi(&glava, &rep, rijec);
fclose(f);
}
if (f = fopen(argv[3], "w")) {
pisi(glava, f);
fclose(f);
}
brisi_listu(&glava, &rep);
return 0;
}

D:\>izbaci.exe A.TXT B.TXT C.TXT

Liste (2. dio) 10


A09 DVOSTRUKO POVEZANA LISTA
Napisati program u kojem treba:
• definisati tip ZAPOSLENI kojim se reprezentuje zaposleni u nekoj firmi (podaci koji se
vode o zaposlenom su: matični broj, prezime, ime i plata),
• definisati tip CVOR kojim se reprezentuje čvor dvostruko povezane liste,
• definisati funkciju koja dodaje podatke o novom zaposlenom u listu tako da je poredak
elemenata u listi uvijek u rastućem redoslijedu po matičnom broju,
• definisati funkciju koja omogućava pretraživanje liste po matičnom broju,
• definisati funkciju koja formatirano ispisuje podatke o svim zaposlenima,
• definisati funkciju koja omogućava brisanje podataka o zaposlenom po matičnom broju,
• definisati funkciju koja briše listu,
• definisati funkciju koja omogućava učitavanje podataka o zaposlenom,
• u glavnom programu prikazivati meni prema kojem korisnik može da vrši:
 dodavanje podataka o novom zaposlenom,
 ažuriranje podataka,
 brisanje podataka,
 prikaz podataka o svim zaposlenima,
 pretraživanje podataka po matičnom broju.

Liste (2. dio) 11


A09 DVOSTRUKO POVEZANA LISTA
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct { char jmb[14], prezime[21], ime[21]; double plata; } ZAPOSLENI;


typedef struct cvor { ZAPOSLENI z; struct cvor *lijevi, *desni; } CVOR;

void dodaj(CVOR **pglava, CVOR **prep, ZAPOSLENI *z) {


CVOR *p, *q, *novi = (CVOR *)malloc(sizeof(CVOR));
novi->z = *z; novi->lijevi = 0; novi->desni = 0;
if (*pglava == 0) *pglava = *prep = novi;
else if (strcmp((*pglava)->z.jmb, z->jmb) > 0)
{ novi->desni = *pglava; (*pglava)->lijevi = novi; *pglava = novi; }
else if (strcmp((*prep)->z.jmb, z->jmb) < 0)
{ novi->lijevi = *prep; (*prep)->desni = novi; *prep = novi; }
else {
for (p = *pglava, q = (*prep)->lijevi;
strcmp(p->desni->z.jmb, z->jmb) < 0 && strcmp(q->z.jmb, z->jmb) > 0;
p = p->desni, q = q->lijevi);

if (strcmp(q->z.jmb, z->jmb) < 0) p = q;


novi->desni = p->desni; novi->lijevi = p;
p->desni->lijevi = novi; p->desni = novi;
}
}
Liste (2. dio) 12
A09 DVOSTRUKO POVEZANA LISTA
CVOR* trazi(CVOR *glava, CVOR *rep, char *jmb) {
if (glava == 0) return 0;
while (strcmp(glava->z.jmb, jmb) < 0 && strcmp(rep->z.jmb, jmb) > 0) {
glava = glava->desni; rep = rep->lijevi;
}
return strcmp(glava->z.jmb, jmb) == 0 ? glava :
(strcmp(rep->z.jmb, jmb) == 0 ? rep : 0);
}
void pisi(CVOR *glava) {
int rb = 1;
printf("--- ------------- -------------------- -------------------- --------\n");
printf("RB. JMB PREZIME IME PLATA\n");
printf("--- ------------- -------------------- -------------------- --------\n");
while (glava) {
printf("%2d. %s %-20s %-20s %8.2lf\n", rb++,
glava->z.jmb, glava->z.prezime, glava->z.ime, glava->z.plata);
glava = glava->desni;
}
}
void brisi_listu(CVOR **pglava, CVOR **prep) {
while (*pglava) {
CVOR *p = (*pglava)->desni; free(*pglava); *pglava = p;
}
*prep = 0;
}
Liste (2. dio) 13
A09 DVOSTRUKO POVEZANA LISTA
int brisi(CVOR **pglava, CVOR **prep, char *jmb) {
CVOR *p = trazi(*pglava, *prep, jmb);
if (p == 0) return 0;
else if (p == *pglava && p == *prep) *pglava = *prep = 0;
else if (p == *pglava) {
*pglava = (*pglava)->desni;
(*pglava)->lijevi = 0;
}
else if (p == *prep) {
*prep = (*prep)->lijevi;
(*prep)->desni = 0;
}
else {
p->lijevi->desni = p->desni;
p->desni->lijevi = p->lijevi;
}
free(p);
return 1;
}
void citaj(ZAPOSLENI *z) {
printf(" Maticni broj: "); scanf("%s", z->jmb);
printf(" Prezime: "); scanf("%s", z->prezime);
printf(" Ime: "); scanf("%s", z->ime);
printf(" Plata: "); scanf("%lf", &z->plata);
}
Liste (2. dio) 14
A09 DVOSTRUKO POVEZANA LISTA
int main() { CVOR *glava = 0, *rep = 0; char c, jmb[14]; ZAPOSLENI z;
do {
======================================================================
printf("======================================================================\n");
Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? D
printf("Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? ");
Unesite podatke:
scanf("\n%c", &c);
Maticni broj: 1612983101665
if (c == 'D') { Prezime: Markovic
printf(" Unesite podatke:\n");
Ime: Marko citaj(&z); CVOR *p = trazi(glava, rep, z.jmb);
if (p) p->z = z;Plata:
else dodaj(&glava,
1500 &rep, &z);
} ======================================================================
else if (c == 'B') {
Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? D
printf(" Maticni broj:
Unesite "); scanf("%s", jmb);
podatke:
if (brisi(&glava, &rep, broj:
Maticni jmb))0101989156200
Prezime:
printf(" Obrisani Nikolic o zaposlenom sa maticnim brojem %s.\n", jmb);
su podaci
Ime: podataka
else printf(" Nema Nikolina o zaposlenom sa maticnim brojem %s.\n", jmb);
} Plata: 1000
======================================================================
else if (c == 'P') pisi(glava);
Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? P
else if (c == 'T') {
--- ------------- -------------------- -------------------- --------
printf(" Maticni broj: "); scanf("%s", jmb); CVOR *p = trazi(glava, rep, jmb);
RB. JMB PREZIME IME PLATA
if (p) printf(" %s, %s ima platu %.2lf.\n", p->z.prezime, p->z.ime, p->z.plata);
--- ------------- -------------------- -------------------- --------
else printf(" 1.Nema podataka Nikolic
0101989156200 o zaposlenom sa maticnim brojem %s.\n", 1000.00
Nikolina jmb);
} 2. 1612983101665 Markovic Marko 1500.00
else if (c != '0') printf(" Nepoznata opcija - '%c'.\n", c);
======================================================================
} while (c != '0');
Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? 0
brisi_listu(&glava,
KRAJ!&rep); printf("KRAJ!\n"); return 0;
}
Liste (2. dio) 15
A09 ZADACI ZA VJEŽBU
1. Napisati program u kojem treba:
• definisati tip ARTIKAL kojim se reprezentuje artikal čiji su atributi: šifra (cijeli broj u
opsegu 00000-99999, koji se uvijek ispisuje kao 5-cifreni podatak), naziv, količina i
cijena,
• definisati tip CVOR kojim se reprezentuje čvor dvostruko povezane liste,
• definisati funkciju koja dodaje podatke o novom artiklu u listu tako da je poredak
elemenata u listi uvijek u rastućem redoslijedu po šifri,
• definisati funkciju koja omogućava pretraživanje liste po šifri,
• definisati funkciju koja formatirano ispisuje podatke o svim artiklima,
• definisati funkciju koja omogućava brisanje podataka o artiklu po šifri,
• definisati funkciju koja briše listu,
• definisati funkciju koja omogućava učitavanje podataka o artiklu,
• u glavnom programu prikazivati meni prema kojem korisnik može da vrši:
 dodavanje podataka o novom artiklu,
 ažuriranje podataka,
 brisanje podataka,
 prikaz podataka o svim artiklima,
 pretraživanje podataka po šifri.
Liste (2. dio) 16
A09 ZADACI ZA VJEŽBU
2. Napisati program u kojem treba:
• definisati tip CVOR kojim se reprezentuje čvor jednostruko povezane kružne liste
(informacioni sadržaj treba da bude string),
• definisati funkciju koja dodaje novi string u listu tako da je poredak elemenata u
listi uvijek u rastućem redoslijedu (ukoliko dati string postoji u listi, ignorisati
pokušaj dodavanja istog stringa),
• definisati funkciju koja upisuje sadržaj liste u datoteku (parametar funkcije),
• definisati funkciju koja omogućava brisanje stringa iz liste,
• definisati funkciju koja briše listu,
• u glavnom programu:
 pročitati sve riječi iz datoteke, čiji je naziv prvi argument komandne linije, i
formirati odgovarajuću jednostruko povezanu kružnu listu,
 iz formirane liste izbaciti sve riječi koje se pojavljuju u datoteci čiji je naziv
drugi argument komandne linje,
 sadržaj liste upisati u datoteku čiji je naziv treći argument komandne linije.

Liste (2. dio) 17

You might also like