You are on page 1of 15

PROGRAMIRANJE II

A08 – Liste (1. 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.
A08 JEDNOSTRUKO POVEZANA LISTA
Napisati program u kojem treba:
• definisati tip CVOR kojim se reprezentuje čvor jednostruko povezane 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 zadati čvor,
• definisati funkciju koja briše listu,
• definisati funkciju koja omogućava pretraživanje liste,
• definisati funkciju koja ispisuje sadržaj liste,
• definisati funkciju koja sortira listu,
• definisati funkciju koja invertuje listu,
• u glavnom programu ilustrovati rad sa (neuređenom) jednostruko povezanom listom tj.
definisanim funkcijama.

Liste (1. dio) 2


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

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

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


CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
novi->podatak = podatak;
novi->sljedeci = *pglava;
*pglava = novi;
return novi;
}

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


CVOR *p, *novi = (CVOR *)malloc(sizeof(CVOR));
novi->podatak = podatak;
novi->sljedeci = 0;
if (*pglava == 0) *pglava = novi;
else
{
for (p = *pglava; p->sljedeci; p = p->sljedeci);
p->sljedeci = novi;
}
return novi;
}
Liste (1. dio) 3
A08 JEDNOSTRUKO POVEZANA LISTA
CVOR* dodaj_iza(CVOR *cvor, int podatak) {
CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
novi->podatak = podatak;

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

return novi;
}

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


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

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

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

return cvor;
}

Liste (1. dio) 4


A08 JEDNOSTRUKO POVEZANA LISTA
int brisi_iza(CVOR *cvor) void brisi_listu(CVOR **pglava)
{ {
CVOR *p = cvor->sljedeci; while (*pglava)
if (p == 0) {
return 0; CVOR *p = (*pglava)->sljedeci;
free(*pglava);
cvor->sljedeci = p->sljedeci; *pglava = p;
free(p); }
return 1; }
}

int brisi(CVOR *cvor) // cvor ne moze biti rep


{
CVOR* trazi(CVOR *glava, int podatak) {
CVOR *p = cvor->sljedeci;
while (glava && glava->podatak != podatak)
if (p == 0)
glava = glava->sljedeci;
return 0;
return glava;
}
cvor->podatak = p->podatak;
cvor->sljedeci = p->sljedeci;
void pisi(CVOR *glava) {
free(p);
while (glava) {
return 1;
printf(" %d", glava->podatak);
}
glava = glava->sljedeci;
}
}

Liste (1. dio) 5


A08 JEDNOSTRUKO POVEZANA LISTA
void sortiraj(CVOR *glava) {
for (; glava && glava->sljedeci; glava = glava->sljedeci) {
CVOR *min = glava, *p;
for (p = glava->sljedeci; p; p = p->sljedeci)
if (min->podatak > p->podatak)
min = p;
if (min != glava)
{
int pom = glava->podatak;
glava->podatak = min->podatak;
min->podatak = pom;
}
}
}

