Ministerul Educaţiei al Republicii Moldova Universitatea Tehnică a Moldovei
Catedra Informatica Aplicată Aplicată
RAPORT Lucrarea de laborator nr. si ! la Structuri de date si algoritmi
A efectuat" st. #r. $I%&'&
(.Cucu
A verificat" dr.) conf.univ.
M. *ulev
Chi+inău ,&-
Lucrarea de laborator nr.2 si 3 Tema: Implementarea tipului de date abstract Lista simplu inlanţuită/ in limba0ul C. Scopul lucrării: obţinerea deprinderilor practice de implementare ș i de utili1are a unui tip de date abstract 2T(A3 in limba0ul C +i anume T(A Lista simplu inlanţuită/. Condiţia problemei (sarcina de lucru : (e scris trei fi+iere in limba0ul C pentru implementarea 2 fi+iere3 si utili1area 2& fi+ier 4 pro#ram cu functia main3 pentru T(A Lista simplu inlanţuită/" &. 5i+ierul antet cu e6tensia 2h3 care descrie structura de date a elementului listei simplu inlanţuite 2conform variantei din lucrare precedentă3 +i prototipurile funcţiilor care asi#ură operaţiunile de prelucrare a listei simplu inlanţuite. . 5i+ier cu e6tensia 2cpp sau c3 care conţine codurile 2implementările3 tuturor funcţiilor declarate 7n fi+ierul antet. !. 5i+ierul utili1atorului % pro#ramul cu funcţia main 23 pentru prelucrarea listei simplu inlanţuite cu afi+area meniului de opţiuni pe ecran si anume" pentru lucrare de laborator 2 % crearea listei simplu inlanţuite cu n elemente 7n memoria dinamică) 7ntroducerea informaţiei despre elementele listei de la tastatură) afi+area informaţiei despre elementele listei pe ecran 2ș i a adreselor elementului current ș i următor3) căutarea elementului listei dupa unui c7mp informaţional) modificarea c7mpurilor elementului listei) interschimbarea a elemente listei) determinarea lun#imei listei) sortarea elementelor listei după unui cimp) eliberarea memoriei dinamice) ie+ire din pro#ram8 pentru lucrare de laborator 3 % adau#area unui element nou la sfir+itul listei) adau#area unui element nou la 7nceputul listei) inserarea unui element nou 7n lista după elementul indicat) inserarea unui element nou 7n lista 7nainte elementul indicat) ster#erea unui element al listei) divi1area listei simplu inlanţuite in două liste separate) unirea a liste simlu inlanţuite intr%o listă) scrierea informaţiei despre elementele listei 7n fi+ier) citirea informatiei despre elementele listei din fi+ier.
!ote teoretice Listele simplu inlantuite sunt structuri de date dinamice omo#ene. $pre deosebire de masive) listele nu sunt alocate ca blocuri omo#ene de memorie) ci ca elemente separate de memorie. 5iecare nod al listei contine) in afara ce informatia utila) adresa urmatorului element. Aceasta or#ani1are permite numai acces secvential la elementele listei. 9entru accesarea listei trebuie cunoscuta adresa primului element 2numita capul listei38 elementele urmatoare sunt accesate parcur#and lista. Lista simplu inlantuita poate fi repre1entata #rafic astfel"
"arianta #$: Stat Anali%a datelor &unctia: 'ain ab ) variabile locale de tip pointer la structura) adresa elementelor ce trebuie interschimbate c ) variabila locala de tip pointer la strucura *ead+2, variabila locala de tip pointer la structura) adresa capului listei a doua n, variabila locala de tip inte#er) numarul de elemente a listei simplu inlantuite nd 4 variabila locala de tip inte#er) numarul de ordine a elementului pentru ster#ere nm, variabila locala de tip inte#er) numarul de orine a statului pentru modificare id, variabila locala de tip inte#er) numarul de ordine a elementului inaintea2dupa3 caruia2care3 adau#am un element nou. l, variabila locala de tip inte#er) lun#imea primei parti a listeisimplu inlantuite com com# a-, variabile locale de tip inte#er) optiuni pentru ale#ere din meniuri -name2$/, variabile locala de tip pointer la tipul de date character)adresa unde se pastrea1a numele fisierului in care salvam datele sau de unde citim datele. denu ) variabila locala de tip character) sirul de caractere introdus de la tastatura &unctia: creates(int n0 n, variabila locala de tip inte#er) numarul de elemente a listei simplu inlantuite c ) variabila locala de tip pointer la strucura p, variabila locala de tip pointer la strucura &unctia: reads( si s*o1s(stat *ead+20 c ) variabila locala de tip pointer la strucura :ariabila locala de tip inte#er) numarul de ordine a elementului in lista i, *ead+2% variabila locala de tip pointer la structura) adresa capului listei a doua &unctia: searc*s ( c*ar denu c ) variabila locala de tip pointer la strucura denu ) variabila locala de tip pointer la character) adresa sirul de caractere introdus de la tastatura &unctia: sorts(oid ab ) variabile locale de tip pointer la structura) adresa elementelor ce trebuie interschimbate pentru sortarea listei l, variabila locala returnabila de tip inte#er) lun#imea listei simplu inlantuite i4 ) variabile locale de tip inte#er) indicele elementului in contor &unctia: appends( si prepends( c, variabila locala de tip pointer la structura p, variabila locala de tip pointer la structura &unctia: deletes(int id nd, variabila locala de tip inte#er) numarul de ordine a statului care trebuie sters
c, variabila locala de tip pointer la structura p, variabila locala de tip pointer la structura &unctia: insertbe-ores(int id si inserta-ters(int id id, variabila locala de tip inte#er) numarul de ordine a elementului inaintea2dupa3 caruia2care3 adau#am un element nou c, variabila locala de tip pointer la structura p, variabila locala de tip pointer la structura
&unctia: modi-5s(int m nm, variabila locala de tip inte#er) numarul de orine a statului pentru modificare i, variabile locale de tip inte#er) indicele elementului in contor cmcm#, variabile locale de tip inte#er) optiuni pentru ale#ere din meniuri &unctia: s1aps(stat a stat b ab ) variabile locale de tip pointer la structura) adresa elementelor ce trebuie interschimbate nanb, variabile locale de tip pointer la structura) adresele elementelor urmatoare a elementelor a si b in lista simplu inlantuita. t, variabila locala de tip pointer la structura) adresa elementului intermediar care a0uta la interschimbarea a state. &unctia: len6t*s(oid l, variabila locala de tip inte#er) lun#imea listei simplu inlantuite c,variabila locala de tip pointer la structura &unctia: saes( c*ar -name si loads( c*ar -name -name/, variabile locala de tip pointer la tipul de date character)adresa unde se pastrea1a numele fisierului in care salvam datele sau de unde citim datele c, variabila locala de tip pointer la structura p, variabila locala de tip pointer la structura &unctia: -reemems(oid c, variabila locala de tip pointer la structura p, variabila locala de tip pointer la structura &unctia: splits(int lstat *ead+2 l, variabila locala de tip inte#er) lun#imea primei parti a listeisimplu inlantuite *ead+2, variabila locala de tip pointer la pointer la structura) adresa variabilei in memorie unde este salvata adresa capului listei a doua c, variabila locala de tip pointer la structura i, variabile locale de tip inte#er) indicele elementului in contor &unctia: 7oins(stat *ead+2 *ead+2, variabila locala de tip pointer la pointer la structura) adresa variabilei in memorie unde este salvata adresa capului listei a doua c, variabila locala de tip pointer la structura
Codul pro6ramului: &isierul : 8Lab2.#.*9
&isierul : 8-unctii lab2.cpp9 ;include
;include =stdlib.h> ;include =conio.h> ;include =strin#.h> crearea listei simplu inlantuite int creates2int n3 ? stat @c)@p8 int i8 for2i,8i=n8iBB3 ?c2stat@3malloc2si1eof2@c338 if2c3 ?return ,8 D if2i,3 ?head c8 D else ?p%>ne6tc8 D
pc8 D c%>ne6tULL8 return &8 D introducere de la tastatura void reads2void3 ?stat @c8 int i,8 puts2<$criti informatia despre stat"<38 chead8 Fhile2c3 ? printf2<$tatul Gd"Hn<)iB&38 printf2<(enumirea" <38 scanf2denumire38 printf2capitala38 printf2<$uprafata" <38 scanf2sup38
printf2<umarul de locuitori" <38 scanf2nl38 printf2<9IJ%ul" <38 scanf2pib38 cc%>ne6t8 iBB8 if2chead3 breaK8 D D intersc*imbarea a 2 state void sFaps2stat @a)stat @b3 ?stat @na)@nb8 stat t8 naa%>ne6t8 nbb%>ne6t8 t@a8 @a@b8 @bt8 a%>ne6tna8 b%>ne6tnb8 D a-isarea listei void shoFs2stat @head3 ? stat @c8 int i,8 if2head ULL3? chead8 D else ? chead8 D puts2denumire38 printf2capitala38 printf2<$uprafata" GdHn<)c%>sup38 printf2<umarul de locuitori" GdHn<)c%>nl38 printf2<9IJ%ul" G.fHnHn<)c%>pib38 printf 2ne6t38 printf 2ne6t8 iBB8 D D lun6imea listei int len#ths2void3 ?int l8 stat @c8 l,8 chead8 Fhile2c3 ?lBB8 cc%>ne6t8 if2chead3 breaK8 D return l8 D cautarea int searchs2char @denu3 ?stat @chead8 int i,)K,8 Fhile2c3? if2stricmp2c%>denumire) denu3,3?
printf2<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HnH n<38 printf2<(atele statului" GdHn<)iB&38 printf2<(enumirea" GsHn<)c% >denumire38 printf2capitala38 printf2<$uprafata" GdHn<)c%>sup38 printf2<umarul de locuitori" GdHn<)c%>nl38 printf2<9IJ%ul" G.fHnHn<)c%>pib38 KBB8 D cc%>ne6t8 iBB8 D if2K3? return &8 D return ,8 D sortarea void sorts2void3 ?stat @a)@b8 int l8 int i)K8 llen#ths238 for2i,8i=l%&8iBB3 ?ahead8 ba%>ne6t8 for2K,8K=l%&%i8KBB3 ?if2stricmp 2a%>denumire) b%>denumire3>,3 ?sFaps2a)b38 D aa%>ne6t8 bb%>ne6t8 D D D modi-icare void modifs2int nm3 ?stat @chead8 int i,)cm)cm&8 Fhile2c3? if2iB& nm3? asd"sstem2denumire38 printf2capitala38 printf2sup38 printf2nl38 printf2pib38 printf2denumire38 breaK8 case " printf2capitala38 breaK8 case !" printf2<$uprafata" <38 scanf2sup38 breaK8
case P" printf2<umarul de locuitori" <38 scanf2nl38 breaK8 case '" printf2<9IJ%ul" <38 scanf2pib38 breaK8 default" printf2ne6t8 iBB8 D D elierarea memoriei void freemems2void3 ?stat @c)@p8 chead8 Fhile2c3 ?pc8 cc%>ne6t8 free2p38 if2chead3 breaK8 D return8 D adau6area dupa stat@ insertafters2int id3 ? stat @chead)@p8 int i,8 Fhile2c3? if2i id%&3? pc8 c2stat@3malloc2si1eof2stat338 printf2denumire38 printf2capitala38 printf2<$uprafata" <38 scanf2sup38 printf2<umarul de locuitori" <38 scanf2nl38 printf2<9IJ%ul" <38 scanf2pib38 c%>ne6tp%>ne6t8 p%>ne6tc8 breaK8 D iBB8
cc%>ne6t8 D D adau6area inainte stat @insertbefores2int id3? stat @chead)@p8 int i,8 Fhile2c3? if2i id%&3? pc8 c2stat@3malloc2si1eof2stat338 printf2denumire38 printf2capitala38 printf2<$uprafata" <38 scanf2sup38 printf2<umarul de locuitori" <38 scanf2nl38 printf2<9IJ%ul" <38 scanf2pib38 if2p head3? c%>ne6thead8 headc8 breaK8 D else ? c%>ne6tp8 i,8 phead8 Fhile2p3? if2i id%3? p%>ne6tc8 D iBB8 pp%>ne6t8 D breaK8 D D iBB8 cc%>ne6t8 D D adau6area la s-irsit void appends23? stat @chead)@p8 Fhile2c3? if2c%>ne6t ULL3? pc8 c2stat@3malloc2si1eof2stat338 printf2denumire38 printf2capitala38 printf2<$uprafata" <38 scanf2sup38 printf2<umarul de locuitori" <38 scanf2nl38 printf2<9IJ%ul" <38 scanf2pib38 p%>ne6tc8
c%>ne6tULL8 breaK8
D D
D cc%>ne6t8 D D adau6area la inceput int prepends23? stat @c)@p8 p2stat@3malloc2si1eof2stat338 if2p3 ?return ,8 D if2headULL3 ?p%>ne6tULL8 phead8 D else ?p%>ne6thead8 headp8 printf2denumire38 printf2capitala38 printf2<$uprafata" <38 scanf2sup38 printf2<umarul de locuitori" <38 scanf2nl38 printf2<9IJ%ul" <38 scanf2pib38 D D ster6erea statului void deletes2int nd3 ? stat @chead)@p8 int i,8 Fhile2c3? if2i nd%&3? if2c head3? headc%>ne6t8 free2c38 breaK8 D else if2c%>ne6t ULL3? phead8 Fhile2p3? if2p%>ne6t c3? free2c38 p%>ne6tULL8 breaK8 D pp%>ne6t8 D D else ? phead8 Fhile2p3? if2p%>ne6t c3? p%>ne6tc%>ne6t8 free2c38 breaK8 D pp%>ne6t8 D
iBB8 cc%>ne6t8 D ; dii%area void splits2int l)stat @@head3? stat @chead8 int i,8 Fhile2c3? if2i l%&3? @headc%>ne6t8 c%>ne6tULL8 breaK8 D iBB8 cc%>ne6t8 D D unirea void 0oins2stat @@head3? stat @chead8 Fhile2c3? if2c%>ne6t ULL3? c%>ne6t@head8 breaK8 D cc%>ne6t8 D @headULL8 D salarea void saves2char @fname3? stat @chead8 5ILE @demofopen2fname)denumire)c% >capitala)c%>sup)c%>nl)c%>pib38 if2c%>ne6t ULL3? fprintf2demo)ne6t8 D fclose2demo38 D citirea din -isier void loads2char @fname3? stat @c)@p8 int i,8 5ILE @demofopen2fname)ne6tc8 pc8 D
fscanf2demo)denumire)c% >capitala)c%>sup)c%>nl)c%>pib38 iBB8 D
p%>ne6tULL8 fclose2demo38 D
&isierul: 8'ain2.cpp9
printf2
D breaK8 case !" printf2 , nd = len#ths233? deletes2nd38 printf2<$tatul a fost sters cu succes.Hn<38 D else ? printf2
breaK8 case &" sstem 2 & l>, l = len#ths233? splits2l)head38 D else ? printf2
Re%ultatele obtinute: 'eniul de introducere a datelor de la tastatura si din -isier
>ntroducerea de la tastatura
Citirea din -isier
'eniu
A-isarea listei cu state
Cautarea statului dupa denumire
Adau6area statului la s-irsit
Adau6area statului la inceput
Ster6erea unui stat
'odi-icarea unui stat
Sortarea statelor dupa denumire
Salarea datelor in -isier Adau6area unui element nou inainte statului indicat
Adau6area unui stat nou dupa statul indicat
?espartirea listei in 2
@nirea listei
liberarea memoriei
Conclu%ie In urma acestei lucrari de laborator am a0uns la ideia ca e destul de usor de lucrat cu structuri de date liste) ele sunt usor de modificat si lucrul dat nu necesita mult timp. (e asemenea verificarea re1ultatelor demonstrea1a ca valorile primite sunt adevarate ceea ce arata ca pro#ramul lucrea1a.
• •
•
Biblio6ra-ie: http"pro#rammersclub.ru,& http"FFF.scribd.comdocP&W!VPe#rescu%Liviu%Limba0ele%C%si%C% pentru%incepatori%vol%& http"devcentral.iftech.comlearnin#tutorialsc%cppc