Ministerul Educaţiei al Republicii Moldova Universitatea Tehnică a Moldovei Catedra Informatică Aplicată Aplicată
RAPORT Lucrarea de laborator nr.!" la disciplina Structuri de date ș i Algoritmi
A efectuat# st. $r. %I!&'&
E. Cucu
A verificat# dr.( conf.univ.( catedra IA
M. )ulev
Chi*inău + ,&-
Lucrare de laborator 2-3 Tema: Implementarea tipului de date abstract Lista simplu inlantuita/ in C Scopul lucrarii: obtinerea deprinderilor practice de implementare a unui tip de date abstract 0T1A2 in limba3ul C si anume a T1A Lista simplu inlantuita/ Sarcina de lucru: 1e scris trei fisiere in limba3ul C pentru implementarea 0 fisiere2 si utili4area 0& fisier + pro$ram cu functia main 2 a T1A Lista simplu inlantuita/# &. 5ișierul antet cu e6tensia .h care descrie structura de date a elementului listei simplu inlantuite 0conform variantei din lucrare precedenta2 și prototipurile funcțiilor care asi$ură operațiunile de prelucrare a listei simplu inlantuite. . 5ișier cu e6tensia .cpp 0sau .c2 care contine codurile 0implementarile2 tuturor functiilor declarate 7n fișierul antet. ". 5ișierul utili4atorului ! pro$ramul cu func ția main 02 pentru prelucrarea listei simplu inlantuite cu afisarea meniului de optiuni pe ecran( si anume# pentru lucrare de laborator ! crearea listei simplu inlantuite in memoria dinamica( introducerea informatiei despre elementele listei de la tastatura( afisarea informatiei despre elementele listei pe ecran( cautarea elementului listei dupa unui cimp informational( modificarea cimpurilor elementului listei( interschimbarea a elemente listei( determinarea lun$imei listei( sortarea elementelor listei dupa unui cimp( eliberarea memoriei dinamice alocate pntru lista( ieșire din pro$ram8 pentru lucrare de laborator "! adau$area unui element nou la sfirsitul listei( adau$area unui element nou la 7nceputul listei( inserarea unui element nou in lista dupa elementul indicat( inserarea unui element nou in lista inainte elementul indicat( ster$erea unui element al listei( divi4area listei simplu inlantuite in doua liste separate( unirea a liste simlu inlantuite intr!o sin$ura lista( scrierea informatiei despre elementele listei in fisier( citirea informatiei despre elementele listei din fișier( ieșire din pro$ram.
Mersul lucrării: Noţiuni principale din teorie i metode !olosite: 9 listă simplu 7nlănţuită este o colecţie de noduri a*e4ate 7ntr!o ordine liniară 0dar :U 7n locaţii succesive din memorie ! a*a cum se 7nt;mplă la vectori2. 5iecare nod are cel puţin un pointer către următorul nod( pe care 7l vom numi next . char marca?',@8 char model?',@8 char ori$ine?',@8 int anu8 float pret8 struct masina ne6t8 Bmasina8 masina head:ULL8
"isierul masina#$ typedef struct masina { char marca[40]; char model[40]; char origine[40]; int anu; float pret; struct masina *next; }masina; masina* head=NU; int create(int n); !unctia de creare a listei simplu inlantuita necirculara"primenste ca paramentru #n$ care este numarul de elemente care urmea%a a fi alocate&
void read(); !uncita de introducere a elementelor in lista simplu inlantuita necirculara& masina* search(char* s); !unctia de cautare in lista simplu inlantuita necirculara dupa un cimp al structurii&'rimeste ca parametru adresa la string(ul introdus de utili%ator si returnea%a elementele gasite& void show_search(); !uncita de afisare a elementelor cautate cu a)utorul functiei searchchar*+; void show(masina* head); !untia de afisarea tuturor elemente din lista simplu inlantuita necirculara a,ind ca paramentru capul listei& void swap(masina* a,masina* b); !unctia de interschim-are a a doua elemente intre ele in lista simplu inlantuita necirculara a,ind . parametri fiind elemente a listei& void sort(); !unctia de sortare dupa pretcimp al structurii+& int length(); !unctia care determina lungimea listei simplu inlantuite necirculare returnea%a o ,aloare de tip int care repre%inta lungimea listei& masina* end(); !untia care determina care este ultimul elemente din lista simplu inlantuita necirculara returnind adresa acestui element& void add_after_id(int id); !unctia de adaugare a elementelor dupa indicele indicat de utili%ator in lista simplu inlantuita necirculara"are ca paramentru indicele tastat de utili%ator& void add_before_id(int id); !unctia de adaugare a elementelor inainte de indicele indicat de utili%ator in lista simplu inlantuita necirculara"are ca paramentru indicele tastat de utili%ator&
void add_to_end(); !unctia de adaugare a elementelor la sfirsit de lista simplu inlantuita necirculara& void delete_id(int id); !uncita de stergere a unui element din lista simplu inlantuita necirculara& void devide(int id,masina** head2); !unctia care de,i%ea%a lista in doua liste"are . parametri"primul ste o ,aria-ila de tip int care repre%inta indicile deunde lista ,(a fi de,i%ata"ia al doilea este adresa elementului care urmea%a sa fie capul listei .*/ void join(masina** head2); !unctia de unire a listei in doua"are ca parametru adresa elementului care este capul listei .& void modif(int id); !uncita de modificare a unui element din lista simplu inlantuita necirculara"a,ind ca parametru o ,aria-ila de tip int care este indicile elementului care urmea%a a fi modificat& void save(char* s); !uncitia de sal,are a informatiei din lista simplu inlantuita necirculara in fisier"are ca paramentru adresa la string(ul introdus de utili%ator care repre%inta numele fisierului& void load(char* s); !uncitia de incarcare a informatiei din fisier in lista simplu inltantuita necirculare"are ca paramentru adresa la string(ul introdus de utili%ator care repre%inta numele fisierului& void freem(); !uncita de eli-erearea memoriei"distrugerea listei simplu inlantuite necirculare&
"isierul !unctii#cpp include include include include
1stdio&h2 1stdli-&h2 1string&h2 3masina&h3
int createint n+ { int i; masina *c"*p; fori=0;i1n;i+ { c=masina*+mallocsi%eofmasina++; ifc == NU+ return 0; ifi == 0+ { head=c; p=c; } else { p(2next=c; p=c; } } p(2next=NU; return 5; } ,oid read+ { masina *c=head; int i=0; 6hilec+ { printf37n****************************************7n7n3+; printf38ntrodu datele masinii 9d7n3"i5+; printf3:arca 3+; scanf39s3"nul de productie 3+; scanf39d3"nul de productie 9d7n3"c(2anu+; printf3'retul?+ 9&.f7n7n3"c(2pret+; printf3>dresa curenta 9p7n3"c+; printf3>dresa elementului urmator 9p7n3"c(2next+; c=c(2next; i;
} } ,oid sho6Asearchchar* s+ { masina *c=head; int i=0"B=0; 6hilec+ { ifstrcmps"c(2marca+==0+ CC strcmps"c(2model+==0 + CC strcmps"c( 2origine+==0++ { printf3****************************************7n7n3+; printf3@atele masinii 9d7n3"i5+; printf3:arca 9s7n3"c(2marca+; printf3:odel 9s7n3"c(2model+; printf3riginea 9s7n3"c(2origine+; printf3>nul de productie 9d7n3"c(2anu+; printf3'retul?+ 9&.f7n7n3"c(2pret+; B; } c=c(2next; i; } ifB==0+ printf3Dlementul nu a fost gasitE7n3+; } masina* searchchar* s+ { masina* c=head; int B=0; 6hilec+ { ifstrcmps"c(2marca+==0 CC strcmps"c(2model+==0 2origine+==0+ { return c; B; } c=c(2next; } ifB==0+ { printf3Nu exista asa masiniE7n3+; } return NU; } ,oid s6apmasina *a"masina *-+ { masina t"*na"*n-; na=a(2next; n-=-(2next; t=*a; *a=*-; *-=t; a(2next=na; -(2next=n-; } int lenght+ { masina *c=head; int i=0; 6hilec+ { i; c=c(2next; } return i;
CC
strcmps"c(
} ,oid sort+ { masina *a"*-; int i"B"l; l=lenght+; fori=0;i1l(5;i+ { a=head; -=a(2next; forB=0;B1l(5(i;B+ { ifa(2pret 1 -(2pret+ { s6apa"-+; } a=a(2next; -=-(2next; } } } masina* end+ { masina* c; c=head; 6hilec(2next+ { c=c(2next; } return c; } ,oid modifint id+ { masina* c=head; int i=0; 6hilec+ { ifi5 == id+ { printf3@atele masinii 9d pentru modificare7n3"i5+; printf3:arca 3+; scanf39s3"nul de productie 3+; scanf39d3"
printf3:odel 3+; scanf39s3"nul de productie 3+; scanf39d3"nul de productie 3+; scanf39d3"
scanf39s3"nul de productie 3+; scanf39d3"
} c=c(2next; } *head.=NU; } ,oid freem+ { masina *c=head"*p; 6hilec+ { p=c; c=c(2next; freep+; ifc == NU+ { -reaB; } } head=NU; } ,oid sa,echar* fname+ { masina*c=head; !8D *txt=fopenfname"36t3+; 6hilec+ { fprintftxt"39s 9s 9s 9d 2anu"c(2pret"c"c(2next+; ifc(2next E= NU+ { fprintftxt" 37n3+; } c=c(2next; } fclosetxt+; }
9&.f
9p
9p3"c(2marca"c(2model"c(2origine"c(
,oid loadchar* fname+ { masina* c"*p; int i=0; !8D *txt=fopenfname"3r3+; ifEtxt+ { printf3!isierul nu existaE7a7n3+; } 6hileEfeoftxt++ { c=masina*+mallocsi%eofmasina++; ifc == NU+ { printf37a:emoria nu a fost alocata7n3+; } ifi == 0+ { head=c; p=c; } else { p(2next=c; p=c; } fscanftxt"39s9s9s9d9f3"
}
"isierul main#cpp include 3functii&cpp3 int main+ { masina *a=NU;/*element pentru sortare/interschim-are*/ masina *-=NU;/*element pentru sortare/interschim-are*/ masina *head.=NU;;/*element cap pentru di,i%are*/ char a5[500];/*string 5 pentru interschim-are*/ char -5[500];/*string . pentru interschim-are*/ char srch[500];/*string pentru cautare*/ char sa,ef[500];/*string pentru sal,are*/ char loadf[500];/*string pentru incarcare*/ int n;/*numarul de elemente in lista*/ int m;/*ciclu infinit meniu principal*/ int com5;/*indice pentru meniu pricipal*/ int mod;/*indice pentru modificare*/ int idAde,ide;/*indice pentru de,i%are*/ int idA-efore;/*indice pentru adaugare inaintea indicelui*/ int idAafter;/*indice pentru adaugare dupa indice*/ int idAdelete;/*indice pentru stergere a elemenentului*/ 6hile5+ { 6hilem+ { m=0; system3cls3+; printf3(((((((((((((((((((((((Freare(((((((((((((((((((((((7n3+; printf35&Frearea listei si introducerea datelor manual7n3+; printf3.&Frearea listei si introduucerea datelor din fisier7n7n3+; printf3((((((((((((((((((((('reaucrare(((((((((((((((((((((7n3+; printf3G&>fisarea listei7n3+; printf34&Hortarea listei dupa pret7n3+; printf3I&:odificarea unui element7n3+; printf3J&8nterschim-area elementelor7n3+; printf3K&Fautarea unui element7n3+; printf3L&@e,i%area elementelor in doua liste7n3+; printf3M&Unirea a doua liste cu elemente7n7n3+; printf3(((((((((((((((((>daugare77Htergere((((((((((((((((((7n3+; printf350&>daugarea elementuui inaintea indicelui7n3+; printf355&>daugarea elementului dupa indice7n3+; printf35.&>daugarea elementului la sfirsitul listei7n3+; printf35G&Htergea unui element7n7n3+; printf3((((((((((((((((((((Hal,are778esire((((((((((((((((((7n3+; printf354&Hal,area in fisier7n3+; printf35I&Hal,are si 8esire7n3+; printf3((((((((((((((((((((((((((((((((((((((((((((((((((((7n3+; printf37n@ati comanda7n23+; scanf39d3"
system3pause3+; m=5; -reaB; } case .
system3cls3+; ifhead+ { printf3:emoria este de)a alocata7n3+; system3pause3+; m=5; -reaB; } printf3@ati numele fisierului7n23+; fflushstdin+; getsloadf+; strcatloadf"3&txt3+; loadloadf+; printf37a8ntroducerea a fost efectuata cu
succesE7n3+; m=5; system3pause3+; -reaB; case G system3cls3+; ifEhead+ { printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB; } sho6head+; system3pause3+; m=5; -reaB; case 4 system3cls3+; ifEhead+ { printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB; } sort+; printf3ista a fost sortata cu succesE7a7n3+; system3pause3+; m=5; -reaB; case I system3cls3+; ifEhead+ { printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB; } sho6head+; printf37n@ati indicile elementului
pentru
modificare7n23+; scanf39d3"
ifEhead+ { printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB; } sho6head+; printf3@ati numele primului element
pentru
fflushstdin+; getsa5+; a=searcha5+; printf3@ati numele
pentru
interschim-are7n23+;
primului
element
interschim-are7n23+; fflushstdin+; gets-5+; -=search-5+; system3cls3+; s6apa"-+; printf38nterschim-area
a
a,ut
loc
cu
succesE7a7n3+; m=5; system3pause3+; -reaB; case K system3cls3+; ifEhead+ { printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB; } printf3@ati denumirea77modelul77originea pentru cautare7n23+; fflushstdin+; getssrch+; sho6Asearchsrch+; m=5; system3pause3+; -reaB; case L system3cls3+; ifEhead+ { printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB; } sho6head+; printf37n8ntrodu indicile de unde lista ,(a fi despartita7n3+; scanf39d3"
a
fost
efectuata
succesE7a7n3+; sho6head+; sho6head.+; m=5; system3pause3+; -reaB; case M system3cls3+; ifEhead+{ printf3ista nu existaE7a7n3+; m=5;
cu
system3pause3+; -reaB; } ifhead.+{ )ointi introdus un numar iesit din inter,alul existent7n3+; } system3cls3+; printf3>daugarea
s(a
efectuat
cu
succesE7a7n3+; m=5; system3pause3+; -reaB; case 55 system3cls3+; ifEhead+{ printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB; } sho6head+; printf37n8ntrodu numarul de ordine7n3+; scanf39d3"ti introdus un numar iesit
din
inter,alul existent7n3+; } system3cls3+; printf3>daugarea
s(a
efectuat
succesE7a7n3+; m=5; system3pause3+; -reaB; case 5. system3cls3+; ifEhead+{ printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB;
cu
} addAtoAend+; system3cls3+; printf3>daugarea
s(a
efectuat
cu
succesE7a7n3+; m=5; system3pause3+; -reaB; case 5G system3cls3+; ifEhead+{ printf3ista nu existaE7a7n3+; m=5; system3pause3+; -reaB; } sho6head+; printf3@ati indicele elementului
pentru
stergere7n3+; scanf39d3"
fost
efectuata
cu
system3cls3+; printf3@ati numele fisierului7n23+; fflushstdin+; getssa,ef+; sa,esa,ef+; printf37aHal,area a fost efectuata
cu
succesE7a7n3+; m=5; system3pause3+; -reaB; case 54
succesE7n3+; m=5; system3pause3+; -reaB; case 5I system3cls3+; ifhead+ { printf3@ati numele fisierului7n23+; fflushstdin+; getssa,ef+; sa,esa,ef+; printf37aHal,area a fost efectuata
cu
succesE7n3+; puts3@ OPD3+; system3pause3+; freem+; exit5+; } -reaB; default system3cls3+; printf3>ti introdus o tasta incorectaE7a7n3+; m=5; system3pause3+; -reaB; } } } return 0; }
%onclu&ii: &. Au fost obținute deprinderi de creare a unei ba4e de date abstracti4ate utili47nd lista simplu 7nlănțuită 7n limba3ul C. . Au fost obținute deprinderi de prelucrare a listei simplu 7nlăn țuite( adau$area elementelor( ster$erea( afisarea( sortarea( cautarea( interschimbarea etc. ". Au fost obținute deprinderi de salvare a datelor 7n fișiere și citirea datelor din ele. '. Au fost obținute deprinderi de creare a fișierelor antet cu e6tensia .h( fișierelor cu funcții cu e6tensia .c și includerea lor 7n proiect. 'iblio(ra!ie: & Conspectul prele$erilor cursului %tructuri de date și Al$oritmi. Lector dr.( conf. univ. M. )ulev. Chișinău# UTM( ,&'. https#DDen.iFipedia.or$DiFiDLinFedGlist accesat la ,H.,".,&-