Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrarea de laborator nr. 2-3
la Structuri de date și algoritmi
A efectuat:
st. gr. AI-161 V.Platon
A verificat:
dr., conf.univ. M. Kulev
Chişinău -2017
Lucrarea de laborator nr.2-3
Tema: Implementarea tipului de date abstract “Lista simplu înlanţuită” în C.
Varianta: 4) Cinematograf
Mersul lucrării:
O listă simplu înlănţuită este o structură de date ce utilizează alocarea dinamică a memoriei. Un
element al listei se numeşte nod. Fiecare nod al unei liste conţine un câmp care are rolul de a
indica adresa următorului element din listă.
Exemplu:
typedef struct student
{
char nume[20];
float grupa;
struct student *urm; /*campul de inlantuire*/
}nod;
1
http://www.aut.upt.ro/~rraul/PC/2009-2010/PC_lab11.pdf
Analiza datelor si functiilor:
Acest program este alcatuin din 3 fisiere:
1. lista.h - conține:
specificația structurei elementului listei simplu înlanţuite (conform variantei din
lucrarea de laborator nr.1)
prototipurile funcţiilor care asigură operaţiunile de prelucrare a listei simplu
înlanţuite.
2. lista.c - conţine codurile (implementările) tuturor funcţiilor declarate în fişierul antet.
3. main.c - reprezintă programul cu funcţia main ( ) pentru prelucrarea listei simplu înlanţuite cu
afişarea meniului de opţiuni pe ecran.
3) Functia: show - afişarea informaţiei despre elementele listei pe ecran (precum și afișarea
adreselor elementului current și următor
Parametrii functiei:
-
Valoare returnabila:
-
Valoare returnabila:
1 – daca functia sa executat fara erori,
0 – daca au fost errori
18) Functia: load - citirea informației despre elementele listei din fişier.
Parametrii functiei:
filen – variabila de tip char*, denumirea fisierului.
Valoare returnabila:
1 – daca functia sa executat fara erori,
0 – daca au fost errori.
2) Fisierul lista.c
#include "lista.h" printf("\n");
#include <stdio.h> puts("Informations about cinema's");
#include <stdlib.h> c=head;
#include <string.h> printf("\thead=%p\n",c);
//printf("\thead=%p\n",&c);
int create(int n) while(c)
{ {
cinema *c, *p; printf("\n\tCinematograf number
int i; %d\n",i+1);
printf("Name: %s\n",c->name);
for(i=0;i<n;i++) printf("Adress: %s\n",c->adress);
{ printf("Telephone:%d\n",c->num_tel);
c=(cinema*)malloc(sizeof(*c)); printf("Seats: %d\n",c->num_seats);
if(!c) {return i+1;} printf("Director: %s\n", c->boss);
if(i==0) {head=c;} printf("Current adress: %p\n",c);
else {p->next=c;} printf("Next adress: %p\n",c->next);
p=c;
} c=c->next; i++;
c->next=head; if(c==head) break;
return 0; }
} }
3)fisier main.c
#include <stdio.h> puts("13. Insert new element after ...");
#include <stdlib.h> puts("14. Insert new element
#include <windows.h> before ...");
puts("15. Delete one element");
puts("16. Split one list (1 in 2)");
#include "lista.c" puts("17. Unite two list (2 in 1)");
puts("18. Save in file");
int main() puts("19. Load file");
{
int nm, n,ret,flag; puts("0. Exit");
char str[50]; printf("\n\tEnter the menu option: ");
cinema *c, *c2; scanf("%d",&nm);
cinema c3; switch(nm)
while(1) {
{ case 0 : printf("Do you want to exit?
system("cls"); (1/0): "); scanf("%d",&flag);
puts("\tMenu"); if(flag) return 0;
puts("1. Create the list of cinema's"); case 1 :
puts("2. Introduce the information printf("Enter the number of
about cinema's"); elements: ");
puts("3. Show the list"); scanf("%d", &n);
puts("4. Search cinema by name"); ret=create(n);
puts("5. Modify cinema information"); if(ret==0) {puts("Memory was
puts("6. Swap 2 elements"); allocated;\n");}
puts("7. Get size of list"); else {printf("Unknown error on
puts("8. Sort list by name"); cinema %d",ret);}
puts("9. Get last elemenet"); getch();
puts("10. Free allocated memory"); break;
printf("\tLaborator 3\n");
puts("11. Append new element"); case 2 : read(); break;
puts("12. Prepend new element"); case 3 : show(); getch(); break;
case 4 : printf("\n[Search] Enter the } else { puts("Cannot find first
name of cinema to find: "); cinema"); getch(); break;}
fflush(stdin); puts("Swap succesfully");
gets(str); getch();
c = search_by_name(str); break;
if(c!=NULL) {
printf("Do you want to see case 7: printf("Size of list is:
cinema? (1/0): "); %d",lenght()); getch(); break;
scanf("%d",&flag);
if(flag){ case 8: puts("List was sorted by
printf("Name: %s\n",c->name); name"); sort_by_name(); getch(); break;
printf("Adress: %s\n",c->adress);
printf("Telephone:%d\n",c- case 9: printf("[Last] Do you want
>num_tel); to see last element? (1/0): ");
printf("Seats: %d\n",c- scanf("%d",&flag);
>num_seats); if(flag){
printf("Director: %s\n", c->boss); c=last();
printf("Current adress: %p\n",c); printf("Name: %s\n",c->name);
printf("Next adress: %p\n",c- printf("Adress: %s\n",c->adress);
>next); printf("Telephone:%d\n",c-
} >num_tel);
} printf("Seats: %d\n",c-
else puts("Cinema is not founded."); >num_seats);
c=NULL; printf("Director: %s\n", c->boss);
getch(); printf("Current adress: %p\n",c);
break; printf("Next adress: %p\n",c-
>next);
case 5: printf("\n[Modify] Enter the }
name of cinema to modify: "); getch();
fflush(stdin); break;
gets(str);
c = search_by_name(str); case 10: freemem(); puts("Memory
if(c!=NULL) { was cleared!"); getch(); break;
modify(c);
} else puts("Cinema is not case 11:
founded."); puts("Enter the information about
getch(); new cinema:");
break;
printf("Name: "); fflush(stdin);
case 6: printf("\n[Swap] Enter the gets(c3.name);
first name of cinema to swap: "); printf("Adress: "); fflush(stdin);
fflush(stdin); gets(c3.adress);
gets(str); printf("Telephone number: ");
c = search_by_name(str); scanf("%d",&c3.num_tel);
if(c!=NULL){printf("\n[Swap] Enter printf("Seats count: ");
the second name of cinema to swap: "); scanf("%d",&c3.num_seats);
fflush(stdin); printf("Director: "); fflush(stdin);
gets(str); gets(c3.boss);
c2 = search_by_name(str); append(c3);
if(c2!=NULL) { swop(c,c2); } else
{ puts("Cannot find second cinema"); getch();
getch(); break; } break;
puts("Enter the information about
case 12: new cinema:");
puts("Enter the information about
new cinema:"); printf("Name: "); fflush(stdin);
gets(c3.name);
printf("Name: "); fflush(stdin); printf("Adress: "); fflush(stdin);
gets(c3.name); gets(c3.adress);
printf("Adress: "); fflush(stdin); printf("Telephone number: ");
gets(c3.adress); scanf("%d",&c3.num_tel);
printf("Telephone number: "); printf("Seats count: ");
scanf("%d",&c3.num_tel); scanf("%d",&c3.num_seats);
printf("Seats count: "); printf("Director: "); fflush(stdin);
scanf("%d",&c3.num_seats); gets(c3.boss);
printf("Director: "); fflush(stdin); insertbefore(c3,c);
gets(c3.boss); }else puts("Cinema isnot found!");
if(prepend(c3)) {puts("True");} else getch(); break;
puts("False"); puts("Inserted!!");
getch(); getch();
break; break;
Screenshots:
1Menu
2Introducerea
3Afisarea
4Cautarea
5Modificarea
6Interschimbarea
7Lungimea
Avantaje
1) Adaugare si eleminarea elementelor efecienta (in timp constant)
2) Dimensiunele listei sunt limitate numai de memoria calculatorului
3) Adaugare si eleminerea se efectuieaza in mod dynamic
Dezavantaje:
1) Este complicata accesarea la element listei, mai ales determinarea indexului elementului
in lista.
2) Pentru pastrarea cimpurilor pointelor (exemplu: struct element *next) se utilezeaza
memoria suplimentara spre deosebere de tablou
Concluzie
Efectuind laboratorul acest am obtinut deprinderi teoretice si practice de crearea, intitializarea,
modificarea si prelucrearea tipului abstact de date “lista simplu inlantuita”. Scrierea programului
mi-a dat expetienta si abilitati pe care voi folosi in continuare. Am determinat avantaje si
dizavantajele listelor inlantuite. Cel mai principal este fapt ca a fost obtinut scopul lucrarii de
laborator: “Obţinerea deprinderilor practice de implementare și de utilizare a tipului de date
abstract (TDA) “Lista simplu înlanţuită” în limbajul C”.
Bibliografie:
1. http://www.aut.upt.ro/~rraul/PC/2009-2010/PC_lab11.pdf [Accesat la 14.05.2017]
2. Code::Blocks IDE http://www.codeblocks.org/ [Accesat la 14.05.2017]
3. Compilator MinGW http://www.mingw.org/ [Accesat la 14.05.2017]
4. Conspect de prelegeri grupa AI-161. Lector M. Kulev