Documente Academic
Documente Profesional
Documente Cultură
7.structuri Dinamice de Date - Liste
7.structuri Dinamice de Date - Liste
7.structuri Dinamice de Date - Liste
Liste
i respectiv indic adresa primei componente din list n cazul listelor nchise
(circulare).
Declararea tipurilor de date C pentru definirea structurilor de liste dinamice
simplu i respectiv dublu nlnuite este:
a)
b)
Programarea calculatoarelor
Programarea calculatoarelor
caz n care este eliminat cu tergere ultimul nod al listei. Dac lista este vid,
funcia calculeaz valoarea 0.
Int elimina_ultim(lista *cap,int *info)
{ if (*cap)
{ if((*cap)->leg)
{ for(lista p=*cap;p->leg->leg;p=p->leg);
*info=p->leg->inf;
free(p->leg);
p->leg=NULL;
}
else
{ *info=(*cap)->inf;
free(*cap);
*cap=NULL;
}
return 1;
}
return 0;
}
Programarea calculatoarelor
free(aux);
return 1;
}
return 0;
}
*,int);
*,int *);
*,int);
*,int *);
void main()
{
clrscr();
int n,info;
lista cap=NULL;
printf("Numarul de noduri:");
scanf("%i",&n);
printf("Introduceti informatiile\n");
for(int i=0;i<n;i++){
scanf("%i",&info);
if(inserare_la_inceput(&cap,info));
else
{printf("\n Spatiu insuficient \n");
return;
}
}
printf("\nLista rezultata\n");
parc(cap);
printf("\n\nLista dupa extragerea primului
element:\n");
if(stergere_la_inceput(&cap,&info)) parc(cap);
else printf("\nEroare: lista vida");
printf("\n\nInformatia nodului de introdus la
sfarsit:");
scanf("%i",&info);
if(inserare_la_sfarsit(&cap,info)){
printf("Lista rezultata\n");
parc(cap);
}
else
printf("\n Spatiu insuficient \n");
printf("\n\nLista dupa extragerea ultimului
element:");
if(stergere_la_sfarsit(&cap,&info)){
printf("\nInformatia extrasa %i\nLista
rezultata:",info);
parc(cap);
}
else printf("\nEroare:Lista vida");
getch();
}
void parc(lista cap)
{
lista p=cap;
if(cap){
printf("%i ",cap->inf);
for(p=p->leg;p-cap;p=p->leg)
Programarea calculatoarelor
printf("%i ",p->inf);
}
else printf("\nLista vida");
}
lista cauta(lista cap,int info)
{
if(cap==NULL)return NULL;
if(cap->inf==info) return cap;
for(lista p=cap->leg;p!=cap;p=p->leg)
if(p->inf==info) return p;
return NULL;}
int inserare_la_inceput(lista *cap,int info)
{
lista nou,ultim;
if(nou=(lista)malloc(sizeof(list))){
nou->inf=info;
nou->leg=*cap;
if(*cap){
for(ultim=*cap;ultim->leg!=(*cap);ultim=ultim->leg);
ultim->leg=nou;
}
else nou->leg=nou;
*cap=nou;
return 1;
}
return 0;
}
int stergere_la_inceput(lista *cap,int *info)
{
if(*cap){
lista aux=*cap;
*info=aux->inf;
for(lista ultim=*cap;
ultim->leg!=(*cap);ultim=ultim->leg);
if(ultim==(*cap)) *cap=NULL;
else{
*cap=(*cap)->leg;
ultim->leg=*cap;
}
free(aux);
return 1;
}
return 0;
}
int inserare_la_sfarsit(lista *cap,int info)
{
lista nou,ultim;
if(nou=(lista)malloc(sizeof(list))){
nou->leg=*cap;nou->inf=info;
if(*cap==NULL){
*cap=nou;
(*cap)->leg=*cap;
}
Programarea calculatoarelor
7.4.2 Coada
Se numete coad o list organizat astfel nct operaia de inserare este
permis la ultima component, iar operaia de eliminare este permis numai la
prima component. Acest mod de organizare corespunde unei gestiuni FIFO (First
In First Out) a informaiei stocate.
Implementarea unei liste de tip coad poate fi efectuat att printr-o
structur static (masiv unidimensional), ct i printr-o structur dinamic de tip
list. Pentru optimizarea operaiilor de inserare/extragere, n cazul implementrii
cozilor prin structuri dinamice lineare, este necesar utilizarea a dou informaii:
adresa primei componente i adresa ultimei componente. Aceste informaii pot fi
meninute explicit prin utilizarea a doi pointeri sau prin utilizarea unui pointer i a
unei structuri de list circular.
O variant alternativ de implementare a unei liste de tip coad dinamic
este obinut prin considerarea unei liste circulare, cu memorarea adresei ultimului
element.
n continuare sunt prezentate operaiile de inserare i extragere a unei
informaii dintr-o list liniar de tip coad.
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
typedef struct nod{
int inf;
struct nod *leg;
} list, *lista;
int inserare(lista *,lista *,int);
int extragere(lista *,lista *,int *);
void parc(lista);
void main()
{
clrscr();
int n,info;
lista cap=NULL,ultim=NULL;
printf("Numarul de noduri:");
scanf("%i",&n);
printf("Introduceti informatiile\n");
for(int i=0;i<n;i++){
scanf("%i",&info);
if(inserare(&cap,&ultim,info));
else
{printf("\n Spatiu insuficient \n");
return;
}
}
return 0;}