Sunteți pe pagina 1din 14

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(SDA)

A efectuat:
st. gr. CR-213 Gusanu Ovidiu

A verificat:
asist. univ. C.Tincu

Chişinău -2021
MO
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 înlanţuită” în limbajul C cu asigurarea operațiilor de
prelucrare ale listei.

Condiţia problemei (sarcini de lucru)

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 listei
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.
MO

Mersul lucrării:

Noţiuni din teorie şi metodele folosite:


Descrierea variabilelor:

Include’cinema.h’/’cinema.cpp’ – includerea bibliotecilor personalizate

Typedefstruct Cinema - structura cinema

Funcția strtok caută lexeme în șir. O secvență de apeluri la această funcție descompune șirul de
caractere în token-uri, care sunt secvențe de caractere separate prin caractere delimitate.

Funcția bibliotecii C char *gets(char *str) citește o linie din stdin și o stochează în șirul indicat de
str. Se oprește atunci când este citit fie caracterul de nouă linie, fie când se ajunge la sfârșitul
fișierului, oricare dintre acestea survine primul.

date de intrare:
elem *S,*B,*K;
elem*c, *p;
char* v[10];
int n,nr,f;
char* t="s";
elem*c;
int i;

date de lucru și iesire (inclusiv functiile)


char proprietarul[100];
char tipul[100];
char adresa[100];
int suprafata;
int costul;
int createList(int n);
void readInfo();
void showInfo();
elem*searchElement(char* temp);
void modifyInfo(elem* c);
void lastElement();
int sizeList();
void swap(elem* e1, elem *e2);
void sortList();
void freeMemory();
int AddNewElem();
MO

Codul (textul) programului în limbajul C:

//cinema.h
typedef struct{
char name[100];
char adresa[100];
char phone[100];
int pret;
int loc;
}Cinema;

typedef struct{
char name[100];
char adresa[100];
char phone[100];
int pret;
int loc;
}Cinema2;

int Menu();
void Alocare();
void Citire();
void Afisare();
void Cautare();
void Modificare();
void Swap();
void Sort();
int Sort_Case(int x,int d,Cinema B,Cinema NextB);
void Adaugare_Sfarsit();
void Adaugare_Inceput();
void Insert_Dupa();
void Insert_Inainte();
void Stergere();
void Save_File();
void Read_File();
int isEmpty();
void Free_Memory();
void LastAdress();
void Listlenght();
void Adresa();
MO
//void Split ()

