Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrarea de laborator nr. 3
La Structuri de Date și Algoritmi
A efectuat:
st. gr. CR-211 Cobzac D
A verificat:
dr., conf. univ. Mihail Kulev
Chişinău -2022
Lucrare de Laborator nr 3
Tema:
Implementarea tipului abstract de date „Listă unidirecțională” („Listă simplu înlănțuită”)
în limbajul C.
Scopul lucrării:
Obţinerea deprinderilor practice de implementare și de utilizare a tipului abstract de date
(TAD) “Listă simplu înlanţuită” în limbajul C cu asigurarea operațiilor de prelucrare ale listei.
Varianta :
5).Structura Marfă cu câmpurile: denumirea, ţara, producătorul, articolul, preţul.
Mersul lucrării:
Descrierea variabilelor:
1)Fișiere:
Marfa1.h – fișier de tip header
Marfa1.c – fișier de tip C
Lab9.c – fișier de tip C
2)Date de intrare:
Denumirea[40], Pretul[40], Masa[40], , Cantitatea[40] – variabile de tip char. (De
introdus de la tastatură de către utilizator).
locuri, numarul de ordine – variabile de tip integer. . (De introdus de la tastatură de către
utilizator).
3) date de ieşire:
Denumirea[40], Pretul[40], Masa[40], spec[40] – variabile de tip char.
locuri, numarul de ordine – variabilă de tip integer.
4) date de lucru:
n, ,nm,f,nr – variabilă de tip integer.
Codul (textul, listing-ul) programului în limbajul C:
Marfa1.h
typedef struct Marfa
{
char denumirea[40];
char pretul [40];
char masa [40];
float cantitatea;
struct Marfa* next;
} Marfa;
Marfa *head;
Marfa1.c
#include "Marfa1.h"
#include<stdio.h>
#include<stdlib.h>
int createList(int n)
{
Marfa *c, *p;
int i;
for(i=0;i<n;i++)
{
c=(Marfa*)malloc(sizeof(*c));
if(c==NULL) {head=NULL; return 0;}
if(i==0){ head=c;}
else {p->next=c; }
p=c;
}
c->next=NULL;
//c->next=head;
return 1;
}
void readInfo(void)
{
Marfa*c;
int i;
c=head;
i=0;
while(c)
{
printf("Marfa %d: \n", i+1);
printf("Denumirea: ");
scanf("%s",c->denumirea);
printf("Dati Pretul: ");
scanf("%s",c->pretul);
printf("Dati Masa: ");
scanf("%s",c->masa);
printf("Cantitatea: ");
scanf("%f", &c->cantitatea);
i++;
c=c->next;
if(c==head) break;
}
return;
}
void showInfo(void)
{
Marfa*c;
int i;
c=head;
i=0;
puts("Info despre Marfa : ");
while(c)
{
void modifyInfo(Marfa* c)
{
int f;
printf("Doriti sa modificati marca? (1/0): ");
scanf("%d", &f) ;
if(f>0)
{
printf("Dati marca: ");
scanf("%s", c->denumirea);
}
printf("De modificat pretul? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati pretul:");
scanf("%s", c->pretul);
}
printf("De modificat masa? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati masa:");
scanf("%s", c->masa);
}
printf("De modificat cantitatea? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati cantitatea:");
scanf("%f", &c->cantitatea);
}
return;
}
Lab9 main.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"Marfa1.c"
int main()
{
Marfa *head1;
Marfa *head2;
int b;
Marfa C;
Marfa *S,*B;
char v[40];
char fname[20];
int n,nm,f,nr;
while(1) // for(;;)
{
system("cls");
puts("\t MENU:");
puts("======================================================
==============");
puts("1. Crearea listei in memoria dinamica. ");
puts("2. Introducerea informatiei despre Marfele listei de la tastatura. ");
puts("3. Afisarea informatiei despre Marfele listei la ecran.");
puts("4. Cautarea Marfei in lista.");
puts("5. Modificarea campurilor unuei Marfe din lista.");
puts("6. Determinarea adresei ultimulimei Marfe din lista.");
puts("7. Determinarea lungimii listei (numarul de Marfe).");
puts("8. Interschimbarea a doua Marfe indicate in lista. ");
puts("9. Sortarea listei.");
puts("10. Adaugarea marfei la sfirsitul listei. ");
puts("11. Adaugarea marfei la inceputul listei. ");
puts("12. Inserarea marfei dupa un alt automobil din lista. ");
puts("13. Inserarea marfei inaintea altui automobil din lista. ");
puts("14. Stergerea amarfei. ");
puts("15. Divizarea listei. ");
puts("16. Concatenarea listelor. ");
puts("17. Salvarea elementelor listei in fisier. ");
puts("18. Citirea elementelor tabloului din fisier. ");
puts("19. Eliberarea memoriei. ");
puts("0. Iesire din program. ");
puts("======================================================
==============");
printf("\nAlegeti optiunea din menu: ");
scanf("%d", &nm);
switch(nm)
{
case 1:
printf("Dati numarul de Marfe: ");
scanf("%d", &n);
f= createList(n);
if(f==0) {
puts("Memoria nu a fost alocata");
exit (1);
}
puts("Memoria a fost alocata cu succes");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 2:
readInfo();
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 3:
showInfo();
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 4:
puts("Dati denumirea marfei de cautat:");
scanf("%s", v);
S=searchMarfa(v);
if(S==NULL)
{puts("Marfa cautat nu a fost gasit in tablou ");
}
else
{
printf("Marfa cautat a fost gasit si are adresa: %X\n ", S);
printf("Denumirea: %s Pretul: %s Masa: %s ", S->denumirea,S-
>pretul,S->masa);
printf("cantitatea: %.2f Wh ",S->cantitatea);
}
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 5:
puts("Dati denumirea Marfei de modificat:");
scanf("%s",v);
S=searchMarfa(v);;
if(S==NULL)
{puts("Marfa cautata nu a fost gasit in lista ");
}
else
{
modifyInfo(S);
printf("Info modificata despre Marfa:%s\n ", S->denumirea);
}
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 6:
S=lastMarfa();
printf("Adresa ultimuleiu Marfe al listei %X next: %X \n ", S, S->next);
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 7:
n=sizeList();
printf("Lungimea listei: %d\n", n);
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 8:
puts("Dati denumirea marfei 1 pentru intreschimbarea:");
scanf("%s", v);
S=searchMarfa(v);
if(S==NULL)
{puts("Automobil cautat nu a fost gasit in lista ");
}
else
{ printf("Marfa cautata a fost gasit si are adresa: %X\n ", S);
}
puts("Dati denumirea Elementului 2 pentru intreschimbarea:");
scanf("%s", v);
B=searchMarfa(v);
if(B==NULL)
{puts("Marfa cautata nu a fost gasit in lista ");
}
else
{ printf("Marfa cautata a fost gasit si are adresa: %X\n ", S);
}
if(S!=NULL && B!=NULL)
{
swap(S,B);
puts("Dupa interschimbarea.");
printf("Info despre Marfa 1: Denumirea:%s Pretul:%s Masa:%s ", S-
>denumirea,S->pretul,S->masa);
printf("Cantitatea: %.2f Wh ",S->cantitatea);
printf("Info despre Marfa 2: Denumirea:%s Pretul:%s Masa :%s ", B-
>denumirea,B->pretul,B->masa);
printf("Cantitatea: %.2f Wh ",B->cantitatea);
}
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 9:
sortList();
puts("Sortarea s-a efectuat cu succes.");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 10:
printf("Adaugati informatia despre marfa adaugata\n");
printf("Dati denumirea: ");
scanf("%s", C.denumirea);
printf("\n");
printf("Dati pretul:");
scanf("%s", C.pretul);
printf("\n");
printf("Dati masa:");
scanf("%s", C.masa);
printf("\n");
printf("Dati cantitatea:");
scanf("%f", &C.cantitatea);
printf("\n");
append (C);
printf("Marfa data a fost adaugat la sfirsit\n");
puts("Pentru a continua apasati tasta Enter\n");
getch();
break;
case 11:
printf("Adaugati nformatia despre marfa de adaugat\n");
printf("Dati denumirea: ");
scanf("%s", C.denumirea);
printf("\n");
printf("Dati Pretul:");
scanf("%s", C.pretul);
printf("\n");
printf("Dati masa:");
scanf("%s", C.masa);
printf("\n");
printf("Dati cantitatea:");
scanf("%f", &C.cantitatea);
printf("\n");
prepend(C);
printf("Marfa data a fost adaugat la inceput\n");
puts("Pentru a continua apasati tasta Enter\n");
getch();
break;
case 12:
puts("Dati denumirea Marfei de cautat:");
scanf("%s", v);
S=searchMarfa(v);
if(S==NULL)
{puts("Marfa cautata nu a fost gasit in tablou ");
printf("Dati denumirea: ");
}
else
{
printf("Adaugati informatia despre marfa inserata dupa marfa cautata \n");
printf("Dati denumirea");
scanf("%s", C.denumirea);
printf("\n");
printf("Dati pretul:");
scanf("%s", C.pretul);
printf("\n");
printf("Dati masa:");
scanf("%s", C.masa);
printf("\n");
printf("Dati cantitatea:");
scanf("%f", &C.cantitatea);
printf("\n");
insertafter(C,S);
printf("Marfa data a fost inserat\n");
}
puts("Pentru a continua apasati tasta Enter\n");
getch();
break;
case 13:
puts("Dati denumirea Marfei cautate:");
scanf("%s", v);
S=searchMarfa(v);
if(S==NULL)
{puts("Marfa cautata nu a fost gasit in tablou ");
printf("Dati denumirea: ");
}
else
{
printf("Adaugati informatia despre marfa inserata inaintea marfa cautata \n");
printf("Dati denumirea");
scanf("%s", C.denumirea);
printf("\n");
printf("Dati pretul:");
scanf("%s", C.pretul);
printf("\n");
printf("Dati masa:");
scanf("%s", C.masa);
printf("\n");
printf("Dati cantitatea:");
scanf("%f", &C.cantitatea);
printf("\n");
insertbefore(C,S);
printf("Marfa data a fost inserata\n");
}
puts("Pentru a continua apasati tasta Enter\n");
getch();
break;
case 14:
puts("Dati denumirea marfei de sters:");
scanf("%s", v);
S=searchMarfa(v);
if(S==NULL)
{puts("Marfa cautata nu a fost gasit in tablou ");
printf("Dati denumirea: ");
}
else
{
deletel(S);
printf("Marfa a fost stersa");
}
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 15:
printf("Dati nr ");
scanf("%d",&nr);
splitList(nr,&head1,&head2);
head=head1;
printf("Prima lista\n");
showInfo();
head=head2;
printf("A doua lista\n");
showInfo();
head=NULL;
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 16:
concatLists(&head1,&head2);
printf("Lista intreaga dupa concatenare\n");
showInfo();
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 17:
puts("Dati numele fisierului:");
scanf("%s",fname);
f=saveInfoList(fname);
if(f==1) puts("Salvarea in fisier s-a efectuat cu succes");
else puts("Fisierul pentru a citi info despre marfa nu a fost deschis");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 18:
puts("Dati numele fisierului:");
scanf("%s",fname);
f=loadInfoList(fname);
if(f==1) puts("Citirea din fisier s-a efectuat cu succes");
else puts("Fisierul pentru a citi info despre marfa nu a fost deschis");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 19:
freeMemory();
puts("Eliberarea memoriei s-a efectuat cu succes.");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 0:
printf("Doriti sa iesiti din program? (1/0): ");
scanf("%d", &f);
if(f==1) return 0;
puts("Pentru a continua apasati tasta Enter");
getch();
break;
default: puts("Alegeti optiunea corecta din menu! ");
puts("Pentru a continua apasati tasta Enter");
getch();
}
}
}
Rezultatele testării și funcţionării programului:
Analiza rezultatelor și concluzii:
1. Programul dat a avut o strcutură asemănătoare cu cel din lucrarea de laborator trecută,
ceea ce a permis iar împărțirea codului în trei părți și economisirea locului.
2. Mulțumită implementării header-ului și a funcțiilor în main a fost posibilă folosirea unui
document cu mult mai scurt, comparative cu cel din laboratorul numărul 6.
Bibliografie:
1. https://else.fcim.utm.md/mod/assign/view.php?id=32769
2. https://else.fcim.utm.md/course/view.php?id=379
3. https://www.coursehero.com/file/p4l8ln5q/%C8%99i-de-utilizare-a-tipului-abstract-
de-date-TAD-Arbore-binar-cu-asigurarea/
4. http://repository.utm.md/bitstream/handle/5014/15229/
ProgramareaCalculatoarelor_StructuriDateAlgoritmi_C_DS.pdf?sequence=1
5. http://www.cs.ubbcluj.ro/~gabis/fp/Documentatii/TAD.pdf
6. https://else.fcim.utm.md/mod/assign/view.php?id=32768