Ovako imam zadaću i trebam je predati danas do 23:59 pa ako mi je netko voljan pomoći s tim vezanim listama pa da bar riješi bilo koji od ovih zadataka ispod i pošalje na mail: [email protected] Znam da svi mrze kad se traže gotovo rješenja ali mi ne ide jednostavno, kod slijedi, puno hvala unaprijed!
Rješenja funkcija trebaju biti pohranjene po imenima u datoteke:
->> dodavanje na početak reda - PROG04_4_1.C
->> dodavanje na kraj reda - PROG04_4_2.C
->> dodavanje prema najvećem prioritetu - PROG04_4_3.C
->> dodavanje prema najmanjem prioritetu - PROG04_4_4.C
->> brisanje elemenata iz reda - PROG04_4_5.C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// typedef uvodi vlastito definirani tip podatka LISTA
typedef struct lista {
unsigned int kljuc;
char naziv[20];
struct lista *sljedeci; // kazaljka na sljedeci element
} LISTA;
typedef struct red {
struct lista *prvi; // kazaljka na prvi element reda
struct lista *posljednji; // kazaljka na posljednji element reda
} RED;
// vraca broj elemenata liste
unsigned int broj_elemenata(LISTA *pocetak_liste)
// pocetak_liste je adresa od koje pocinje ispis
{
LISTA *p; // p sadrzi adresu tekuceg elementa liste
unsigned int br_el=0; // br_el sadrzi broj elemenata
p = pocetak_liste; // p prima adresu pocetka liste
while(p)
{
++br_el;
p = p->sljedeci; // prijelaz na sljedeci element
}
return(br_el);
}
// ispisuje elemente liste
void ispis_liste(LISTA *pocetak_liste)
// pocetak_liste je adresa od koje pocinje ispis
{
LISTA *p; // p sadrzi adresu tekuceg elementa liste
p = pocetak_liste; // p prima adresu pocetka liste
printf("\n");
while(p)
{
printf("%5d->%20s\n",p->kljuc,p->naziv);
p = p->sljedeci; // prijelaz na sljedeci element
}
}
void dodaj_element(RED *pocetak_reda, LISTA *novi_element);
// priprema za dodavanje u red
void dodaj_u_listu(RED *pocetak_reda)
// pocetak_reda je adresa varijable koja sadrzi adrese prvog i posljednjeg elementa
{
LISTA *novi_element; // novi_element je adresa elementa koji se dodaje
unsigned int ucitani_kljuc; // kljuc novog elementa
char ucitani_naziv[20]; // nazi novog elementa
do
{
printf("Upisi kljuc (0 za kraj) :");
scanf("%5d",&ucitani_kljuc); // upisuje se kljuc
if(ucitani_kljuc == 0) // kljuc = 0 tj. kraj unosa
break;
printf("Upisi naziv :");
scanf("%s",&ucitani_naziv); // upisuje se naziv
novi_element = (LISTA *) malloc(sizeof(LISTA)); // alokacija memorije
novi_element->kljuc = ucitani_kljuc; // kljucu novog elementa pridruzuje se upisana vrijednost
strncpy(novi_element->naziv, ucitani_naziv, 20);// nazivu novog elementa kopira se upisani naziv
dodaj_element(pocetak_reda, novi_element);// poziv funkcije za dodavanje u red
} while(1);
}
void brisi_element(RED *pocetak_reda, int ucitani_kljuc);
// priprema za brisanje iz reda
void brisi_iz_liste(RED *pocetak_reda)
// pocetak_reda je adresa varijable koja sadrzi adrese prvog i posljednjeg elementa
{
unsigned int ucitani_kljuc; // kljuc koji se brise
do
{
printf("Upisi kljuc za brisanje (0 za kraj) :");
scanf("%5d",&ucitani_kljuc); // upisuje se kljuc za brisanje
if(ucitani_kljuc == 0) // kljuc = 0 tj. kraj unosa
break;
brisi_element(pocetak_reda, ucitani_kljuc); // poziv funkcije za brisanje iz reda
} while(1);
}
main()
{
RED pocetak_reda;
unsigned int upit;
pocetak_reda.prvi = NULL; // nema prvog elementa
pocetak_reda.posljednji = NULL; // nema posljednjeg elementa
for(;;)
{
printf("\n\nIzaberi\n"
"1.Dodavanje elemenata\n"
"2.Brisanje elemenata\n"
"3.Ispis liste\n"
"0.Kraj\n"
" Izbor: ");
scanf("%1d",&upit);
switch(upit)
{
case 0: exit(0);
break;
case 1: dodaj_u_listu(&pocetak_reda);
break;
case 2: brisi_iz_liste(&pocetak_reda);
break;
case 3: ispis_liste(pocetak_reda.prvi);
printf("---ukupno %d elem.---\n", broj_elemenata(pocetak_reda.prvi));
break;
}
}
}