Sunteți pe pagina 1din 20

Ministerul Educaţiei

al Republicii Moldova

Universitatea Tehnică a Moldovei


Catedra Calculatoare și rețele

RAPORT
despre lucrarea de laborator Nr. 9
la Programarea calculatoarelor

Tema: Implementarea tipului abstract de date


,,Tablou de structure”

Varianta 7

A efectuat:
st. gr. RM-201 Grosu Maxim

A verificat:
Lector univ. Stratulat Stefan
Chişinău – 2021
Lucrare de laborator nr.9
Теmа: Implementarea tipului abstract de date „Listă unidirecțională”
(„Listă simplu înlănțuită”) în limbajul C.
Partea II

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.
Sarcină: Să se scrie trei fişiere-text în limbajul C pentru implementarea
și utilizarea TAD “Listă simplu înlanţuită” cu asigurarea operațiilor de
prelucrare ale listei:

4. Fişier antet cu extensia .h, care conține specificarea structurii de date


a elementului listei simplu înlănțuite (conform variantelor) şi
prototipurile funcţiilor de prelucrare a listei.

5. Fişier cu extensia .cpp sau .c, care conține implementările funcţiilor


(codurile funcţiilor) declarate în fişierul antet.

6. Fişier al utilizatorului, funcţia mаin() pentru prelucrarea listei cu


afişarea la ecran a următorului meniu de opţiuni:

1. Crearea listei în memoria dinamică.


2. Introducerea informației despre elementele listei de la tastatură.
3. Afişarea informației despre elementele listei la ecran.
4. Căutarea elementului în listă.
5. Modificarea câmpurilor unui element din listă.
6. Determinarea adresei ultimului element din listă.
7. Determinarea lungimii listei (numărul de elemente).
8. Înterschimbarea a două elemente indicate din listă.
9. Sortarea listei.
10. Adăugarea unui element nou la sfârșitul listei.
11. Adăugarea unui element nou la începutul listei.
12. Inserarea unui element nou după elementul indicat al liste.i
13. Inserarea unui element nou înaintea elementului indicat în listă.
14. Ştergerea elementului indicat în listă.
15. Divizarea listei în două liste.
16. Concatenarea a două liste.
17. Salvarea informației despre elementele listei în fişier.
18. Citirea informației despre elementele listei din fişier.
19. Eliberarea memoriei alocate pentru listă.
0. Ieşirea din program.
Indicaţie:
La realizarea operaţiei de afișare la ecran a informaţiei referitor la
elementele listei a se prevedea afișarea adreselor din memorie ale
elementelor curent şi următor din listă.

Varianta 7 . Structura Disciplina cu


cimpurile:denumirea,anul,Facultatea,departamentul,numarul
de ore.

Codul :
Fisierul .h
//lista simpla inlatuita
typedef struct casa
{
char adress[40];
int cam;
char tel[40];
char aria[40];
float cost;
struct casa* next;
}Casa;

Casa *head;
Casa *head2;

int createList(int n);


void readInfo();
void readElement(Casa *c);
void showInfo();
Casa* searchElement(char *adress);
Casa* searchElemP(Casa* adress);
void modifyInfo(Casa* m);
Casa* lastElement();
int sizeList();
void swap(Casa *s1, Casa *s2);
void sortList();
void appendElement();
void prependElement();
int afterElem(char *v);
int beforeElem(char *v);
int deleteElem(char *v);
int split(char *v);
int unite();
int save(char *v);
int load(char *v);
void freeMemory();

#include "functii.c"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main (){


