Стекови и редови – задаци

1. Саставити пакет функција за рад са стеком неограниченог капацитета:
– стварање празног стека
– додавање једног податка и узимање једног податка
– испитивање да ли је стек празан
– исписивање садржаја стека на главном излазу
– пражњење стека
– уништавање стека
Написати програм за испитивање претходних функција.

/* stek1.h – paket funkcija za rad sa stekom neogranicenog kapaciteta, odnosno za stek realizovan pomocu jednostruko spregnute liste */
#include<stdio.h>
#include<stdlib.h>
typedef struct elem{int broj;struct elem *sled;} Elem;
typedef Elem *Stek;
Stek stvori() {return NULL;}
void stavi (Stek *stk,int b)
{
	Elem *novi=malloc(sizeof(Elem));
	novi->broj=b;novi->sled=*stk;*stk=novi;
}
int uzmi (Stek *stk)
{
	Elem *stari;int b;
	if(*stk==NULL)exit(2);
	b=(*stk)->broj;stari=*stk;*stk=(*stk)->sled;free(stari);
	return b;
}
int prazan (Stek stk) {return stk==NULL;}
void pisi (Stek stk)
{
	Elem *tek;
	for(tek=stk;tek;tek=tek->sled)printf("%d\t",tek->broj);
}
void prazni(Stek *stk)
{
	while (*stk)
	{
		Elem *stari=*stk;
		(*stk)=(*stk)->sled;
		free(stari);
	}
}
void unisti (Stek *stk){prazni(stk);}
/* stek.c – glavi program z rad sa stekom */
#include"stek1.h"
#include<stdio.h>
int main()
{
	Stek stk=stvori();int b,izbor,kraj=0;
	while(!kraj)
	{
		printf(     "\n1. stavljanje podataka na stek\n"
              		"2. uzimanje podatka sa steka\n"
             		"3. ispisivanje sadrzaja steka\n"
              		"4. praznjenje steka\n"
              		"0. zavrsetak rada\n\n"
              		"vas izbor");
              scanf("%d",&izbor);
              switch(izbor)
              {
              	case 1: printf("broj");scanf("%d",&b);stavi(&stk,b);break;
              	case 2: if(!prazan(stk))printf("broj=%d\n",uzmi(&stk));
              		else printf("stek je prazan\n");
              		break;
              	case 3: printf("stek=");pisi(stk);putchar('\n');break;
              	case 4: prazni(&stk);break;
              	case 0: kraj=1; break;
              	default: printf("pogresan izbor\n");break;
		  }
        }
        return 0;
}

2. Саставити пакет функција за рад са редом неограниченог капацитета:
– стварање празног реда
– додавање једног податка и узимање једног податка
– испитивање да ли је ред празан
– исписивање садржаја реда на главном излазу
– пражњење реда
– уништавање реда
Написати програм за испитивање претходних функција.

/* red.h – Definicije paketa za redove neograničenog kapaciteta. */
#include <stdio.h>
#include <stdlib.h>
typedef struct elem { int broj; struct elem *sled; } Elem;
typedef struct { Elem *prvi, *posl; } Red;
Red stvori() {Red rd; rd.prvi=rd.posl=NULL; return rd;} /* Stvaranje reda.*/
void stavi (Red *rd, int b) 
{ /* Stavljanje broja u red.*/
	Elem *novi = malloc (sizeof(Elem));
	novi->broj = b; novi->sled = NULL;
	if (! rd->posl) rd->prvi = novi; else rd->posl->sled = novi;
	rd->posl = novi;
}
int uzmi (Red *rd) 
{
	Elem *stari; int b; /* Uzimanje broja iz reda.*/
	if (! rd->prvi) exit (2);
	b = rd->prvi->broj;
	stari = rd->prvi; rd->prvi = rd->prvi->sled; free (stari);
	if (! rd->prvi) rd->posl = NULL;
	return b;
}
int prazan (Red rd) { return rd.prvi == NULL; } /* Da li je red prazan?*/
void pisi (Red rd)
{
	Elem *tek; /* Ispisivanje sadržaja reda. */
	for (tek=rd.prvi; tek; tek=tek->sled) printf ("%d ", tek->broj); 
}
void prazni (Red *rd) 
{  /* Pražnjenje reda.*/
	while (rd->prvi)
	{
		Elem *stari = rd->prvi; rd->prvi = rd->prvi->sled;
		free(stari);
	}
}
void unisti (Red *rd) { prazni (rd); } /* Uništavanje reda.*/
/*red.c – Ispitivanje paketa za redove neograničenog kapacieta. */
#include "red.h"
#include <stdio.h>
int main ()
{
     Red rd = stvori (); int b, izbor, kraj = 0;
	while (! kraj)
	{
		printf (	"\nl. Stavljanje podatka u red\n"
				"2. Uzimanje podatka iz reda\n"
				"3. Ispisivanje sadrzaja reda\n"
				"4. Praznjenje reda\n"
				"0. Zavrsetak rada\n\n"
				"Vas izbor?");
		scanf ("%d", &izbor);
		switch (izbor)
		{
			case 1: /* Stavljanje podatka u red:*/
			printf ("Broj? "); scanf ("%d", &b); stavi (&rd, b);
			break;
			case 2: /* Uzimanje broja iz reda:*/
			if (! prazan (rd))
			printf ("Broj= %d\n", uzmi (&rd));
			else printf ("*** Red je prazan! ***\a\n");
			break;
			case 3: /* Ispisivanje sadržaja reda: */
			printf ("Red= "); pisi (rd); putchar ('\n'); break;
			case 4: /* Pražnjenje reda: */ prazni (&rd); break;
			case 0: /* Završetak rada: */ kraj = 1; break;
			default: /* Pogresan izbor:*/
			printf ("*** Neozvoljeni izbor! ***\a\n"); break;
		}
	}
	return 0;
}

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се /  Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се /  Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се /  Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се /  Промени )

Повезивање са %s