RAPORT
Structuri de date și algoritmi
Lucrare de laborator nr. 8
Varianta: 5
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.
Programul elaborat:
#ifndef HEADER_FILE
#define HEADER_FILE
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#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;
}
}
#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
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ă
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
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
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
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
20
Structuri de date și algoritmi. Lucrare de laborator Nr.8
Tema: Implementarea tipului abstract de date „Listă unidirecțională” în limbajul C.