Sunteți pe pagina 1din 29

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. RM-211 Dascal Sergiu
A verificat:
dr., conf. univ. M. Kulev

Chişinău -2021
Lucrarea 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ă.
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ă.
Valorile datelor iniţiale : n=2,
struct casa
char adresa[50];
int telefon;
float suprafata;
int numar_odai;
float cost;

Mersul lucrării:
Noţiuni din teorie şi metodele folosite:
În Programarea calculatoarelor algoritmul este un set finit de operatiuni
(actiuni) pentru a rezolva problema dată la calculator. Există mai multe
forme de reprezentare a algoritmilor [2]:
- forma naturală;
- forma grafică;
- pseudocodul;
- programul scris intr-un limbaj de programare.

Algoritm cu structură ramificata este caracterizat prin prezenta


operaţiunilor de decizie [2].
Algoritm cu structură ciclica este caracterizat prin prezenta operatiunilor
recursive [2].

Structura generală a unui program in limbajul C este urmatoarea [2 - 4]:


- directivele preprocesorului (după necisitate);
- declarațiile variabelelor globale și a funcțiilor programului (după
necesitate);
- cudul functiei principale main( );
- codurile altor funcții programului (după necesitate).
Structura funcției în limbajul C [2 - 4] :
1. Antetul funcției, sau prima linie a codului funcției, care constă din 3
elemente: a) tipul funcției; b) denumirea funcției; c) lista tipurilor și
denumirelor a parametrilor funcției scrisă între parantezele rotunde.
2. Corpul funcției scris între acolade { }.
a) date de intrare:
n, struct casa- variabila simple de tip integer si tabloul structura
(de introdus de la tastatură).

b) date de ieşire:
struct casa- variabile simple de tip real, valorile formulelor de calcul
(de afişat pe ecran).
c) date de lucru: casa *p, casa *c, casa *nc, casa *nb, casa t, casa *c2,
men, n, nm, num, flag, str[50], i, l, k, id_before, id_after, id_delete

Codul programului in limbajul C:


typedef struct casa

char adresa[50];

int telefon;

float suprafata;

int numar_odai;

float cost;

struct casa *next;

}casa;

casa *head;

int create(int n);

void read();

void show();

void show1(casa *head);

casa *search(char *a);

void modify(casa *c);

void swap(casa *c, casa *b);

int lenght();

void sort();

void last(int n);

void free();

void add_after_id(int id);


void add_before_id(int id);

void add_to_end();

void delete_id(int id);

void devide(int id, casa **head2);

void join(casa **head2);

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include "LAB 9.h"

int create(int n)

casa *c, *p;

int i;

for(i=0; i<n; i++)

c=(casa*)malloc(sizeof(*c));

if(i==0)

head=c;

else

p->next=c;

p=c;

c->next=NULL;
return 0;

void read()

casa *c;

int i=0;

c=head;

while(c)

printf("Introduceti datele despre casa nr. %d\n", i+1);

printf("Adresa : ");

fflush(stdin);

gets(c->adresa);

printf("Telefonul : ");

scanf("%d", &c->telefon);

printf("Suprafata : ");

scanf("%f", &c->suprafata);

printf("Numarul de odai : ");

scanf("%d", &c->numar_odai);

printf("Costul : ");

scanf("%f", &c->cost);

c=c->next;

i++;

void show()

{
casa *c;

int i=0;

printf("\nInfo despre casa : ");

c=head;

while(c)

printf("\n\tCasa numarul : %d\n", i+1);

printf("Adresa : %s\n", c->adresa);

printf("Telefonul : %d\n", c->telefon);

printf("Suprafata : %.2f\n", c->suprafata);

printf("Numarul de odai : %d\n", c->numar_odai);

printf("Costul : %.2f\n", c->cost);

printf("Current adress : %p\n", c);

printf("Next adress : %p\n", c->next);

c=c->next;

i++;

void show1(casa *head)

casa *c;

int i=0;

printf("\nInfo despre casa : ");

c=head;

while(c)

printf("\n\tCasa numarul : %d\n", i+1);

printf("Adresa : %s\n", c->adresa);


printf("Telefonul : %d\n", c->telefon);

printf("Suprafata : %.2f\n", c->suprafata);

printf("Numarul de odai : %d\n", c->numar_odai);

printf("Costul : %.2f\n", c->cost);

printf("Current adress : %p\n", c);

printf("Next adress : %p\n", c->next);

c=c->next;

i++;

casa *search(char *a)

casa *c;

c=head;

while(c)

strlwr(c->adresa);

strlwr(a);

if(strcmp(c->adresa, a)==0)

return c;

else

c=c->next;

return NULL;
}

void modify(casa *c)

int flag;

printf("Doriti sa modificati adresa? (1/0) : ");

scanf("%d", &flag);

if(flag)

printf("Adresa curenta : %s\n", c->adresa);

printf("Adresa noua : ");

fflush(stdin);

gets(c->adresa);

