Sunteți pe pagina 1din 18

Ministerul Educaţiei, Culturii și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei


Departamentul Informatică și Ingineria Sistemelor

RAPORT
Lucrarea de laborator nr. 9 la Programarea Calculatoarelor

A efectuat: st. gr. CR-201 Sergiu Leva


A verificat: dr., conf. univ. Mihail Kulev
Lucrarea de laborator nr. 9
Tema: 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
înlănţuită” în limbajul C cu asigurarea operațiilor de prelucrare de
bază ale listei.
Sarcina (cоnform variantelor):
Să se scrie trei fișiere-text în limbajul C pentru
implementarea și utilizarea TAD “Tablou de structuri”:
1. Fişier antet cu extensia .h, care conține specificarea
structurii de date a elementului tabloului (conform
variantelor) şi prototipurile funcţiilor de prelucrare a
tabloului de structuri.
2. Fişier cu extensia .cpp sau .c, care conține implementările
(codurile) funcţiilor, declarate în fişierul antet.
3. Fişier al utilizatorului, funcţia mаin() pentru prelucrarea
tabloului de structuri 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ă.
30
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 9 Structura Casă cu câmpurile: adresa, telefonul, suprafaţa,


numărul de odăi, costul.
Mersul lucrării:
Noţiuni din teorie şi metodele folosite:
Lista este o structura de date logica, liniara, cu date omogene, in care fiecare
element are un succesor si un predecesor, exceptand primul element, care nu
are decat succesor si ultimul element care nu are decat predecessor
In cazul listelor simplu inlantuite adresa ultimului element este NULL pointer, iar adresa
primului element este variabila globala declarata in header. Astfel structura contine datele
necesare utilizatorului + adresa catre urmatorul element (lucru necesar programului pentru a
prelucra pe rind datele.)

Codul programului.

Fisierul .h

//lista simpla inlatuita


typedef struct casa
{
char adress[40];
int cam;
char tel[16];
float aria;
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(Casa *h1, Casa *h2);
int save(char *v);
int load(char *v);
void freeMemory();

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

void readElement(Casa *c)


{
printf("Adresa: ");
fflush(stdin);
gets(c->adress);
printf("Nr. de camere: ");
scanf("%d", &c->cam);
printf("Nr. de telefon: ");
fflush(stdin);
gets(c->tel);
printf("Suprafata (m^2): ");
scanf("%f", &c->aria);
printf("Cost (mii lei): ");
scanf("%f", &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 case: ");
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 case: ");
while(c)
{
printf("Casa[%d].Adresa: %s Nr.camere: %d Suprafata: %.2f(m^2)
Telefonul: %s Pretul: %.2f (mii lei)\n",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 case: ");
while(p)
{
printf("Casa[%d].Adresa: %s Nr.camere: %d Suprafata: %.2f(m^2)
Telefonul: %s Pretul: %.2f (mii lei)\n",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 casei? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati adresa:");
fflush(stdin);
gets(c->adress);
}
printf("De modificat nr de camere? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati nr de camere:");
scanf("%d", &c->cam);
}
printf("De modificat pretul (mii lei)? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati pretul:");
scanf("%d", &c->cost);
}
printf("De modificat telefonul? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati nr de telefon:");
scanf("%s", &c->tel);
}
printf("De modificat suprafata ? (1/0): ");
scanf("%d", &f);
if(f!=0){
printf("Dati aria(m^2):");
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);
p=searchElemP(c);
if ((c==NULL)||(p==NULL)){
return 0;
}
p->next=NULL;
head2=c;
return 1;

int unite(Casa *h1, Casa *h2)


{
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;
return;
}

Fisierul main.c
#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 case: ");
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 casei cautate: ");
fflush(stdin);
gets(adresa);
S=searchElement(adresa);
if(S==NULL){
puts("Casa cautata nu a fost gasita in tablou ");}
else{
puts("Info despre casa: ");
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("Pentru a continua apasati tasta Enter");


getch();
break;
case 5:
puts("Dati adresa casei de modificat:");
fflush(stdin);
gets(adresa);
S=searchElement(adresa);
if(S==NULL){
puts("Casa cautat nu a fost gasit in tablou ");
}
else{
puts("Info despre casa: ");
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 casei pentru interschimbare");


fflush(stdin);
gets(adresa);
S=searchElement(adresa);
if(S==NULL){
puts ("Casa nu a fost gasita");
}
else{
puts ("Info despre casa:");
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 casei pentru interschimbare");
fflush(stdin);
gets(adresa);
B=searchElement(adresa);
if(S==NULL){
puts ("Casa nu a fost gasita");
}
else{
puts ("Info despre casa:");
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 casa de adaugat la sfirsit");
appendElement();
puts("Casa adaugata cu succes. Pentru a continua apasati tasta
Enter");
getch();
break;
case 11:
puts("Dati info despre casa de adaugat la inceput");
prependElement();
puts("Casa adaugata cu succes. Pentru a continua apasati tasta
Enter");
getch();
break;
case 12:
puts("Dati adresa casei. Dupa acest element va fi introdus noul
element");
fflush(stdin);
gets(adresa);
flag=afterElem(adresa);
if (flag){
printf("Inserarea dupa casa 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 casei. 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 casei. 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(head, head2);
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
}

Analiza rezultatelor și concluzii:

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.

Bibliografie:
1. Conspectul prelegerilor on-line al cursului Programarea Calculatoarelor pentru studenții gr. CR201,
CR-202, CR-203, RM-201, AI-201 (lector: dr., conf. univ. M. Kulev). Chișinău, UTM, FCIM, 2020.

2. Documentul pdf https://else.fcim.utm.md/pluginfile.php/17106/mod_resource/content/1/Structuri


%20de%20date_Liste.pdf (lector: dr., conf. univ. M. Kulev). Chișinău, UTM, FCIM, 2020.

3. https://tutoriale-pe.net/liste-simplu-inlantuite-structuri-de-date-alocate-dinamic/

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