[Tutorial C]Cazuri particulare de liste liniare

#1
Nume Tutorial:Cazuri particulare de liste liniare
Descriere:Cazuri particulare de liste liniare
Download:Nu necesita
Autor:Anonim
Sursa (Link-ul oficial):
tutorialeprogramare
Propria parere:Util.
Tutorialul:


a. Stiva
Stiva este o structura de date care functioneaza dupa principiul "Last in - first out". Putem imagina o stiva ca un teanc de farfurii, de carti, etc. Conform acestui principiu, putem deduce ca asupra unei stive sunt permise urmatoarele operatii:
- Adaugarea unui nod inainte de primul introdus
- Stergerea primului nod

Observatie:
Primul nod dn stiva se numeste varf si dupa cum observam este singurul nod asupra caruia sunt permise operatii. Ultimul nod din stiva se numeste baza.
In urma crearii unei stive in mod dinamic, nodurile vor fi prelucrate in ordine inversa introducerii lor.

a1. Crearea unei stive:
Se parcurg aceleasi etape ca la listele liniare simplu inlantuite, doar ca adaugarea unui nod se face inainte de v (varf).

Cod: Selectaţi tot

struct nod {
	<tip> info;
	nod *adr;
	};
	typedef nod *NOD;
	int n, i;
	NOD *v, *b, *p;
	printf("Dati numarul de noduri: ");
	scanf("%d", &n);
	v=(NOD)malloc(sizeof(nod));
	printf("nr = ");
	scanf("%d", &v->info);
	v->adr=0;
	b=v;
	for(i=2; i <= n; i++) 
		q=(NOD)malloc(sizeof(nod));
	printf("nr = ");
	scanf("%d", &q->info);
	q->adr=v;
	v=q;
}
Lasam ca exercitiu implementarea celorlalte operatii care pot fi efectuate asupra unei stive, pe modelul celor de la listele liniare simplu inlantuite.

b. Coada
Coada este o structura de date care functioneaza dupa principiul "First in - first out". Conform acestui principiu de functionare, se permit asupra unei cozi urmatoarele operatii:
- Adaugarea unui nod dupa ultimul introdus;
- Stergerea primului nod;

Observatii:
- Primul nod din coada se numeste cap iar ultimul nod se numeste coada.
- Crearea unei cozi este identica cu crearea unei liste simplu inlantuite. Cum nici celelalte operatii permise nu difera de cele prezentate la aceasta structura de date, lasam ca exercitiu implementarea operatiilor asupra unei cozi.

c. Lista circulara
O lista circulara este o structura dinamica de date in care ultimul nod contine in partea dinamica adresa primului nod. Practic, o lista circulara nu are prim si ultim nod, ci doar nod de plecare in parcurgerea ei.
Imagine
c1. Crearea listei circulare
Pentru crearea unei liste circulare, vom folosi aceeasi metoda ca la lista liniara simplu inlantuita, avand grija ca la sfarsitul crearii ultimului nod sa adaugam adresa primului element:

Cod: Selectaţi tot

struct nod {
	<tip> info;
	nod *adr;
};

typedef struct nod *NOD;
int n, i;
NOD *p, *u, *q;
printf("Dati numarul de noduri: ");
scanf("%d", &n);
p=(NOD)malloc(sizeof(nod)); // 1
printf("nr = ");
scanf("%d", &p->info); // (2)
p->adr=0;
for(i=2; i <= n; i++) {
	q=(NOD)malloc(sizeof(nod));
	printf("nr = ");
	scanf("%d", &q->info);
	q->adr=0;
	u->adr=q; // (4)
	u=q;
}
u->adr=p;
c2. Parcurgerea listei circulare
Parcurgerea unei liste circulare se face pornind de la un nod dat, p, pana cand se revine la nodul de pornire:

Cod: Selectaţi tot

	q=p;
	do {
		printf("%d", q->info);
		q=q->adr;
	} while(q!=p);
c3. Adaugarea unui nod intr-o lista circulara
Putem adauga un nod inainte de nodul de plecare sau inainte de un nod oarecare.

Inserarea unui nod inainte de primul nod din lista
Se creeaza nodul q si se realizeaza legatura dintre el si lista. Apoi acesta va fi noul prim nod. Se are in vedere pastrarea calitatii de lista circulara.
Imagine

Cod: Selectaţi tot

q=(NOD)malloc(sizeof(nod));
printf("nr = ");
scanf("%d", &q->info);
q->adr=p;
u->adr=q;
p=q;
Observatie:
Inserarea unui nod in interiorul listei circulare se face analog cu inserarea intr-o lista simplu inlantuita.

c4. Stergerea unui nod dintr-o lista circulara
Putem sterge nodul de pornire sau un nod din interiorul listei. Pentru a sterge un nod, se parcurg aceleasi etape prezentate anterior, avand grija ca lista sa ramana circulara.

Stergerea nodului de plecare

Cod: Selectaţi tot

NOD aux;
aux=p;
p=p->adr;
u->adr=p;
free(aux);
Stergerea unui nod cu informatia data, x:
Se parcurge lista pana la nodul anterior celui cu informatia x (4) si acesta se leaga in lista de cel urmator celui cu informatia x (5):

Cod: Selectaţi tot

NOD aux;
q=p;
while(q->adr->adr!=p && q->info!=x)
q=q->adr;
aux=q->adr;
q->adr=q->adr->adr;
free(aux);
N-am cerut la nimeni niciodata,
Chiar de-a fost sa rabd, in viata mea.
Am dat totul fara nici o plata,
Nevoind nimic sa mi se dea.

@Virgil Carianopol
Vezi-ti de treaba si retine:
"E treaba ta sa spui ce vrei si sa nu conteze pentru nimeni".

@Kazi Ploae

Înapoi la “Tutoriale C / C++ / C#”

Cine este conectat

Utilizatori răsfoind acest forum: Niciun utilizator înregistrat și 3 vizitatori