printf("Doriti sa modificati telefonul? (1/0) : ");

scanf("%d", &flag);

if(flag)

printf("Telefonul curent : %d\n", c->telefon);

printf("Telefonul nou : ");

scanf("%d", &c->telefon);

printf("Doriti sa modificati suprafata? (1/0) : ");

scanf("%d", &flag);

if(flag)

printf("Suprafata curenta : %s\n", c->suprafata);

printf("Suprafata noua : ");

scanf("%f", &c->suprafata);
}

printf("Doriti sa modificati numarul de odai? (1/0) : ");

scanf("%d", &flag);

if(flag)

printf("Numarul curent de odai : %s\n", c->numar_odai);

printf("Numarul nou de odai : ");

scanf("%d", &c->numar_odai);

printf("Doriti sa modificati costul? (1/0) : ");

scanf("%d", &flag);

if(flag)

printf("Costul curent : %s\n", c->cost);

printf("Costul nou : ");

scanf("%f", &c->cost);

printf("Modificarea a avut loc cu succes!");

return;

void swap(casa *c, casa *b)

casa *nc, *nb;

casa t;

nc=c->next;

nb=b->next;

t=*c;
*c=*b;

*b=t;

c->next=nc;

b->next=nb;

int lenght()

casa *c;

int l=0;

c=head;

while(c)

l++;

c=c->next;

return l;

void sort()

int n, i, k;

casa *c, *b;

n=lenght();

for(i=0; i<n; i++)

c=head;

b=c->next;

for(k=0; k<n-i-1; k++)


{

if(strcmp(c->adresa, b->adresa)>1)

swap(c, b);

c=c->next;

b=b->next;

void last(int n)

casa *c;

int i;

c=head;

for(i=0; i<n-1; i++)

c=c->next;

printf("Adresa ultimului element din lista : %p\n", c);

void free()

casa *c, *p;

c=head;

while(c)

{
p=c;

c=c->next;

free(p);

head=NULL;

void add_after_id(int id)

casa *c=head, *p;

int i=0;

while(c)

if(i==id-1)

p=c;

c=(casa*)malloc(sizeof(casa));

printf("casa nr. %d\n", i+2);

printf("Adresa : ");

fflush(stdin);

gets(c->adresa);

printf("Telefonul : ");

scanf("%d", &c->telefon);

printf("Suprafata : ");

scanf("%f", &c->suprafata);

printf("Numarul de odai : ");

scanf("%d", &c->numar_odai);

printf("Costul : ");

scanf("%f", &c->cost);
c->next=p->next;

break;

i++;

c=c->next;

void add_before_id(int id)

casa *c=head, *p;

int i=0;

while(c)

if(i==id-1)

p=c;

c=(casa*)malloc(sizeof(casa));

printf("casa nr. %d\n", i-1);

printf("Adresa : ");

fflush(stdin);

gets(c->adresa);

printf("Telefonul : ");

scanf("%d", &c->telefon);

printf("Suprafata : ");

scanf("%f", &c->suprafata);

printf("Numarul de odai : ");

scanf("%d", &c->numar_odai);

printf("Costul : ");
scanf("%f", &c->cost);

if(p==head)

c->next=head;

head=c;

break;

else

c->next=p;

i=0;

p=head;

while(p)

if(i==id-2)

p->next=c;

i++;

p=p->next;

break;

i++;

c=c->next;

}
void add_to_end()

int i=0;

casa *c=head, *p;

while(c)

if(c->next==NULL)

p=c;

c=(casa*)malloc(sizeof(casa));

printf("casa nr. %d\n", i+2);

printf("Adresa : ");

fflush(stdin);

gets(c->adresa);

printf("Telefonul : ");

scanf("%d", &c->telefon);

printf("Suprafata : ");

scanf("%f", &c->suprafata);

printf("Numarul de odai : ");

scanf("%d", &c->numar_odai);

printf("Costul : ");

scanf("%f", &c->cost);

c->next=p->next;

break;

c=c->next;

}
void delete_id(int id)

casa *c=head, *p;

int i=0;

while(c)

if(i==id-1)

if(c==head)

head=c->next;

free(c);

break;

else if(c->next==NULL)

p=head;

while(p)

if(p->next==c)

free(c);

p->next=NULL;

break;

p=p->next;

