Двоструко спрегнута листа – задаци

Саставити на језику С пакете функција за обраду двоструко повезаних листа целих бројева који садржи функције за:
– стварање празне листе,
– померање на први и на последњи елемент листе,
– померање на следећи и на претходни елемент у односу на текући елемент листе,
– померање на следеће и на претходно појављивање датог броја у листи у односу на текући елемент,
– испитивање да ли постоји текући елемент у листи,
– дохватање и промену вредности текућег елемента у листи,
– додавање новог елемента испред првог и иза последњег елемента листе,
– додавање новог елемента испред и иза текућег елемента у листи,
– избацивање текућег елемента из листе уз померање на следећи или на претходни елемент,
– брисање свих елемената листе,
– исписивање садржаја листе од почетка ка крају или од краја ка почетку, и
– читање листе ређајући елементе од почетка ка крају или од краја ка почетку.
Саставити на језику C главни програм за приказивање неких могућности претходног пакета.

/* dsl.h – paket funkcija za obradu dvostruko spregnutih lista. */
#include <stdio.h>
#include <stdlib.h>
typedef struct elem { int broj; struct elem *pret, *sled; } Elem;
typedef struct { Elem *prvi, *posl, *tek; } Lista;
typedef enum {NAPRED, NAZAD} Smer;
Lista stvori (void)
	{Lista lst; lst.prvi = lst.posl = lst.tek = NULL; return lst;}
void na_prvi (Lista *lst){lst->tek = lst->prvi;}
void na_posl (Lista *lst){lst->tek = lst->posl;}
void na_sled (Lista *lst){if (lst->tek) lst->tek = lst->tek->sled;}
void na_pret (Lista *lst){if (lst->tek) lst->tek = lst->tek->pret;}
void nadji_sled (Lista *lst, int b)
	{while (lst->tek && lst->tek->broj != b) lst->tek = lst->tek->sled;}
void nadji_pret (Lista *lst, int b)
	{while (lst->tek && lst->tek->broj != b) lst->tek = lst->tek->pret;}
int ima_tek (Lista lst){return lst.tek != NULL;}
int dohvati_tek (Lista lst)
{
	if (! lst.tek) exit (1);
	return lst.tek->broj;
}
void promeni_tek (Lista lst, int b)
{
	if (! lst.tek) exit (1);
	lst.tek->broj = b;
}
void dodaj_poc (Lista *lst, int b)
{
	Elem *novi=malloc(sizeof(Elem));
	novi->broj=b;
	novi->sled=lst->prvi;
	novi->pret=NULL;
	if(!lst->prvi)lst->posl=novi;
	else lst->prvi->pret=novi;
	lst->prvi=lst->tek=novi;
}
void dodaj_kraj (Lista *lst, int b)
{
	Elem *novi=malloc(sizeof(Elem));
	novi->broj=b;
	novi->pret=lst->posl;
	novi->sled=NULL;
	if(!lst->posl)lst->prvi=novi;
	else lst->posl->sled=novi;
	lst->posl=lst->tek=novi;
}
void dodaj_ispred (Lista *lst, int b)
{
	Elem *novi=malloc(sizeof(Elem));
	if(!lst->tek)exit(1);
	novi->broj=b;
	novi->pret=lst->tek->pret;
	novi->sled=lst->tek;
	if(!lst->tek->pret) lst->prvi=novi;
	else lst->tek->pret->sled=novi;
	lst->tek->pret=lst->tek=novi;
}
void dodaj_iza (Lista *lst, int b)
{
	Elem *novi=malloc(sizeof(Elem));
	if(!lst->tek)exit(1);
	novi->broj=b;novi->sled=lst->tek->sled;novi->pret=lst->tek;
	if(!lst->tek->sled)lst->posl=novi;else lst->tek->sled->pret=novi;
	lst->tek->sled=lst->tek=novi;
}
void izbaci_tek (Lista *lst, Smer smer)
{
	Elem *stari=lst->tek;
	if(!lst->tek->pret)lst->prvi=lst->tek->sled;
	else lst->tek->pret->sled=lst->tek->sled;
	if(!lst->tek->sled)lst->posl=lst->tek->pret;
	else lst->tek->sled->pret=lst->tek->pret;
	lst->tek=(smer==NAPRED)?lst->tek->sled:lst->tek->pret;
	free(stari);
}
void brisi_sve (Lista *lst)
{
	while (lst->prvi)
	{Elem *stari = lst->prvi; lst->prvi = lst->prvi->sled; free (stari);}
	lst->posl = lst->tek = NULL;
}
void pisi (Lista lst, Smer smer)
{
	if (smer == NAPRED)
		for (na_prvi (&lst); ima_tek (lst); na_sled (&lst))
			printf ("%d ", dohvati_tek (lst));
	else
		for (na_posl (&lst); ima_tek (lst); na_pret (&lst))
			printf ("%d ", dohvati_tek (lst));
}
void citaj (Lista *lst, int n, Smer smer)
{
	int i, b;
	brisi_sve (lst);
	for (i = 0; i<n; i++)
	{
		scanf ("%d", &b);
		(smer == NAPRED) ? dodaj_kraj (lst, b) : dodaj_poc (lst, b);
	}
}

 

#include "dsl.h"
#include <stdio.h>
void main () 
{
	Lista lst = stvori (); int n, k;
	while (1)
	{
		printf ("n? "); scanf ("%d",&n);
		if (n <0) break;
		printf ("Lista? "); citaj (&lst, n, NAPRED);
		if (n == 0) putchar ('\n');
		printf ("Izost? "); scanf ("%d", &k);
		printf ("Napred= "); pisi (lst, NAPRED); putchar ('\n');
		printf ("Nazad= "); pisi (lst, NAZAD); putchar ('\n');
		/* Izbacivanje svakog pojavljivanja datog broja: */
		na_prvi (&lst); nadji_sled (&lst, k);
	while (ima_tek(lst)) { izbaci_tek(&lst, NAPRED); nadji_sled(&lst ,k);}
		printf ("Skraceno= "); pisi (lst, NAPRED); printf ("\n\n");
	}
}

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

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

WordPress.com лого

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

Google+ photo

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

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

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

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

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

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