cinema.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "cinema.h"
int n,n2,afisare=0;
Cinema* cinema=NULL;
Cinema2* cinema2=NULL;
int Menu()
{
int option;
system("pause");
system("cls");
printf("\t\t\t\t\t\tMeniu:\n");
printf("\n 1.Alocarea dinamica a memoriei pentru tablou. ");
printf("\n 2.Introducerea informatiei despre elementele tabloului de la tastatura. ");
printf("\n 3.Afisarea informatiei despre elementele tabloului la ecran. ");
printf("\n 4.Cautarea elementului in tablou.");
printf("\n 5.Modificarea campurilor a unui element din tablou");
printf("\n 6.Determinarea adresei ultimului element din lista");
printf("\n 7.Determinarea lungimii listei (numarul de elemente). ");
printf("\n 8.Interschimbarea a doua elemente indicate în lista.");
printf("\n 9.Sortarea listei");
printf("\n 10.Adaugarea unui element nou la sfarsitul listei");
printf("\n 11.Adaugarea unui element nou la inceputul listei");
printf("\n 12.Inserarea unui element nou dupa elementul indicat al listei ");
printf("\n 13.Inserarea unui element nou inaintea elementului indicat în lista.");\
printf("\n 14.Stergerea elementului indicat in lista");
printf("\n 15.Divizarea listei in doua liste ----nefinisat");
printf("\n 16.Unirea a doua liste. ----- nefinisat");
printf("\n 17.Salvarea informatiei despre elementele listei în fisier");
printf("\n 18.Citirea informatiei despre elementele listei din fisier.");
printf("\n 19.Eliberarea memoriei alocate pentru lista. ");
printf("\n 0.Iesire din program.");
printf("\nAlegeti o optiune : ");scanf("%d",&option);
return option;
}
//Alocarea memeorie
void Alocare()
{
printf("\nIndicati nr. de cinemauri : ");scanf("%d",&n);
cinema=(Cinema*)calloc(n,sizeof(Cinema));
if(cinema==NULL)
{
printf("\nNu s-a reusit alocarea memoriei");
exit(-1);
}
}
//Introducerea elementelor
void Citire()
{
if(afisare)
MO
{ printf("\nIntroducerea informatiei de la tastatura a fost realizata deja!\n");return;}
if(n){
for(int i=0;i<n;i++)
{
printf("\nIntrodu datele pentru Cinemaul nr.%d :\n",i+1);
printf("Denumirea : ");fflush(stdin);gets(cinema[i].name);
printf("Adresa : ");fflush(stdin);gets(cinema[i].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[i].phone);
printf("Pret bilet: ");scanf("%d",&cinema[i].pret);
printf("Numarul de locuri: ");scanf("%d",&cinema[i].loc);
}
afisare = 1;}
else
printf("\nMemoria nu a fost alocata!\n");
}
//Afisarea elementelor
void Afisare(){
if(afisare){
printf("\n|=========================================== Cinema
===========================================|\n");
printf("|Nr.| Denumirea| Adresa| Telefon| Pret bilet| Nr. de locuri|\n");
for(int i=0;i<n;i++)
printf("|%3d|%20s|%20s|%20s|%20d|%20d|\
n",i+1,cinema[i].name,cinema[i].adresa,cinema[i].phone,cinema[i].pret,cinema[i].loc);
}
else
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem ce afisa!\n");
}
//Cautarea elementului
void Cautare()
{
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem ce cauta!\n");return;}
int gasit=0;
char cautat[100];
printf("\nIndica denumirea cinemaului pe care il cautati : ");fflush(stdin);gets(cautat);
printf("\n|=========================================== Cinema
===========================================|\n");
printf("|Nr.| Denumirea| Adresa| Telefon| Pret bilet| Nr. de locuri|\n");
for(int i=0;i<n;i++)
{
if(strcmp(cinema[i].name,cautat)==0){
printf("|%3d|%20s|%20s|%20s|%20d|%20d|\
n",i+1,cinema[i].name,cinema[i].adresa,cinema[i].phone,cinema[i].pret,cinema[i].loc);
gasit=1;
}}
if(!gasit)
printf("Nu s-a gasit aceast cinema.\n");
}
//Modificarea
void Modificare()
{
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem ce modifica!\n");return;}
Afisare();
int m;
MO
do{
printf("\nIndica nr. cinemaului care trebuie modificat : ");scanf("%d",&m);
if(m<1||m>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(m<1||m>n);
m--;
char ans='y';
while(ans!='n'){
system("cls");
int option;
printf("\n|=========================================== Cinema
===========================================|\n");
printf("|Nr.| Denumirea| Adresa| Telefon| Pret bilet| Nr. de locuri|\n");
printf("|%3d|%20s|%20s|%20s|%20d|%20d|\
n",m+1,cinema[m].name,cinema[m].adresa,cinema[m].phone,cinema[m].pret,cinema[m].loc);
do{
printf("Ce doriti sa modificam?\n");
printf("1.Denumirea\n");
printf("2.Adresa\n");
printf("3.Telefonul\n");
printf("4.Pret bilet\n");
printf("5.Nr. de locuri\n");
scanf("%d",&option);
if(option<1||option>5)
printf("Alege o optiune de lista!\n");
} while(option<1||option>5);
switch (option)
{
case 1 : printf("Denumirea : ");fflush(stdin);gets(cinema[m].name);break;
case 2 : printf("Adresa : ");fflush(stdin);gets(cinema[m].adresa);break;
case 3 : printf("Telefonul : ");fflush(stdin);gets(cinema[m].phone);break;
case 4 : printf("Pret bilet : ");scanf("%d",&cinema[m].pret);break;
case 5 : printf("Numarul de locuri : ");scanf("%d",&cinema[m].loc);break;
}
printf("Continuam modificarile?(y/n) ");
ans=getch();
}
}
//Interschimbul elementelor
void Swap()
{
if(!afisare){
printf("\nElementele nu au fost initializate!\n");return;}
int Element,nextElement;
Afisare();
printf("\nIndica nr. cinemaurilor ce urmeaza a fi interschimbate : \n");
do{
printf("Cinema 1:");scanf("%d",&Element);
if(Element<1||Element>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(Element<1||Element>n);
do{
printf("Cinema 2: ");scanf("%d",&nextElement);
if(nextElement<1||nextElement>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(nextElement<1||nextElement>n);
MO

Cinema temp = cinema[Element-1];


cinema[Element-1]=cinema[nextElement-1];
cinema[nextElement-1]=temp;
}
//Procesul de sortare
void Sort()
{
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem ce sorta!\n");return;}
int x;
do{
printf("1.Denumirea\n");
printf("2.Adresa\n");
printf("3.Telefon\n");
printf("4.Pret bilet\n");
printf("5.Nr. de locuri\n");
printf("Alege compartimentul care trebuie sortat: ");
scanf("%d",&x);
if(x<1||x>5)
printf("Alege o optiune de lista!\n");
} while(x<1||x>5);

int option,d;

printf("1.Sortarea Crescator/A-Z\n");
printf("2.Sortarea Descrescator/Z-A.\n");
scanf("%d",&option);
do{
switch (option)
{
case 1 : d=1; break;
case 2 : d=-1; break;
default : printf("Alege o optiune din lista\n");break;
}}while(option!=1 && option!=2);

int sort;
do
{
sort=0;
for(int i=0;i<n-1;i++)
{
if(Sort_Case(x,d,cinema[i],cinema[i+1])){//Compartimentul,directia,elementul curent,elementul
succesor
Cinema temp=cinema[i];
cinema[i]=cinema[i+1];
cinema[i+1]=temp;
sort=1;}
}
} while (sort);

}
int Sort_Case(int x,int d,Cinema B,Cinema NextB)
{
switch (x)
{
MO
case 1 : return stricmp(B.name,NextB.name)==d; break;
case 2 : return stricmp(B.adresa,NextB.adresa)==d; break;
case 3 : return stricmp(B.phone,NextB.phone)==d; break;
case 4 : return d==1 ? B.pret>NextB.pret : B.pret<NextB.pret ;break;
case 5 : return d==1 ? B.loc>NextB.loc : B.loc<NextB.loc ;break;
}
}
void Adaugare_Sfarsit()
{
n++;
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
printf("\nIntrodu datele pentru Cinemaul nr. %d :\n",n);
printf("Denumirea : ");fflush(stdin);gets(cinema[n-1].name);
printf("Adresa : ");fflush(stdin);gets(cinema[n-1].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[n-1].phone);
printf("Pret bilet : ");scanf("%d",&cinema[n-1].pret);
printf("Numarul de locuri : ");scanf("%d",&cinema[n-1].loc);
afisare=1;
}
void Adaugare_Inceput()
{
n++;
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
for(int i=n-1;i>=1;i--)
cinema[i]=cinema[i-1];
printf("\nIntrodu datele pentru Cinemaul nr. %d :\n",1);
printf("Denumirea : ");fflush(stdin);gets(cinema[0].name);
printf("Adresa : ");fflush(stdin);gets(cinema[0].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[0].phone);
printf("Pret bilet : ");scanf("%d",&cinema[0].pret);
printf("Numarul de locuri : ");scanf("%d",&cinema[0].loc);
afisare=1;
}
//Inserarea elementului nou dupa un element
void Insert_Dupa()
{
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem unde insera!\n");return;}

Afisare();
n++;
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
int Element;
printf("\nIndica Nr. cinemauri dupa care sa inseram un element nou : ");scanf("%d",&Element);
for(int i=n-1;i>=Element;i--)
cinema[i]=cinema[i-1];
printf("\nIntrodu datele pentru Cinemaul nr. %d :\n",Element+1);
printf("Denumirea : ");fflush(stdin);gets(cinema[Element].name);
printf("Adresa : ");fflush(stdin);gets(cinema[Element].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[Element].phone);
printf("Numarul de facultati : ");scanf("%d",&cinema[Element].pret);
printf("Numarul de Studenti : ");scanf("%d",&cinema[Element].loc);
}
//Inserarea elementului nou inainte de un element
void Insert_Inainte()
{
MO
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem unde insera!\n");return;}

Afisare();
n++;
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
int Element;
printf("\nIndica Nr. de cinemauri dupa care sa inseram un element nou : ");scanf("%d",&Element);
for(int i=n-1;i>=Element-1;i--)
cinema[i]=cinema[i-1];
printf("\nIntrodu datele pentru cinemaul nr. %d :\n",Element);
printf("Denumirea : ");fflush(stdin);gets(cinema[Element-1].name);
printf("Adresa : ");fflush(stdin);gets(cinema[Element-1].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[Element-1].phone);
printf("Numarul de facultati : ");scanf("%d",&cinema[Element-1].pret);
printf("Numarul de Studenti : ");scanf("%d",&cinema[Element-1].loc);
}
//Eliminarea unui element
void Stergere()
{
Afisare();
int nr;
printf("\nIndica nr. cinemaului care trebuie sters: ");scanf("%d",&nr);nr--;
for(int i=nr;i<n-1;i++)
cinema[i]=cinema[i+1];
n--;
if(n==0)
Free_Memory;
else
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
}
//Salvarea informatiei in fisier
void Save_File()
{
FILE *f;
f=fopen("Cinema.txt","w");
fwrite(&n,sizeof(int),1,f);
for(int i=0;i<n;i++)
fwrite(&cinema[i],sizeof(Cinema),1,f);
fclose(f);
}
//Citirea informatiei din fisier
void Read_File()
{
if(isEmpty()){
printf("\nFisierul este gol. Nu avem ce citi!\n");
return;
}
FILE *f;
int nr;
Cinema cinemaFile;
f=fopen("Cinema.txt","r");
fread(&nr,sizeof(int),1,f);
printf("\n|=========================================== Cinema
===========================================|\n");
printf("|Nr.| Denumirea| Adresa| Telefon| Pret bilet| Nr. de locuri|\n");
MO
for(int i=1;i<=nr;i++){
fread(&cinemaFile,sizeof(Cinema),1,f);
printf("|%3d|%20s|%20s|%20s|%20d|%20d|\
n",i,cinemaFile.name,cinemaFile.adresa,cinemaFile.phone,cinemaFile.pret,cinemaFile.loc);}
fclose(f);
}
//Verificarea fisierului
int isEmpty(){
int end,begin;
FILE *f;
f=fopen("Cinema.txt","r");
fseek(f,0,SEEK_END);
end=ftell(f);
fseek(f,0,SEEK_SET);
begin=ftell(f);
fclose(f);

if (end==begin)
return 1;
else
return 0;
}
//Eliberarea memoriei
void Free_Memory()
{
if(cinema!=NULL)
free(cinema);
n=0;
afisare=0;
printf("\nMemoria a fost eliberata\n");
}

void Listlenght()
{

printf("\n\tLungimea listei este:%d\n",n);


}

void Adresa()
{
printf("\n Adresa ultimei structuri este:%p\n",*cinema);
// printf("%p\n", void *&Cinema);

}
/*
void Split ()
{
n2=n/2;
n3=n-n2;

cinema2=(Cinema2*)calloc(n2,sizeof(Cinema2));
if(cinema==NULL)
{
printf("\nNu s-a reusit alocarea memoriei");
MO
exit(-1);
}

for (i<n;i<n3;i--)
{
Cinema2[i]=Cinema[i];
Cinema[i]=NULL;
}

*/
/*
{
if(!afisare){
printf("\nElementele nu au fost initializate!\n");return;}
int Element,nextElement;
Afisare();
printf("\nIndica nr. cinemaurilor ce urmeaza a fi interschimbate : \n");
do{
printf("Cinema 1:");scanf("%d",&Element);
if(Element<1||Element>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(Element<1||Element>n);
do{
printf("Cinema 2: ");scanf("%d",&nextElement);
if(nextElement<1||nextElement>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(nextElement<1||nextElement>n);

Cinema temp = cinema[Element-1];


cinema[Element-1]=cinema[nextElement-1];
cinema[nextElement-1]=temp;
}
*/

Lab3.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "cinema.cpp"
int main()
{
int x;
do{
x=Menu();
switch (x)
{
case 1 : Alocare();break;
case 2 : Citire();break;
case 3 : Afisare();break;
case 4 : Cautare();break;
MO
case 5 : Modificare();break;
case 6 : Adresa();break; //modifica || Determinarea adresei ultimului element din listă.
case 7 : Listlenght();break;
case 8 : Swap();break;
case 9 : Sort();break;
case 10: Adaugare_Sfarsit();break;
case 11: Adaugare_Inceput();break;
case 12: Insert_Dupa();break;
case 13: Insert_Inainte();break;
case 14: Stergere();break;
// case 15: Split ();break;
case 16: //unirea a doua liste
case 17: Save_File();break;
case 18: Read_File();break;
case 19 : Free_Memory();break;
case 0 : printf("Executia programului s-a incheiat!\n");free(cinema);break;
default:printf("\nSelecteaza o optiune din menu\n");break;
}
}while(x);
return 0;
}

Rezultatele testării și funcţionării programului (screenshot-uri):


MO

Analiza rezultatelor și concluzii:

Concluzii nu sunt, multumesc pentru atentie.

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