void invertuj(CVOR **pglava) {


CVOR *p1 = *pglava, *p2 = 0, *p3;
while (p1) {
p3 = p1->sljedeci;
p1->sljedeci = p2;
p2 = p1;
p1 = p3;
}
*pglava = p2;
}
Liste (1. dio) 6
A08 JEDNOSTRUKO POVEZANA LISTA
int main()
{
CVOR *glava = 0;
CVOR *c1 = dodaj_pocetak(&glava, 1), *c2 = dodaj_pocetak(&glava, 2),
*c3 = dodaj_kraj(&glava, 3), *c4 = dodaj_iza(c1, 4), *c5 = dodaj_ispred(c1, 5);
int br;
printf("Sadrzaj liste:"); pisi(glava); printf("\n");

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


printf("Broj %d %spostoji u listi.\n", br, trazi(glava, br) ? "" : "ne ");

brisi(c4); brisi_iza(c5);
printf("Sadrzaj liste (nakon brisanja):"); pisi(glava); printf("\n");

sortiraj(glava); printf("Sadrzaj liste (sortirano):"); pisi(glava); printf("\n");


Sadrzaj liste: 2 5 1 4 3
Unesite
invertuj(&glava); printf("Sadrzaj broj:
liste 1
(inv.):"); pisi(glava); printf("\n");
Broj 1 postoji u listi.
Sadrzaj liste
brisi_listu(&glava); printf("Sadrzaj (nakon brisanja):
liste (prazna):"); 2 5 3printf("\n");
pisi(glava);
Sadrzaj liste (sortirano): 2 3 5
dodaj_pocetak(&glava, 1); dodaj_pocetak(&glava, 2); 5 3 2
Sadrzaj liste (inv.):
printf("Sadrzaj nove liste:"); pisi(glava); printf("\n");
Sadrzaj liste (prazna):
brisi_listu(&glava);
return 0; Sadrzaj nove liste: 2 1
}
Liste (1. dio) 7
A08 JEDNOSTRUKO POVEZANA LISTA
Napisati program u kojem treba:
• definisati tip STUDENT kojim se reprezentuje student (podaci koji se vode o studentu su:
indeks, prezime, ime i prosjek),
• definisati tip CVOR kojim se reprezentuje čvor jednostruko povezane liste,
• definisati funkciju koja dodaje podatke o novom studentu u listu tako da je poredak
elemenata u listi uvijek u rastućem redoslijedu po indeksu,
• definisati funkciju koja omogućava pretraživanje liste po indeksu,
• definisati funkciju koja formatirano ispisuje podatke o svim studentima,
• definisati funkciju koja omogućava brisanje podataka o studentu po indeksu,
• definisati funkciju koja briše listu,
• definisati funkciju koja omogućava učitavanje podataka o studentu,
• u glavnom programu prikazivati meni prema kojem korisnik može da vrši:
 dodavanje podataka o novom studentu,
 ažuriranje podataka,
 brisanje podataka,
 prikaz podataka o svim studentima,
 pretraživanje podataka po indeksu.

Liste (1. dio) 8


A08 JEDNOSTRUKO POVEZANA LISTA
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct { char indeks[8], prezime[21], ime[21]; double prosjek; } STUDENT;

typedef struct cvor { STUDENT s; struct cvor *sljedeci; } CVOR;

void dodaj(CVOR **pglava, STUDENT *s)


{
CVOR *p, *novi = (CVOR *)malloc(sizeof(CVOR));
novi->s = *s;
if (*pglava == 0 || strcmp((*pglava)->s.indeks, s->indeks) > 0)
{
novi->sljedeci = *pglava;
*pglava = novi;
}
else
{
for (p = *pglava; p->sljedeci && strcmp(p->sljedeci->s.indeks, s->indeks) < 0;
p = p->sljedeci);
novi->sljedeci = p->sljedeci;
p->sljedeci = novi;
}
}
Liste (1. dio) 9
A08 JEDNOSTRUKO POVEZANA LISTA
CVOR* trazi(CVOR *glava, char *indeks) {
while (glava && strcmp(glava->s.indeks, indeks) < 0)
glava = glava->sljedeci;
return glava == 0 || strcmp(glava->s.indeks, indeks) > 0 ? 0 : glava;
}
void pisi(CVOR *glava) {
int rb = 1;
printf("--- ------- -------------------- -------------------- -------\n");
printf("RB. INDEKS PREZIME IME PROSJEK\n");
printf("--- ------- -------------------- -------------------- -------\n");
while (glava)
{
printf("%2d. %s %-20s %-20s %7.2lf\n", rb++,
glava->s.indeks, glava->s.prezime, glava->s.ime, glava->s.prosjek);
glava = glava->sljedeci;
}
printf("--- ------- -------------------- -------------------- -------\n");
}
void brisi_listu(CVOR **pglava) { void citaj(STUDENT *s) {
while (*pglava) { printf(" Indeks: "); scanf("%s", s->indeks);
CVOR *p = (*pglava)->sljedeci; printf(" Prezime: "); scanf("%s", s->prezime);
free(*pglava); printf(" Ime: "); scanf("%s", s->ime);
*pglava = p; printf(" Prosjek: ");
} scanf("%lf", &s->prosjek);
} }
Liste (1. dio) 10
A08 JEDNOSTRUKO POVEZANA LISTA
int brisi(CVOR **pglava, char *indeks)
{
if (*pglava == 0)
return 0;

CVOR *p = 0;
if (strcmp((*pglava)->s.indeks, indeks) == 0)
{
p = (*pglava);
(*pglava) = (*pglava)->sljedeci;
}
else
{
CVOR *pr = (*pglava);
for (p = (*pglava)->sljedeci; p && strcmp(p->s.indeks, indeks) < 0;
p = p->sljedeci)
pr = p;

if (p == 0 || strcmp(p->s.indeks, indeks) > 0)


return 0;
pr->sljedeci = p->sljedeci;
}
free(p);
return 1;
}
Liste (1. dio) 11
A08 JEDNOSTRUKO POVEZANA LISTA
int main() { CVOR *glava = 0; char c, indeks[8]; STUDENT s;
do { ======================================================================
Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? D
printf("======================================================================\n");
Unesite podatke:
printf("Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? ");
scanf("\n%c", &c); Indeks: 1102/14
if (c == 'D') { Prezime: Bojanic
Ime: Bojana
printf(" Unesite podatke:\n"); citaj(&s); CVOR *p = trazi(glava, s.indeks);
Prosjek: 10
if (p) p->s = s; else dodaj(&glava, &s);
======================================================================
} Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? D
else if (c == 'B') {
Unesite podatke:
printf(" Unesite indeks: "); scanf("%s", indeks);
Indeks: 1101/14
if (brisi(&glava, indeks))
Prezime: Markovic
printf(" Obrisani su podaci o studentu sa indeksom %s.\n", indeks);
Ime: Marko
else printf(" Nema podataka
Prosjek: 9.5 o studentu sa indeksom %s.\n", indeks);
} ======================================================================
Dodavanje/azur.
else if (c == 'P') pisi(glava);[D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? P
--- -------
else if (c == 'T') { -------------------- -------------------- -------
RB. INDEKS PREZIME
printf(" Indeks: "); scanf("%s", indeks); IME PROSJEK
CVOR *p = trazi(glava, indeks);
--- ------- -------------------- --------------------
if (p) printf(" Student %s, %s ima prosjek ocjena %.2lf.\n", -------
1. 1101/14 Markovic Marko 9.50
p->s.prezime, p->s.ime, p->s.prosjek);
2. 1102/14 Bojanic Bojana 10.00
else printf(" Nema podataka o studentu sa indeksom %s.\n", indeks);
--- ------- -------------------- -------------------- -------
} ======================================================================
else if (c != '0') printf(" Nepoznata
Dodavanje/azur. opcija
[D], brisanje [B], -prikaz
'%c'.\n", c);
[P], pretr. [T], kraj [0]? 0
} while (c != '0');
KRAJ!
brisi_listu(&glava); printf("KRAJ!\n"); return 0; }
Liste (1. dio) 12
A08 ZADACI ZA VJEŽBU
1. Napisati program u kojem treba implementirati stek kao jednostruko povezanu listu.
U programu treba:
• definisati tip CVOR kojim se reprezentuje čvor jednostruko povezane liste,
• definisati funkciju koja dodaje element na vrh steka,
• definisati funkciju koja skida element sa vrha steka,
• definisati funkciju koja ispisuje sadržaj steka,
• definisati funkciju koja briše stek,
• u glavnom programu ilustrovati rad sa implementiranim stekom.
2. Napisati program u kojem treba implementirati red kao jednostruko povezanu listu.
U programu treba:
• definisati tip CVOR kojim se reprezentuje čvor jednostruko povezane liste,
• definisati funkciju koja dodaje element na kraj reda,
• definisati funkciju koja skida element sa početka reda,
• definisati funkciju koja ispisuje sadržaj reda,
• definisati funkciju koja briše red,
• u glavnom programu ilustrovati rad sa implementiranim redom.

Liste (1. dio) 13


A08 ZADACI ZA VJEŽBU
3. 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 jednostruko 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 (1. dio) 14
A08 ZADACI ZA VJEŽBU
4. Napisati program u kojem treba:
• definisati tip CVOR kojim se reprezentuje čvor jednostruko 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 jednostruko 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 (1. dio) 15

You might also like