Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
RAPORT
Lucrarea de laborator nr.2-3
la disciplina Structuri de date i Algoritmi
A efectuat:
st. gr. SI-141
E. Cucu
A verificat:
dr., conf.univ., catedra IA
M. Kulev
Chiinu 2015
Mersul lucrrii:
Noiuni principale din teorie i metode folosite:
O list simplu nlnuit este o colecie de noduri aezate ntr-o ordine liniar (dar
NU n locaii succesive din memorie - aa cum se ntmpl la vectori). Fiecare nod
are cel puin un pointer ctre urmtorul nod, pe care l vom numi next. Primul nod
se numete head,. Lista se numete simplu nlnuit deoarece fiecare nod
memoreaz un singur pointer ctre urmtorul nod. Spre deosebire de vectori, lista
nu are o mrime fix. Poate fi redimensionat prin adugarea sau tergerea
nodurilor. Un nod este ca un obiect (item) care conine att informaia pe care vrei
s-o stocai ct i legtura ctre urmtorul obiect.
Datorit faptului ca elementele listei sunt stocate n diferite pri ale memoriei
calculatorului sunt uurate anumite operaii cu lista, de exemplu inserarea sau
tergerea unui element al listei nu necesit micarea celorlalte elemente pentru a
face loc sau pentru a strnge lista, aa cum se ntmpl la vectori de exemplu.
Exemplu de baz de date n form de list simplu nlnuit:
typedef struct masina
{
char marca[40];
char model[40];
char origine[40];
int anu;
float pret;
struct masina *next;
}masina;
masina* head=NULL;
Fisierul masina.h
void read();
Funcita de introducere a elementelor in lista simplu inlantuita
necirculara.
masina* search(char* s);
Functia de cautare in lista simplu inlantuita necirculara dupa
un cimp al structurii.Primeste ca parametru adresa la string-ul
introdus de utilizator si returneaza elementele gasite.
void show_search();
Funcita de afisare a elementelor cautate cu ajutorul functiei
search(char*);
void show(masina* head);
Funtia de afisarea tuturor elemente din lista simplu inlantuita
necirculara avind ca paramentru capul listei.
void swap(masina* a,masina* b);
Functia de interschimbare a a doua elemente intre ele in lista
simplu inlantuita necirculara avind 2 parametri fiind elemente a
listei.
void sort();
Functia de sortare dupa pret(cimp al structurii).
int length();
Functia care determina lungimea listei simplu inlantuite
necirculare returneaza o valoare de tip int care reprezinta
lungimea listei.
masina* end();
Funtia care determina care este ultimul elemente din lista
simplu inlantuita necirculara returnind adresa acestui element.
void add_after_id(int id);
Functia de adaugare a elementelor dupa indicele indicat de
utilizator in lista simplu inlantuita necirculara,are ca
paramentru indicele tastat de utilizator.
void add_before_id(int id);
Functia de adaugare a elementelor inainte de indicele indicat de
utilizator in lista simplu inlantuita necirculara,are ca
paramentru indicele tastat de utilizator.
void add_to_end();
Functia de adaugare a elementelor la sfirsit de lista simplu
inlantuita necirculara.
void delete_id(int id);
Funcita de stergere a unui element din lista simplu inlantuita
necirculara.
void devide(int id,masina** head2);
Functia
care
devizeaza
lista
in
doua
liste,are
2
parametri,primul ste o variabila de tip int care reprezinta
indicile deunde lista v-a fi devizata,ia al doilea este adresa
elementului care urmeaza sa fie capul listei 2*/
void join(masina** head2);
Functia de
unire a listei in doua,are ca parametru adresa
elementului care este capul listei 2.
void modif(int id);
Funcita de modificare a unui element din lista simplu inlantuita
necirculara,avind ca parametru o variabila de tip int care este
indicile elementului care urmeaza a fi modificat.
void save(char* s);
Funcitia de salvare a informatiei din lista simplu inlantuita
necirculara in fisier,are ca paramentru adresa la string-ul
introdus de utilizator care reprezinta numele fisierului.
void load(char* s);
Funcitia de incarcare a informatiei din fisier in lista simplu
inltantuita necirculare,are ca paramentru adresa la string-ul
introdus de utilizator care reprezinta numele fisierului.
void freem();
Funcita
de
eliberearea
memoriei,distrugerea
listei
simplu
inlantuite necirculare.
Fisierul functii.cpp
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<string.h>
"masina.h"
int create(int n)
{
int i;
masina *c,*p;
for(i=0;i<n;i++)
{
c=(masina*)malloc(sizeof(masina));
if(c == NULL) return 0;
if(i == 0)
{
head=c;
p=c;
}
else
{
p->next=c;
p=c;
}
}
p->next=NULL;
return 1;
}
void read()
{
masina *c=head;
int i=0;
while(c)
{
printf("\n****************************************\n\n");
printf("Introdu datele masinii %d\n",i+1);
printf("Marca: ");
scanf("%s",&c->marca);
printf("Model: ");
scanf("%s",&c->model);
printf("Originea: ");
scanf("%s",&c->origine);
printf("Anul de productie: ");
scanf("%d",&c->anu);
printf("Pretul($): ");
scanf("%f",&c->pret);
c=c->next;
i++;
}
}
void show(masina* head)
{
masina* c=head;
int i=0;
while(c)
{
printf("****************************************\n\n");
printf("Datele masinii:
%d\n",i+1);
printf("Marca:
%s\n",c->marca);
printf("Model:
%s\n",c->model);
printf("Originea:
%s\n",c->origine);
printf("Anul de productie:
%d\n",c->anu);
printf("Pretul($):
%.2f\n\n",c->pret);
printf("Adresa curenta:
%p\n",c);
printf("Adresa elementului urmator:
%p\n",c->next);
c=c->next;
i++;
}
}
void show_search(char* s)
{
masina *c=head;
int i=0,k=0;
while(c)
{
if((strcmp(s,c->marca)==0) || (strcmp(s,c->model)==0 ) || (strcmp(s,c>origine)==0))
{
printf("****************************************\n\n");
printf("Datele masinii:
%d\n",i+1);
printf("Marca:
%s\n",c->marca);
printf("Model:
%s\n",c->model);
printf("Originea:
%s\n",c->origine);
printf("Anul de productie:
%d\n",c->anu);
printf("Pretul($):
%.2f\n\n",c->pret);
k++;
}
c=c->next;
i++;
}
if(k==0)
printf("Elementul nu a fost gasit!\n");
}
masina* search(char* s)
{
masina* c=head;
int k=0;
while(c)
{
if(strcmp(s,c->marca)==0
||
strcmp(s,c->model)==0
>origine)==0)
{
return c;
k++;
}
c=c->next;
}
if(k==0)
{
printf("Nu exista asa masini!\n");
}
return NULL;
}
void swap(masina *a,masina *b)
{
masina t,*na,*nb;
na=a->next;
nb=b->next;
t=*a;
*a=*b;
*b=t;
a->next=na;
b->next=nb;
}
int lenght()
{
masina *c=head;
int i=0;
while(c)
{
i++;
c=c->next;
}
return i;
||
strcmp(s,c-
}
void sort()
{
masina *a,*b;
int i,k,l;
l=lenght();
for(i=0;i<l-1;i++)
{
a=head;
b=a->next;
for(k=0;k<l-1-i;k++)
{
if(a->pret < b->pret)
{
swap(a,b);
}
a=a->next;
b=b->next;
}
}
}
masina* end()
{
masina* c;
c=head;
while(c->next)
{
c=c->next;
}
return c;
}
void modif(int id)
{
masina* c=head;
int i=0;
while(c)
{
if(i+1 == id)
{
printf("Datele masinii %d pentru modificare:\n",i+1);
printf("Marca: ");
scanf("%s",&c->marca);
printf("Model: ");
scanf("%s",&c->model);
printf("Originea: ");
scanf("%s",&c->origine);
printf("Anul de productie: ");
scanf("%d",&c->anu);
printf("Pretul($): ");
scanf("%f",&c->pret);
}
c=c->next;
i++;
}
}
void add_after_id(int id)
{
masina *c=head,*p;
int i=0;
while(c){
if(i == id-1){
p=c;
c=(masina*)malloc(sizeof(masina));
printf("\n****************************************\n\n");
printf("Introdu datele masinii %d\n",i+2);
printf("Marca: ");
scanf("%s",&c->marca);
printf("Model: ");
scanf("%s",&c->model);
printf("Originea: ");
scanf("%s",&c->origine);
printf("Anul de productie: ");
scanf("%d",&c->anu);
printf("Pretul($): ");
scanf("%f",&c->pret);
c->next=p->next;
p->next=c;
break;
}
i++;
c=c->next;
}
}
void add_before_id(int id){
masina *c=head,*p;
int i=0;
while(c){
if(i == id-1){
p=c;
c=(masina*)malloc(sizeof(masina));
printf("\n****************************************\n\n");
printf("Introdu datele masinii %d\n",i-2);
printf("Marca: ");
scanf("%s",&c->marca);
printf("Model: ");
scanf("%s",&c->model);
printf("Originea: ");
scanf("%s",&c->origine);
printf("Anul de productie: ");
scanf("%d",&c->anu);
printf("Pretul($): ");
scanf("%f",&c->pret);
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(){
masina *c=head,*p;
while(c){
if(c->next == NULL){
p=c;
c=(masina*)malloc(sizeof(masina));
printf("\n****************************************\n\n");
printf("Introdu datele masinii\n");
printf("Marca: ");
scanf("%s",&c->marca);
printf("Model: ");
scanf("%s",&c->model);
printf("Originea: ");
scanf("%s",&c->origine);
printf("Anul de productie: ");
scanf("%d",&c->anu);
printf("Pretul($): ");
scanf("%f",&c->pret);
p->next=c;
c->next=NULL;
break;
}
c=c->next;
}
}
void delete_id(int id){
masina *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,masina** head2){
masina *c=head;
int i=0;
while(c){
if(i == id-1){
*head2=c->next;
c->next=NULL;
break;
}
i++;
c=c->next;
}
}
void join(masina** head2){
masina *c=head;
while(c){
if(c->next == NULL){
c->next=*head2;
break;
}
c=c->next;
}
*head2=NULL;
}
void freem()
{
masina *c=head,*p;
while(c)
{
p=c;
c=c->next;
free(p);
if(c == NULL)
{
break;
}
}
head=NULL;
}
void save(char* fname)
{
masina*c=head;
FILE *txt=fopen(fname,"wt");
while(c)
{
fprintf(txt,"%s %s %s %d
>anu,c->pret,c,c->next);
if(c->next != NULL)
{
fprintf(txt, "\n");
}
c=c->next;
}
fclose(txt);
}
%.2f
%p
%p",c->marca,c->model,c->origine,c-
Fisierul main.cpp
#include "functii.cpp"
int main()
{
masina *a=NULL;/*element pentru sortare/interschimbare*/
masina *b=NULL;/*element pentru sortare/interschimbare*/
masina *head2=NULL;;/*element cap pentru divizare*/
char a1[100];/*string 1 pentru interschimbare*/
char b1[100];/*string 2 pentru interschimbare*/
char srch[100];/*string pentru cautare*/
char savef[100];/*string pentru salvare*/
char loadf[100];/*string pentru incarcare*/
int n;/*numarul de elemente in lista*/
int m;/*ciclu infinit meniu principal*/
int com1;/*indice pentru meniu pricipal*/
int mod;/*indice pentru modificare*/
int id_devide;/*indice pentru devizare*/
int id_before;/*indice pentru adaugare inaintea indicelui*/
int id_after;/*indice pentru adaugare dupa indice*/
int id_delete;/*indice pentru stergere a elemenentului*/
while(1)
{
while(m)
{
m=0;
system("cls");
printf("-----------------------Creare-----------------------\n");
printf("1.Crearea listei si introducerea datelor manual\n");
printf("2.Crearea
listei
si
introduucerea
datelor
din
fisier\n\n");
printf("---------------------Preaucrare---------------------\n");
printf("3.Afisarea listei\n");
printf("4.Sortarea listei dupa pret\n");
printf("5.Modificarea unui element\n");
printf("6.Interschimbarea elementelor\n");
printf("7.Cautarea unui element\n");
printf("8.Devizarea elementelor in doua liste\n");
printf("9.Unirea a doua liste cu elemente\n\n");
printf("-----------------Adaugare\\Stergere------------------\n");
printf("10.Adaugarea elementuui inaintea indicelui\n");
printf("11.Adaugarea elementului dupa indice\n");
printf("12.Adaugarea elementului la sfirsitul listei\n");
printf("13.Stergea unui element\n\n");
printf("--------------------Salvare\\Iesire------------------\n");
printf("14.Salvarea in fisier\n");
printf("15.Salvare si Iesire\n");
printf("----------------------------------------------------\n");
printf("\nDati comanda\n>");
scanf("%d",&com1);
switch(com1)
{
case 1:
system("cls");
if(head)
{
printf("Memoria este deja alocata\n");
system("pause");
m=1;
break;
}
system("cls");
printf("Dati numarul de elemente in lista\n>");
scanf("%d",&n);
create(n);
read();
if(head)
{
system("cls");
printf("Lista
a
fost
creata
cu
succes!\a\n");
system("pause");
m=1;
break;
}
case 2:
system("cls");
if(head)
{
printf("Memoria este deja alocata\n");
system("pause");
m=1;
break;
}
printf("Dati numele fisierului\n>");
fflush(stdin);
gets(loadf);
strcat(loadf,".txt");
load(loadf);
printf("\aIntroducerea a fost efectuata cu
succes!\n");
m=1;
system("pause");
break;
case 3:
system("cls");
if(!head)
{
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
show(head);
system("pause");
m=1;
break;
case 4:
system("cls");
if(!head)
{
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
sort();
printf("Lista a fost sortata cu succes!\a\n");
system("pause");
m=1;
break;
case 5:
system("cls");
if(!head)
{
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
show(head);
printf("\nDati
indicile
elementului
pentru
modificare\n>");
scanf("%d",&mod);
system("cls");
modif(mod);
printf("Modificara a avut loc cu succes!\a\n");
m=1;
system("pause");
break;
case 6:
system("cls");
if(!head)
{
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
show(head);
printf("Dati numele primului element
pentru
fflush(stdin);
gets(a1);
a=search(a1);
printf("Dati numele
pentru
interschimbare\n>");
primului
element
interschimbare\n>");
fflush(stdin);
gets(b1);
b=search(b1);
system("cls");
swap(a,b);
printf("Interschimbarea
avut
loc
cu
succes!\a\n");
m=1;
system("pause");
break;
case 7:
system("cls");
if(!head)
{
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
printf("Dati
denumirea\\modelul\\originea
pentru cautare\n>");
fflush(stdin);
gets(srch);
show_search(srch);
m=1;
system("pause");
break;
case 8:
system("cls");
if(!head)
{
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
show(head);
printf("\nIntrodu indicile de unde lista v-a fi
despartita\n");
scanf("%d",&id_devide);
if(lenght() > 1 && id_devide>0 && id_devide <
lenght()){
devide(id_devide,&head2);
}
printf("Devizarea
a
fost
efectuata
succes!\a\n");
show(head);
show(head2);
m=1;
system("pause");
break;
case 9:
system("cls");
if(!head){
printf("Lista nu exista!\a\n");
m=1;
cu
system("pause");
break;
}
if(head2){
join(&head2);
printf("Unirea a avut loc cu succes\n");
}
else {
printf("\aMai
intii
lista
trebuie
despartita!\n");
}
m=1;
system("pause");
break;
case 10:
system("cls");
if(!head){
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
show(head);
printf("\nIntrodu numarul de ordine:\n");
scanf("%d",&id_before);
if(id_before > 0 && id_before <= lenght() ){
system("cls");
add_before_id(id_before);
}
else {
printf("\aAti introdus un numar iesit din
intervalul existent\n");
}
system("cls");
printf("Adaugarea
s-a
efectuat
cu
succes!\a\n");
m=1;
system("pause");
break;
case 11:
system("cls");
if(!head){
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
show(head);
printf("\nIntrodu numarul de ordine:\n");
scanf("%d",&id_after);
if(id_after > 0 && id_after <= lenght() ){
system("cls");
add_after_id(id_after);
}
else {
printf("\aAti introdus un numar iesit din
intervalul existent\n");
}
system("cls");
printf("Adaugarea
s-a
efectuat
succes!\a\n");
m=1;
system("pause");
break;
case 12:
system("cls");
if(!head){
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
cu
}
add_to_end();
system("cls");
printf("Adaugarea
s-a
efectuat
cu
succes!\a\n");
m=1;
system("pause");
break;
case 13:
system("cls");
if(!head){
printf("Lista nu exista!\a\n");
m=1;
system("pause");
break;
}
show(head);
printf("Dati
indicele
elementului
pentru
stergere\n");
scanf("%d",&id_delete);
delete_id(id_delete);
system("cls");
printf("Stergerea
a
fost
efectuata
cu
system("cls");
printf("Dati numele fisierului\n>");
fflush(stdin);
gets(savef);
save(savef);
printf("\aSalvarea
a
fost
efectuata
cu
succes!\a\n");
m=1;
system("pause");
break;
case 14:
succes!\n");
m=1;
system("pause");
break;
case 15:
system("cls");
if(head)
{
printf("Dati numele fisierului\n>");
fflush(stdin);
gets(savef);
save(savef);
printf("\aSalvarea a fost efectuata
cu
succes!\n");
puts("GOOD BYE");
system("pause");
freem();
exit(1);
}
break;
default:
system("cls");
printf("Ati introdus o tasta incorecta!\a\n");
m=1;
system("pause");
break;
}
}
}
return 0;
}
Concluzii:
1. Au fost obinute deprinderi de creare a unei baze de date abstractizate utiliznd
lista simplu nlnuit n limbajul C.
2. Au fost obinute deprinderi de prelucrare a listei simplu nln uite, adaugarea
elementelor, stergerea, afisarea, sortarea, cautarea, interschimbarea etc.
3. Au fost obinute deprinderi de salvare a datelor n fiiere i citirea datelor din
ele.
4. Au fost obinute deprinderi de creare a fiierelor antet cu extensia .h, fi ierelor
cu funcii cu extensia .c i includerea lor n proiect.
Bibliografie:
1 Conspectul prelegerilor cursului Structuri de date i Algoritmi. Lector dr.,
conf. univ. M. Kulev. Chiinu: UTM, 2014.
2 https://en.wikipedia.org/wiki/Linked_list accesat la 07.03.2015