Laborator2 3 SDA
Laborator2 3 SDA
Raport
Lucrare de laborator Nr.2-3
Tema: Prelucrarea tipului abstract de date.
Liste simplu înlănțuite
Chișinău 2013
1. Lucrare de laborator Nr. 2-3
Denumirea
Catedra
Facultatea
Anul
Numărul de ore
De efectuat un program care va fi menit sa alcătuiască o lista simpla înlănțuită ce va conține
aceste câmpuri si le va putea procesa după diferiți parametri.
4. Mersul lucrării
4.1 Descrierea scurta a teoriei care se refera la tema lucrării de laborator si metode
folosite.
Structura de date listă
În cadrul structurilor avansate de date, structura listă ocupă un loc important. O listă,
este o structură dinamică, care se defineşte pornind de la noţiunea de vector.
Elementele unei liste sunt toate de acelaşi tip şi sunt înregistrate în memoria centrală a
sistemului de calcul. Spre deosebire de structura statică tablou la care se impune ca
numărul componentelor să fie constant, în cazul listelor acest număr poate fi variabil,
chiar nul. Listele sunt structuri flexibile particulare, care funcţie de necesităţi pot c r e ş t e
sau descreşte şi ale căror elemente pot fi referite, inserate sau şterse î n o r i c e poziţie
din cadrul listei. Două sau mai multe liste pot fi concatenate sau scindate în subliste. În
practica programării listele apar în mod obişnuit în aplicaţii referitoare la regăsirea
informaţiei, implementarea translatoarelor de programe, simulare etc.
TDA Listă
Din punct de vedere matematic, o listă este o secvenţă de zero sau mai multe
elemente numite noduri aparţinând unui anumit tip numit tip de bază, care se
reprezintă de regulă astfel : a1, a2,...,an Unde n ≥ 0 şi fiecare ai aparţine tipului de bază.
Numărul n al nodurilor se numeşte lungimea l istei. Presupunând că n ≥ 1, se
spune că a1 est e primul nod al listei iar an est e ultimul nod. Dacă n = 0 avem de-a
face cu o listă vidă. O proprietate importantă a unei liste este aceea că nodurile sale pot fi
ordonate liniar funcţie de poziţia lor în cadrul listei. Se spune că ai precede pe ai+1
pentru i=1,2,...,n-1 ş i c ă ai succede (urmează) lui ai-1 pentru i=2,3,4, ...,n. De regulă se
spune că nodul ai se află pe poziţia i. Este de asemenea convenabil să se postuleze
existenţa poziţiei următoare ultimului element al listei. În această idee se introduce
funcţia FIN(L):Tip Poziție care returnează poziţia următoare poziţiei n în l ista L având n
elemente. Se observă că FIN(L) are o distanţă variabilă faţă de începutul listei, funcţie
de faptul că lista creşte sau se reduce, în timp ce alte poziţii au o distanţă fixă faţă de
începutul listei. Pentru a defini un tip de date abstract, în cazul de faţă TDA Listă,Pe
lângă definirea din punct de vedere matematic a modelului asociat (mai sus
precizată)Este necesar să se definească şi un set de operatori aplicabili obiectelor de tip l
istă. Din păcate, pe de o parte este relativ greu de definit un set de operatori valabil în
toate aplicaţiile, iar pe de altă parte natura setului depinde esenţial de maniera de
implementare a listelor. În continuare se prezintă două seturi reprezentative de operatori
care acţionează asupra listelor, unul restrâns şi altul extins.
obiect *aloc(int n)
{
obiect *head,*o=NULL;
int i=1;
o=(obiect*)malloc(sizeof(obiect));
head=o;
o->next=NULL;
if(!o){ puts("memoria nu a fost alocata");
return 0;
}
while(i<n)
{
o->next=(obiect*)malloc(sizeof(obiect));
o->next->next=NULL;
o=o->next;
i++;
}
return head;
}
while(pos)
{
if (!strcmpi(pos->den,num))
{
printf("Dati denumirea noua a obiectului:");
fflush(stdin);
gets(pos->den);
printf("Dati denumirea noua a catedrei");
fflush(stdin);
gets(pos->cat);
printf("Dati denumirea noua a facultatii");
fflush(stdin);
gets(pos->fac);
printf("Introduceti noul an");
scanf("%d",&pos->an);
printf("Introduceti numarul de ore nou");
scanf("%d",&pos->nr_ore);
}
pos=pos->next;
}
while(o)
{
i++;
if(i+1==k1) a=o;
if(i+1==k2)
{
b=o;
if(!b->next) return 0;
break;
}
o=o->next;
}
if(k1==1)
{
x=*head;
*head=b->next;
b->next=x;
x=b->next->next;
b->next->next=(*head)->next;
(*head)->next=x;
}
else
{
x=a->next;
a->next=b->next;
b->next=x;
x=b->next->next;
b->next->next=a->next->next;
a->next->next=x;
}
return 1;
}
return 0;
while(head)
{
fprintf(fp,"%s,%s,%s,%d,%d",head->den,
head->fac,
head->cat,
head->an,
head->nr_ore);
head=head->next;
if(head) fprintf(fp,"\n");
}
fclose(fp);
return 1;
}
while(!feof(fp))
{
o=(obiect *)malloc(sizeof(obiect));
if(!o) return NULL;
o->next=NULL;
fscanf(fp,"%[^,]%*c%[^,]%*c%[^,]%*c%d*c%d%*c",o->den,
o->cat,
o->fac,
&(o->an),
&(o->nr_ore) );
if(!head) x=head=o;
else
{
x->next=o;
x=o;
}
}
fclose(fp);
return head;
}
#include"petea1.cpp"
int main()
{
obiect *buff;
obiect *head=NULL,*o=NULL,*head2=NULL,*head1=NULL;
int n,nm,y,k1,k2,n1;
char fisier[50];
char den[50],f[50];
while (1)
{puts("/t Meniu /n");
puts("1.Alocare dinamica a listei");
puts("2.Introducerea elementelor");
puts("3.Afisarea listei");
puts("4.Cautarea unu element");
puts("5.Sortarea listei");
puts("6.Modificarea listei");
puts("7.Adaugarea unui element la sfirshitul listei");
puts("8.Interschimbarea a doua elemente");
puts("9.Determinarea lungimei listei");
puts("10.Adaugarea unui element la capul listei");
puts("11.Inserarea unui element");
puts("12.Stergerea unui elemnt");
puts("13.Impartirea listei in doua");
puts("14.Alipirea a doua liste");
puts("15.Salvarea listei");
puts("16.Citirea listei");
puts("0.Eliberarea memoriei si exit");
printf("dati nm:");
scanf("%d",&nm);
clrscr();
switch(nm)
{
case 1:{
printf("dati numaru de elemente:");
scanf("%d",&n);
head=aloc(n);
getch();
break;}
case 2:{
in(head);
getch();
break; }
case 3:{
out(head);
getch();
break; }
case 4: {
printf("dati denumirea:");
fflush(stdin);
gets(f);
o=search(head,f);
printf("Denumirea %s,facultatea %s,catedra %s,Anul %d,Numaru de
ore%d",o->den,
o->fac,o->cat,o->an,o->nr_ore);
getch();
break;
}
case 5:{
if(n>1)
{sort(&head);
puts("Tabloul o fost sortat"); }
else puts("nu ajung elemnte");
getch();}
break;
case 6:{
printf("doriti sa modificati(1/0)");
scanf("%d",&y);
if(y)
{printf("dati denumierea obiectului");
fflush(stdin);
gets(den);
modific(head,den);
}
getch();
break; }
case 7:{
head=addtoend(head);
getch();
break;}
case 8: {
printf(" Introduceti termenii care doriti sa fie skimbati");
scanf("%d%d",&k1,&k2);
swapp(&head,k1,k2);
getch();
break;}
case 9:
{
n=lenght(head);
printf("%d",n);
getch();
break;
}
case 10:{
addtohead(&head);
getch();
break;
}
case 11:
if(!head)
{puts(" Eroare: Nu a fost introdus nici un element.");
getch();
break;
}
printf("Introduceti destinatia unde doriti sa faceti inserarea:");
fflush(stdin);
gets(den);
buff=aloc(1);
if(insert(&head,search(head,den),buff))
{
puts("introduceti denumirea:");
fflush(stdin);
gets(buff->den);
puts("Introduceti facultatea");
fflush(stdin);
gets(buff->fac);
printf("Introduceti catedra");
fflush(stdin);
gets(buff->cat);
printf("Introduceti anul");
scanf("%d",&(buff->an));
printf("Introduceti numarul de ore");
scanf("%d",&(buff->nr_ore));
}
else
{
puts("Elementul nu a putut fi inserat.");
free(buff);
}
getch();
break;
case 12:
printf("itnroduceti ce doriti sa stergeti");
fflush(stdin);
gets(den);
delet(&head,den);
getch();
break;
case 13:if(!head)
{
puts(" Eroare: Nu a fost introdus nici un element.");
getch();
break;
}
printf(" Nr. de elemente de lasat in prima lista:");
scanf("%d",&n1);
if(devide(&head,&head2,n1) );
{
puts("Lista a fost divizata.Tastati 1 pentru a afisa a 2a
lista...");
if(getch()=='1')
{
int i=0;
clrscr();
printf("\n Nr | Denumirea | Fac | Cat | An | Nr_ore
|\n");
while(head)
{
i++;
printf(" %-3d|%-15s|%-19s|%-16s|%-9d|%-10d|\n",i,head->den,
head->cat,head->fac,head->an,head->nr_ore );
head=head->next;
}
}
else
{puts(" Eroare: Ati introdus un numar gresit");
} }
getch();
break;
case 14:
if(!head && !head2)
{
puts(" Eroare: Nu a fost introdus nici un element.");
getch();
break;
}
head=connect(head1,&head2);
puts(" Listele au fost reunite");
getch();
break;
case 15:if(!head)
{
puts(" Eroare: Nu a fost introdus nici un element.");
getch();
break;
}
printf("Introdu denumirea fisierului:");
fflush(stdin);
gets(fisier);
if(save(head,fisier)) puts("Lista a fost salvata");
else puts("Lista nu a putut fi salvata.");
getch();
break;
case 16:{ if(head)
{
puts(" Lista contine date.");
getch();
break;
}
printf("Introdu denumirea fisierului:");
fflush(stdin);
gets(fisier);
head=loadd(fisier);
if (head)
puts("Lista a fost citita.");
else puts("Fisierul dat nu a fost gasit.");
getch();
break;
}
case 0: {
free(&head);
return 0; }
Default: puts("Alegeti corect obtiunea");
getch();
} }}
Introducerea datelor :
Afișarea datelor :
Concluzii: In urma acestei lucrari de laborator am ajuns la ideia ca e destul de usor de lucrat
cu structuri de date liste, ele sunt usor de modificat si lucrul dat nu necesita mult timp.
Deasemenea verificarea rezultatelor demonstreaza ca valoariile primite sunt adevarate ceea
ce arata ca programul lucreaza .
7. Bibliografie
1.Conspectul prelegerilor la structuri de date si algoritm pentru studentii anului I,
specialitatea Calculatoare, anul de studii 2011 ( lector dr., conf.univer. M.Kulev).
2.V. Creţu, "Structuri de date şi tehnici de programare", Litografia Institutului Politehnic
"Traian Vuia" Timişoara, 1987