Sunteți pe pagina 1din 20

MINISTERUL EDUCATIEI, CULTURII

ȘI CERCETĂRII AL REPUBLICII MOLDOVA


UNIVERSITATEA TEHNICA A MOLDOVEI
Facultatea Calculatoare, Informatică și Microelectronică

RAPORT
Structuri de date și algoritmi
Lucrare de laborator nr. 8

Tema: Implementarea tipului abstract de date


„Listă unidirecțională” în limbajul C.

Varianta: 5

Efectuat st. gr. CR-211 Cobzac D


Verificat conf. univ., dr. Kulev M

Chișinău 2022
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 lucrării: Să se scrie trei fișiere-text în limbajul C pentru


implementarea și utilizarea TAD “Listă simplu înlănțuită” cu asigurarea operațiilor
de prelucrare de bază ale listei:
1. 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 de bază ale listei.
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 listei cu afișarea la
ecran a următorului meniu de opțiuni de bază:
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. Interschimbarea a două elemente indicate în listă.

Varianta: Structura Marfă cu câmpurile: denumirea, țara, producătorul,


articolul, prețul.

Programul elaborat:

Cod sursa marfa.h

#ifndef HEADER_FILE
#define HEADER_FILE

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

typedef struct marfa {


char nume[20];
float pret;
float masa;
int cantitate;
struct marfa * next;
}
2
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
marfa;
marfa * head;
int create(int n);
void readinfo(void);
void show(void);
void readItem(marfa * , int i);
marfa * search(char * v);
void modify(marfa * B);
void swap(marfa * a, marfa * b);
int length(void);
void sort(void);
void append();
void prepend();
int insertafter(marfa * a, int value);
marfa * insertbefore(marfa * a, int value);
void delet(marfa * a);
void dividel(marfa ** head1, marfa ** head2, int p);
void joinl(marfa ** head1, marfa ** head2);
int write(marfa * B, int n, char * fname);
int read(char * fname);
void freemem(void);
marfa * end(void);
#endif

Cod sursa marfa.c

#include "lista.h"