Casa *S,*B;
char adresa[40];
char fname[40];
int n,nm,flag;
while(1) // for(;;)
{
system("cls");
puts("\t MENU:");
puts("1. Alocarea dinamica a memoriei p/u lista de structuri");
puts("2. Introducerea elementelor listei de la tastatura");
puts("3. Afisarea la ecran");
puts("4. Cautarea elementului");
puts("5. Redactarea elementului listei");
puts("6. Determinarea ultimului element din lista");
puts("7. Determinarea lungimii listei(nr de elemente) ");
puts("8. Interschimbarea a 2 elemente din lista ");
puts("9. Sortarea Listei ");
puts("10. Adaugarea unui element nou la sfirsit");
puts("11. Adaugarea unui element nou la inceput");
puts("12. Inserarea unui element nou dupa elementul indicat al listei");
puts("13. Inserarea unui element nou inaintea elementului indicat al listei");
puts("14. Stergerea elementului indicat in lista.");
puts("15. Divizarea listei in doua liste.");
puts("16. Concatenarea a doua liste.");
puts("17. Salvarea informatiei despre elementele listei in fisier.");
puts("18. Citirea informatiei despre elementele listei din fisier.");
puts("19. Eliberarea memoriei ");
puts("0. Iesire din program ");
printf("\nAlegeti optiunea din menu: ");
scanf("%d", &nm);
switch(nm)
{
case 1:
printf("Dati numarul de Discipline: ");
scanf("%d", &n);
flag=createList(n);
if(flag!=1){
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();
getch();
break;
case 4:
puts("Dati adresa Disciplinei cautate: ");
fflush(stdin);
gets(adresa);
S=searchElement(adresa);
if(S==NULL){
puts("Disciplina cautata nu a fost gasita in tablou ");}
else{
puts("Info despre Disciplina: ");
printf("Adresa: %s Nr.camere: %d Suprafata: %s Telefonul: %s Pretul : %s
\n",S->adress,S->cam,S->aria,S->tel,S->cost);
}

puts("Pentru a continua apasati tasta Enter");


getch();
break;
case 5:
puts("Dati adresa Disciplinei de modificat:");
fflush(stdin);
gets(adresa);
S=searchElement(adresa);
if(S==NULL){
puts("Disciplina cautat nu a fost gasit in tablou ");
}
else{
puts("Info despre Disciplina: ");
printf("Adresa: %s Nr.camere: %d Suprafata: %.2f(m^2) Telefonul: %s Pretul
(mii lei): %.2f \n",S->adress,S->cam,S->aria,S->tel,S->cost);
modifyInfo(S);
}

puts("Pentru a continua apasati tasta Enter");


getch();
break;
case 6:

S=lastElement();
printf("Adresa ultimui element al listei: %x %x \n", S, S->next);
getch();
break;
case 7:

n=sizeList();
printf("Lungime listei este %d\n", n);
getch();
break;
case 8:

puts("Dati adresa Disciplinei pentru interschimbare");


fflush(stdin);
gets(adresa);
S=searchElement(adresa);
if(S==NULL){
puts ("Casa nu a fost gasita");
}
else{
puts ("Info despre Discipline:");
printf("Adresa: %s Nr.camere: %d Suprafata: %.2f(m^2) Telefonul: %s Pretul
(mii lei): %.2f \n",S->adress,S->cam,S->aria,S->tel,S->cost);
}
puts("Dati adresa Discipline pentru interschimbare");
fflush(stdin);
gets(adresa);
B=searchElement(adresa);
if(S==NULL){
puts ("Disciplina nu a fost gasita");
}
else{
puts ("Info despre Disciplina:");
printf("Adresa: %s Nr.camere: %d Suprafata: %.2f(m^2) Telefonul: %s Pretul
(mii lei): %.2f \n",S->adress,S->cam,S->aria,S->tel,S->cost);
}
if (S!=NULL && B!=NULL){
swap(S,B);
puts("Interschimbarea produsa cu sussces. Tastati enter pentru a continua");
}
else{
puts("UPS. mai incearca");
}
getch();
break;
case 9:
sortList();
puts("Lista a fost sortata. Tastati enter pentru a continua");
getch();
break;
case 10:
puts("Dati info despre Disciplina de adaugat la sfirsit");
appendElement();
puts("Disciplina adaugata cu succes. Pentru a continua apasati tasta Enter");
getch();
break;
case 11:
puts("Dati info despre Disciplina de adaugat la inceput");
prependElement();
puts("Disciplina adaugata cu succes. Pentru a continua apasati tasta Enter");
getch();
break;
case 12:
puts("Dati adresa Disciplina. Dupa acest element va fi introdus noul element");
fflush(stdin);
gets(adresa);
flag=afterElem(adresa);
if (flag){
printf("Inserarea dupa Disciplina cu adresa %s s-a realizat.",adresa);
}
else{
puts("Eroare! Ai introdus corect adresa de cautare? Sunt elemente in lista?");
}
getch();
break;
case 13:
puts("Dati adresa Disciplina. Inaintea acestui element va fi intodus noul element");
fflush(stdin);
gets(adresa);
flag=beforeElem(adresa);
if (flag){
puts("Inserarea s-a produs cu succes.");
} else {
puts("Eroare! Ai introdus corect adresa de cautare? Sunt elemente in lista?");
}
getch();
break;
case 14:
puts("Dati adresa Disciplinei. Acest element va fi sters.");
fflush(stdin);
gets(adresa);
flag=deleteElem(adresa);
if (flag){
puts("Elementul a fost sters...");
}
else{
puts("Nu ai ce sterge(-_-)");
}
getch();
break;
case 15:
puts("Dati adresa casei. Acest element va fi capul listei nr 2");
fflush(stdin);
gets(adresa);
flag=split(adresa);
if (flag){
puts("Lista a fost impartita...");
}
else {
puts("Lista este vida sau are un singur element ori adresa cautata nu exista. Nu
putem diviza...");
}
getch();

break;
case 16:
flag=unite();
if (flag){
puts("Lista a fost unita.");
}
else {
puts("Nu avem ce uni. ");
}
getch();
break;
case 17:
puts("Dati adresa fisierului unde va fi salvata informatia");
fflush(stdin);
gets(fname);
flag=save(fname);
if (flag==1){
puts("Informatia a fost salvata");
}
if(flag==0){
puts("Nu s-a putut salva informatia...");
}
if (flag==-1){
puts("Lista este vida. Nu salvez nimic!");
}
getch();
break;
case 18:
puts("Dati adresa fisierului de unde va fi citita informatia");
fflush(stdin);
gets(fname);
flag=load(fname);
if (flag==1){
puts("Informatia a fost salvata");
}
if (flag==0){
puts("Nu s-a putut salva informatia...");
}
if (flag==-1){
puts("Aloca memorie si dupa citeste din fisier!!!");
}
getch();
break;
case 19:
freeMemory();
puts("memoria a fost eliberata. Tastati enter pentru a continua");
getch();
break;
case 0:
printf("Doriti sa iesiti din program? (1/0): ");
scanf("%d", &flag);
if(flag==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();
} // end switch

} // end while
}
#include "_Disp.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void readElement(Casa *c)


{
printf("denumirea: ");
fflush(stdin);
gets(c->adress);
printf("anul: ");
scanf("%s", &c->cam);
printf("Facultatea: ");
fflush(stdin);
gets(c->tel);
printf("departamentul: ");
scanf("%d", &c->aria);
printf("numarul de ore: ");
scanf("%s", &c->cost);
}

Casa* searchElemP(Casa* adress)


{
Casa *c;
c=head;
while (c)
{
if (c->next==adress){return c;}
c=c->next;
}
return NULL;
}

int createList(int n)
{
Casa* c, *p;
int i;
for(i=0;i<n;i++){
c=(Casa*)calloc(1,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)
{
Casa *c;
int i;
puts("Dati info despre Discipline: ");
c=head;
i=0;
while(c)
{
readElement(c);
c=c->next;
i++;
}
return;
}

void showInfo(void)
{
Casa*c,*p;
int i;
c=head;
i=0;
if (head==NULL){
puts("Alocati macar memorie (-_-)");
return;
}
puts("Info despre Discipline: ");
while(c)
{
printf("Disciplina[%d].denumirea: %s anul: %s Facultatea: %s departamentul: %s numarul de
ore: %s",i+1,c->adress,c->cam,c->aria,c->tel,c->cost);
i++;
printf("\tadress elem:%x\t",c);
c=c->next;
printf("adress next:%x\n",c);
if(c==head) break;
}
p=head2;
i=0;
if (head2==NULL){
return;
}
puts("Info despre Discipline: ");
while(p)
{
printf("Disciplina[%d].denumirea: %s anul: %s Facultatea: %s departamentul: %s numarul de
ore: %s ",i+1,p->adress,p->cam,p->aria,p->tel,p->cost);
i++;
printf("\tadress elem:%x\t",p);
p=p->next;
printf("adress next:%x\n",p);
if(p==head) break;
}
return;
}

Casa* searchElement(char* v)
{
Casa*c;
c=head;
while(c)
{
if(stricmp(c->adress, v)==0) {return c;}
c=c->next;
if(c==head) break;
}
return NULL;
}

void modifyInfo(Casa* c)
{
int f;
printf("De modificat adresa Disciplinei? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati denumirea:");
fflush(stdin);
gets(c->adress);
}
printf("De modificat anul? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati anul:");
scanf("%d", &c->cam);
}
printf("De modificat Facultatea? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati Facultatea:");
scanf("%d", &c->cost);
}
printf("De modificat departamentul? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati nr de departamentul:");
scanf("%s", &c->tel);
}
printf("De modificat numarul de ore ? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("numarul de ore:");
scanf("%f", &c->aria);
}

return;
}

Casa* lastElement(void)
{
Casa*c;
c=head;
while(c->next!=NULL)
{
c=c->next;
if (c->next==head){
break;
}

}
return c;
}

int sizeList(void)
{
Casa*c;
int n;
c=head;
n=0;
while(c){
n++;
c=c->next;
if(c==head) break;
}
return n;
}

void swap(Casa *s1, Casa *s2)


{
Casa *na, *nb;
Casa t;
na=s1->next;
nb=s2->next;
t=*s1;
*s1=*s2;
*s2=t;
s1->next=na;
s2->next=nb;
return;
}

void sortList(void)
{
int i,k;
Casa *a,*b;
int n;
n=sizeList();

for(i=0; i<n;i++)
{a=head;
b=a->next;
for(k=0;k<n-1-i;k++)
{
if(stricmp(a->adress,b->adress)>0)
{
swap(a,b);
}
a=a->next;
b=b->next;
}
}
return;
}

void appendElement(){
Casa *c;
if (head==NULL)
{
c=(Casa*)malloc(sizeof(*c));
head=c;
c->next=NULL;
readElement(c);
return;
}
Casa *temp=lastElement();
c=(Casa*)malloc(sizeof(*c));
readElement(c);
temp->next=c;
c->next=NULL;
}

void prependElement(){
Casa *c;
c=(Casa*)malloc(sizeof(*c));
readElement(c);
c->next=head;
head=c;
}

int afterElem(char *v){


Casa *c,*temp,*elem;
c=(Casa*)malloc(sizeof(*c));
elem=searchElement(v);
if (elem==NULL){
return 0;
}
readElement(c);
temp=elem->next;
elem->next=c;
c->next=temp;
return 1;
}

int beforeElem(char *v){


Casa *c, *ep, *es;
es=searchElement(v);
if (es==NULL){
return 0;
}
ep=searchElemP(es);
if (ep==NULL){
prependElement();
return 1;
}
c=(Casa*)malloc(sizeof(*c));
readElement(c);
ep->next=c;
c->next=es;
return 1;

int deleteElem(char *v)


{
Casa *c,*temp;
c=searchElement(v);
if(head==NULL){
return 0;
}
if(c==head){
freeMemory();
return 1;
}
temp=searchElemP(c);
temp->next=c->next;
free(c);
return 1;
}
int split(char *v)
{
Casa *c,*p;
c=searchElement(v);
if (c==head){
puts("Nu putem diviza diviza aici");
return 0;

}
p=searchElemP(c);
if ((c==NULL)||(p==NULL)){
return 0;
}
p->next=NULL;
head2=c;
return 1;

int unite ()
{
Casa *c;
if ((head==NULL)||(head2==NULL)){
return 0;
}
c=lastElement();
c->next=head2;

head2=NULL;
return 1;
}

int save(char *fname)


{
FILE *fp;
Casa *c=head;
if (head==NULL){return -1;};
fp=fopen(fname,"w");
if (fp==NULL){return 0;}
while (c){
fprintf(fp,"%s %d %.2f %s %.2f\n",c->adress,c->cam,c->aria,c->tel,c->cost);
c=c->next;
}
fclose(fp);
return 1;
}

int load(char *fname)


{
FILE *fp;
Casa *c=head;
if (head==NULL){return -1;};
fp=fopen(fname,"r");
if (fp==NULL){return 0;}
while (c){
fscanf(fp,"%s%d%f%s%f",c->adress,&c->cam,&c->aria,c->tel,&c->cost);
c=c->next;
}
fclose(fp);
return 1;
}

void freeMemory()
{
Casa*c,*p;
c=head;
while(c){
p=c;
c=c->next;
free(p);
if(c==head) break;
}
head=NULL;
c=head2;
while (c){
p=c;
c=c->next;
free(p);
if(c==head) break;
}
head2=NULL;
return;
}
Concluzie: In cadrul acestei lucrari de laborator am facut cunostinta cu listele simplu
inlantuite. Am invatat si avantajul folosirei listelor fata de structurile simple. Listele ocupa o
zona mai mare de memorie comparabil cu tabloul de structure datorita campului alocat pentru
adresa urmatorul element. Desi ocupa mai multa memorie listele sunt o obtiune mai buna
atunci cand vrem sa stocam un numar mare de elemente. Asta deoarece lista ocupa parti din
memorie lagate intre ele cu noduri. In cazul tabloului de structure care ocupa o zona solida de
memorie. In cazul structurilor care trebuie sa-si pastreze in timpul exploatarii ordonarea dupa
un anumit criteriu, mecanismul vectorilor este greoi.In aceste cazuri, se poate alege ca solutie
de implementare a structurii de date lista, care nu este o structura fizica de organizare a datelor,
ci o structura logica, ce degreveaza programatorul de ordonarea dupa indice a structurii, impusa
de vectori.

S-ar putea să vă placă și