else
{

p=head;

while(p)

if(p->next==c)

p->next=c->next;

free(c);

break;

p=p->next;

i++;

c=c->next;

void devide(int id, casa **head2)

casa *c=head;

int i=0;

while(c)

if(i==id-1)

*head2=c->next;

c->next=NULL;
break;

i++;

c=c->next;

void join(casa **head2)

casa *c=head;

while(c)

if(c->next=NULL)

c->next=*head2;

break;

c=c->next;

*head2=NULL;

#include "LAB 9.cpp"

int main()

casa **head2=NULL;

int n, nm, num, flag;

int id_devide;

int id_before;
int id_after;

int id_delete;

char str[50];

casa *c, *c2;

while(1)

system("cls");

printf("\t\tMENU\n");

printf("\t1) Crearea listei\n");

printf("\t2) Introducerea valorilor\n");

printf("\t3) Afisarea\n");

printf("\t4) Cautare\n");

printf("\t5) Modificarea\n");

printf("\t6) Swap\n");

printf("\t7) Lungimea listei\n");

printf("\t8) Sortarea listei\n");

printf("\t9) Adresa ultimului nod din lista\n");

printf("\t10) Adaugarea dupa ID\n");

printf("\t11) Adaugarea inaintea la ID\n");

printf("\t12) Adaugarea la sfirsit\n");

printf("\t13) Stergerea elementului\n");

printf("\t14) Divizarea\n");

printf("\t15) Concatinarea\n");

printf("\t16) Eliberarea memoriei\n");

printf("\t0) Exit\n");

printf("\nAlegeti optiunea : ");

scanf("%d", &nm);

switch(nm)

{
case 0: printf("Doriti sa esiti din program? (1/0) : ");

scanf("%d", &flag);

if(flag)

return 0;

case 1: printf("Introduceti numarul de noduri in lista : ");

scanf("%d", &n);

num=create(n);

printf("Memoria a fost alocata cu succes!");

getch();break;

case 2: read();break;

case 3: show();

getch();break;

case 4: printf("\nIntrodu adresa casei cautate : ");

fflush(stdin);

gets(str);

c=search(str);

if(c!=NULL)

printf("Adresa : %s\n", c->adresa);

printf("Telefonul : %d\n", c->telefon);

printf("Suprafata : %.2f\n", c->suprafata);

printf("Numarul de odai : %d\n", c->numar_odai);

printf("Costul : %.2f\n", c->cost);

printf("Current adress : %p\n", c);

printf("Next adress : %p\n", c->next);

else
{

printf("Casa cu adresa : '%s' nu exista", str);

c=NULL;

getch();break;

case 5: printf("Introduceti adresa casei care doriti sa fie modificata : ");

fflush(stdin);

gets(str);

c=search(str);

if(c!=NULL)

modify(c);

else

printf("Casa cu adresa : '%s' nu a fost gasita!", str);

getch();break;

case 6: printf("\nIntroduceti adresa primei case : ");

fflush(stdin);

gets(str);

c=search(str);

if(c!=NULL)

printf("\nIntroduceti adrea casei adoua : ");

fflush(stdin);

gets(str);

c2=search(str);

if(c2!=NULL)
{

swap(c, c2);

else

printf("Casa adoua nu a fost gasita!");

getch();break;

else

printf("Prima casa nu a fost gasita!");

getch();break;

getch();break;

case 7: printf("Lungimea listei este : %d", lenght());

getch();break;

case 8: sort();

printf("Lista a fost sortata!");

getch();break;

case 9: last(n);

getch();break;

case 10: system("cls");

show1(head);

printf("Introduceti numarul de ordine : ");

scanf("%d", &id_after);

if(id_after>0 && id_after<lenght())

system("cls");
add_after_id(id_after);

else

printf("\nID inexistent!\nIntroduceti alt numar\n");

system("cls");

system("pause");

break;

case 11: system("cls");

show1(head);

printf("Introduceti numarul de ordine : ");

scanf("%d", &id_before);

if(id_before>0 && id_before<=lenght())

system("cls");

add_before_id(id_before);

else

printf("\nID inexistent!\nIntroduceti alt numar\n");

system("cls");

system("pause");

break;

case 12: system("cls");

add_to_end();

system("pause");

break;
case 13: system("cls");

show1(head);

printf("Introduceti numarul de ordine");

scanf("%d", &id_delete);

if(id_delete>0 && id_delete<lenght())

delete_id(id_delete);

else

printf("\nID inexistent!\nIntroduceti alt numar\n");

system("pause");

break;

case 14: system("cls");

show1(head);

printf("Introduceti numarul de ordine");

scanf("%d", &id_devide);

if(lenght()>1 &&id_devide>0 && id_devide<lenght())

devide(id_devide, head2);

system("cls");

show1(head);

printf("A doua lista\n");

show1(*head2);

system("pause");

break;

case 15: system("cls");


if(head2)

join(head2);

else

printf("\nNu exista adoua lista\n");

system("cls");

break;

case 16: free();

printf("Memoria a fost eliberata cu succes!");

getch();break;

default: printf("Optiune incorecta"); break;

return 0;

}
Analiza rezultatelor și concluzii:
1. Au fost obţinute deprinderi de elaborare, compilare, rulare și
testare a unui program ce contine tablou unidimensional în
limbajul de programare C.
2. Programul da rezultate corecte, veridice din punct de vedere
matematic.
3. Programul exclude probabilitatea situatiilor de conflict, cind
structura contine zero elemente.
4. Programul verifica optiunile alese anterior si exclude efectuarea
pasilor inutili sau imposibili.
5. Programul elaborat acorda utilizatorului un sir de optiuni din care
el poate alege.

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