int length(void) {
marfa * b;
int l;
b = head;
l = 0;
while (b) {
l++;
b = b -> next;
if (b == head) break;
}
return l;
}
int create(int n) {
marfa * b, * p;
int i;
for (i = 0; i < n; i++) {
b = (marfa * ) malloc(sizeof( * b));
if (!b) return 0;
if (i == 0) {
head = b;
} else {
3
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
p -> next = b;
}
p = b;
}
b -> next = NULL;
}
void readinfo(void) {
marfa * b;
int i = 0;
b = head;
puts("Introduce-ti informatie despre marfa:");
while (b) {
readItem(b, i);
b = b -> next;
if (b == head)
break;
i++;
}
}
void readItem(marfa * b, int i) {
printf("\nMarfa %d:\n", i + 1);
printf("Denumirea:");
fflush(stdin);
gets(b -> nume);
printf("Pretul:");
scanf("%f", & b -> pret);
printf("Masa:");
scanf("%f", & b -> masa);
printf("Cantitatea:");
scanf("%d", & b -> cantitate);
}
void show(void) {
marfa * b;
int i = 0;
b = head;
puts("Informatia despre marfa :");
while (b) {
printf("\tMarfa%d\n\t\n \tDenumirea: %s\n\tPretul: %
f\ n\ tMasa: % f\ n\ tCantitate: % d\ n\ t ", i+1, b->nume,b->pret, b->
masa, b -> cantitate);
b = b -> next;
if (b == head) break;
i++;
}
}
marfa * search(char * v) {
marfa * b = head;
while (b) {
if (strcmp(b -> nume, v) == 0) {
return b;
}
4
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
b = b -> next;
if (b == head)
break;
}
return NULL;
}
void swap(marfa * a, marfa * b) {
marfa * na, * nb;
marfa t;
na = a -> next;
nb = b -> next;
t = * a;
* a = * b;
* b = t;
a -> next = na;
b -> next = nb;
}
void sort(void) {
marfa * a, * b;
int i, k;
int l;
l = length();
for (i = 0; i < l - 1; i++) {
a = head;
b = a -> next;
for (k = 0; k < l - 1 - i; k++) {
if (strcmp(a -> nume, b -> nume) > 0) {
swap(a, b);
}
a = a -> next;
b = b -> next;
}
}
}
void modify(marfa * B) {
char ans;
puts(" \nDoriti sa modificati numele ?: Yes(y) or No(n)
");
ans = getch();
if (ans == 'y') {
printf(" Numele nou: ");
fflush(stdin);
gets(B -> nume);
}
puts(" \nDoriti sa modificati pretul ? : Yes(y) or No(n)
");
ans = getch();
if (ans == 'y') {
printf(" Pretul nou: ");
fflush(stdin);
scanf("%f", & B -> pret);
5
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
}
puts(" \nDoriti sa modificati masa marfei ? : Yes(y) or
No(n)
");
ans = getch();
if (ans == 'y') {
printf(" Masa noua a marfei este : ");
scanf("%f", & B -> masa);
}
puts(" \nDoriti sa modificati cantitatea ?: Yes(y) or
No(n)
");
ans = getch();
if (ans == 'y') {
printf(" Cantitatea noua este : ");
scanf("%d", & B -> cantitate);
}
return;
}
void delet(marfa * a) {
marfa * p;
if (head == a) {
head = head -> next;
} else {
p = head;
while (p -> next != a) {
p = p -> next;
}
p -> next = a -> next;
}
free(a);
}
int savels(char * fname) {
FILE * fp;
int i, n;
n = length();
printf("n=%d\n", n);
marfa * B;
fp = fopen(fname, "w");
if (!fp) {
return 0;
}
B = head;
printf("B=%p\n", B);
for (i = 0; i < n; i++) {
// printf("B=%p\n",B);
// printf("i=%d\n",i);
fprintf(fp, "\tMarfa%d\n\t\n \tDenumirea: %
s\ n\ tPretul: % f\ n\ tMasa: % f\ n\ tCantitate: % d\ n\ t ", i+1, B->
nume, B -> pret, B -> masa, B -> cantitate);
B = B -> next;
6
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
printf("B=%p\n", B);
if (B == head);
}
fclose(fp);
return 1;
}
int loadl1(char * fname) {
FILE * fp;
int n, i;
char ch;
marfa * b;
n = length();
fp = fopen(fname, "r");
if (!fp) return 0;
b = head;
printf("\nDatele din file %s este :\n\n", fname);
while ((ch = fgetc(fp)) != EOF)
printf("%c", ch);
fclose(fp);
return 1;
}
void append() {
int i;
marfa * b;
marfa * last;
b = (marfa * ) malloc(sizeof(marfa));
if (!b) return;
last = end();
readItem(b, i);
last -> next = b;
b -> next = NULL;
}
void prepend() {
int i;
marfa * b;
b = (marfa * ) malloc(sizeof(marfa));
if (!b) return;
readItem(b, i);
b -> next = head;
head = b;
}
marfa * end(void) {
marfa * e;
e = head;
while (e -> next && e -> next != head) {
e = e -> next;
}
return e;
}
int insertafter(marfa * a, int value) {
int i;
7
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
marfa * b;
b = (marfa * ) malloc(sizeof( * b));
if (!b) return 0;
readItem(b, i);
b -> next = a -> next;
a -> next = b;
return 1;
}
marfa * insertbefore(marfa * a, int value) {
int i;
marfa * b, * p;
b = (marfa * ) malloc(sizeof( * b));
if (!b) return 0;
readItem(b, i);
if (head == a) {
b -> next = a;
head;
} else {
p = head;
while (p -> next != a) {
p = p -> next;
}
b -> next = a;
p -> next = b;
}
return head;
}
void dividel(marfa ** head1, marfa ** head2, int p) {
int i = 0;
marfa * current = head;
while (i < p - 1) {
i++;
current = current -> next;
}
* head1 = head;
* head2 = current -> next;
head = NULL;
current -> next = NULL;
}
void joinl(marfa ** head1, marfa ** head2) {
marfa * c;
c = * head1;
while (c -> next != NULL) {
c = c -> next;
}
c -> next = * head2;
* head2 = NULL;
head = * head1;
* head1 = NULL;
}
void freemem(void) {
8
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
marfa * e, * p;
e = head;
while (e) {
p = e;
e = e -> next;
free(p);
if (e == head)
break;
}
}

Cod sursa main.c

#include "marfa.c"

int main() {
int num_menu;
int n, t, nr, i, value, l;
marfa * b, * p, * a, * pr, * k, * head2, * head1;
char v[50], fname[25], ch, u[30], z[30];
FILE * fp;
marfa * Marfa;
char o[30];
while (1) {
system("cls");
system(" color e");
puts("\n\t\t MENU:\n");
puts(" \t\n1.Crearea listei inlantuite");
puts(" \t\n2.Introduce-ti informatia despre marfa");
puts(" \t\n3.Partaja-ti lista");
puts(" \t\n4.Cautarea unui element");
puts(" \t\n5.Interschimbarea a doua elemente");
puts(" \t\n6.Sortarea marfurilor");
puts(" \t\n7.Modificarea unui element");
puts(" \t\n8.Stergerea unui element");
puts(" \t\n9.Salvarea datelor curente intr-un fisier");
puts(" \t\n10.Citirea fisierului");
puts(" \t\n11.Adaugarea unui element nou la sfarsit de lista");
puts(" \t\n12.Adaugarea unui element la inceput de lista");
puts(" \t\n13.Introducerea unui element dupa alt element");
puts(" \t\n14.Introducerea unui element inainte altui
element ");
puts(" \t\n15.Lungimea listei(numarul de elemente)"); puts(" \t\n16.Divizarea listei in
doua subliste"); puts(" \t\n17.Unirea celor doua subliste"); puts(" \t\n18.Eliberarea memoriei");
puts(" \t\n0. Exit\n"); scanf(" %d", & num_menu);
switch (num_menu) {
case 0:
free(p);
p = NULL;

9
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
return 0;
case 1:
system("cls");
system(" color a");
printf(" Cate marfe sunt ? : \t");
scanf(" %d", & n);
create(n);
puts("\nMemoria a fost alocata cu succes\n");
puts("Pentru a continua tastati enter");
getch();
break;
getch();
break;
////////////////////////////////////////////
case 2:
system("cls");
system("color b");
readinfo();
puts("\nPentru a continua tastati enter");
getch();
break;
////////////////////////////////////////////
case 3:
system("cls");
system("color c");
show();
puts("\nPentru a continua tastati enter");
getch();
break;
case 4:
system("cls");
system(" color c");
printf(" \nIntroduce-ti marfa care doriti sa o cautati:");
fflush(stdin);
gets(v);
Marfa = search(v);
if (Marfa) {
puts("\n\t Informatie despre marfa : \n ");
printf("\tMarfa\n\t\n \tDenumirea: %s\n\tPretul: %f\n\tMasa: %
f\ n\ tCantitate: % d\ n\ t ",Marfa->nume,Marfa->pret, Marfa->
masa, Marfa -> cantitate);
} else {
printf(" Marfa: %s nu a fost gasita", v);
}
puts("\nPentru a continua tastati enter");
getch();
break;
case 5: {
system("cls");
system(" color c");
printf("Da-ti denumirea la prima marfa: ");
10
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
fflush(stdin);
gets(v);
a = search(v);
if (!a) {
printf("\nAsa marfa nu exista");
break;
}
printf("Da-ti denumirea la a doua marfa: ");
fflush(stdin);
gets(v);
b = search(v);
if (!b) {
printf("\nAsa marfa nu exista");
break;
}
swap(a, b);
printf("\nMarfele au fost interschimbate cu succes");
puts(" \n\nPentru a le vedea tastati :\n Da(y) or Nu(n)");
char o = getch();
if (o == 'y') {
show();
}
getch();
break;
}
case 6: {
system("cls");
system("color c");
sort();
printf("Marferele au fost sortate cu succes\n");
puts("\nPentru a afisa noua lista tastati :\nYes(y) or NO(n)");
char z = getch();
if (z == 'y') {
show();
}
puts("\nPentru a continua tastati ENTER...");
getch();
break;
}
case 7:
system("cls");
system("color c");
printf("Introduce-ti numele la marfa care doriti sa-l
modificati: ");
fflush(stdin); gets(v); a = search(v); modify(a); puts("Modificarea a fost efectuata cu
succes"); puts("\nPentru a continua tastati ENTER..."); getch();
break;
case 8:
system("cls"); system("color c"); printf("Introduce-ti elementul ce doriti sa-l
stergeti:"); fflush(stdin); gets(v); a = search(v); delet(a); puts("\n\t\tElementul a fost cu succes
stearsa din lista"); puts("\nPentru a continua tastati ENTER..."); getch();
11
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
break;
case 9:
system("cls"); system("color a"); printf("Da-ti un nume pentru file:\n");
fflush(stdin); gets(fname); savels(fname); puts("\nPentru a continua tastati ENTER...");
getch();
break;
case 10:
system("cls"); printf("Da-ti numele la fisier ce doriti sa-l cititi :\n"); fflush(stdin);
gets(fname); loadl1(fname); puts("\nPentru a continua tastati ENTER..."); getch();
break;
case 11:
system("cls"); append(); puts("\nPentru a continua tastati ENTER..."); getch();
break;
case 12:
system("cls"); prepend(); puts("\nPentru a continua tastati ENTER..."); getch();
break;
case 13:
system("cls");
if (head != NULL) {
printf("Introduceti numele la marfa dupa care doriti sa fie
introdusa marfa noua: ");
fflush(stdin); gets(u); a = search(u); insertafter(a, value);
}
else {
printf("Lista e goala");
}
puts("\nPentru a continua tastati ENTER...");
getch();
break;
case 14:
system("cls");
if (head != NULL) {
printf("Introduceti numele la marfa inaintea caruia doriti sa
fie introdusa marfa noua: ");
fflush(stdin); gets(u); a = search(u); insertbefore(a, value);
}
else {
puts("\nLista este goala");
}
puts("\nPentru a continua tastati ENTER...");
getch();
break;
case 15:
system("cls");
l = length();
printf("\n\n\tLungimea listei este: %d", l);
puts("\nPentru a continua tastati ENTER...");
getch();
break;
case 16:
system("cls");
12
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
int divide_p;
puts("Introduce-ti pozitia de unde sa se divida lista");
scanf("%d", & divide_p);
dividel( & head1, & head2, divide_p);
puts("Lista a fost divizata .Sublistele sunt :");
puts("\n\n*********Sublista 1**********");
head = head1;
show();
puts("\n\n*********Sublista 2***********");
head = head2;
show();
getch();
head = NULL;
break;
case 17:
system("cls");
joinl( & head1, & head2);
show();
puts("\nPentru a continua tastati ENTER...");
getch();
break;
case 18:
system("cls");
freemem();
puts("\n\tMemoria a fost eliberata cu succes");
puts("\nPentru a continua tastati ENTER...");
getch();
break;
default:
puts("\n Asa optiune nu exista");
getch();
break;
}
}

Rezultatele primite:

Meniul principal

13
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
Crearea listei înlănțuite

Introducerea informației despre marfă

Afișsarea datelor

14
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
Căutarea elementului in listă

Interschimbarea a două elemente

Sortarea elementelor după nume

15
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
Modificarea elementului

Stergerea elementului

Salvarea în fișier

Citirea din fișier

16
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
Adăugarea unui nou element de la început

Adăugarea unui nou element la sfârșit

Introducerea unui element după altul

Introducerea unui element înaintea altuia

17
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
Lungimea listei sau numărul de elemente

Afișarea listei modificate:

Divizarea în 2 subliste

18
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
Unirea a 2 subliste

Eliberarea memoriei

Concluzie: În urma efectuării acestei lucrări practice am căpătat deprinderi


în programarea și implementarea a tipului abstract de date “Lista unidirecțională”
19
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.
în limbajul de programare C++. A fost elaborat un program care vă permite să
editați toate datele din baza de date: să adăugați marfă nouă, să le editați, să le
adăugați, să le ștergeți, să le sortați și în final aveți posibilitatea să salvați toate
informațiile într-un fișier și să le citiți dintr-un fișier. Am folosit lista legată și am
putut observa câteva avantaje ale acestora, cum ar fi:
 Nu este necesar să cunoașteți în avans numărul de elemente care trebuie
stocate în listă și, prin urmare, nu trebuie alocat.
 Într-o listă legată, inserările și ștergerile pot fi manipulate eficient fără a fixa
dimensiunea memoriei în avans.
 Un avantaj important al listelor conectate prin intermediul rețelelor este
faptul că lista conectată utilizează exact aceeași memorie de care are nevoie
și poate fi extinsă pentru a umple toate locațiile de memorie disponibile dacă
este necesar.
De asemenea, am observat unele dezavantaje ale acestora, ca:
 Traversarea este secvențială.
 Creșterea cheltuielilor pentru stocarea indicatorilor pentru conectarea
elementelor de date.

20
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.

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