Sunteți pe pagina 1din 5

IV.

Structuri dinamice de date – liste


Se consideră următoarea definiţie:
1. struct nod
{ long nr; nod *adr; };

a) Scrieţi definiţia completă a subprogramului sub care, prin intermediul unui parametru p primeşte adresa
primului element dintr-o listă simplu înlănţuită alocată dinamic, iar prin parametru k un număr natural cu cel
mult opt cifre; subprogramul returnează numărul elementelor din listă care conţin valori mai mici sau egale
cu k.
Exemplu: dacă lista contine numerele: 12, 5, 30, 18, 47, 8 si k=25 subprogramul returnează
valoarea 4.
b) Se consideră o listă liniară simplu înlănţuită alocată dinamic cu elemente de tipul nod. Variabila prim
reţine adresa primului nod al listei. Scrieţi declarările de variabile necesare şi secvenţa de program
Pascal/C/C++ în care se citesc două numere naturale a şi b (fiecare fiind format din cel mult opt cifre şi
a<b) şi care determină şi afişează pe ecran numărul valorilor din listă ce aparţin intervalului (a,b],
folosind apeluri ale subprogramului de la punctul a).
Exemplu : dacă lista contine numerele: 6, 9, 7, 3, 5, 8 şi a=4, b=7 se va afisa: 3

2. Se consideră subprogramele:
creare - construieşte o listă simplu înlănţuită alocată dinamic ce memorează în fiecare nod, în ordine,
câte o literă a unui cuvânt c transmis ca parametru; adresa primului nod al listei este returnată printr-un al
doilea parametru, p;
listare – afişează pe ecran, în ordine, literă cu literă, conţinutul listei, adresa primului element fiind
transmisă prin intermediul parametrului p.
a) Scrieţi declarările ce definesc lista şi antetul corect pentru fiecare dintre subprogramele creare şi
listare.
b) Scrieţi programul Pascal/C/C++ (cu excepţia definiţiilor subprogramelor creare şi listare),
program care citeşte de la tastatură un cuvânt format din cel mult 30 de litere mari, formează o listă ce
reţine literele cuvântului citit cu ajutorul subprogramului creare, elimină din listă un număr minim de
noduri astfel încât să nu existe noduri succesive (vecine) ce reţin o aceeaşi literă, iar în final afişează
conţinutul listei rămase folosind subprogramul listare.
De exemplu, pentru cuvântul STTANDD, se afişează în final STAND.

3. Subprogramul minim, primeşte printr-un parametru p adresa unui element oarecare al unei liste
circulare simplu înlănţuită, nevidă, alocată dinamic, care conţine numere întregi cu cel mult 3 cifre
fiecare şi returnează valoarea elementului minim din listă.
a) Scrieţi definiţia tipurilor de date utilizate.
b) Scrieţi definiţia completă a subprogramului minim.

4. Scrieţi declarările de tipuri necesare şi definiţia completă a unei funcţii elim2, cu un parametru, funcţie care
primeşte prin intermediul parametrului p adresa primului element al unei liste simplu înlănţuite alocată
dinamic ce reţine ca informaţii utile valori naturale de cel mult 6 cifre fiecare;
dacă lista are cel puţin două elemente, elimină al doilea element al listei şi returnează valoarea ce fusese
reţinută de elementul eliminat, iar dacă lista nu are cel puţin două elemente, returnează valoarea -1 .

5. Se defineşte un tip de listă simplu înlănţuită alocată dinamic ce memorează în câmpul num un număr întreg
de cel mult 4 cifre şi în cîmpul next adresa elementului următor din listă. Considerăm definite următoarele
trei subprograme:
 inserare – cu doi parametri: prim ce memorează adresa primului element al listei şi nr un număr
întreg de cel mult 4 cifre; subprogramul realizează adăugarea înaintea primului nod din listă a unui nod
nou, având ca informaţie utilă numărul nr;
 numarare – cu doi parametri: prim ce memorează adresa primului element al listei şi nr un număr
întreg format din cel mult 4 cifre şi returnează numărul elementelor ce reţin în câmpul num valoarea
nr.
a) Scrieţi declararea tipurilor de date necesare pentru definirea listei şi doar antetul fiecăruia dintre cele
două subprograme.
b) Scrieţi un subprogram care primeşte prin intermediul unui parametru adresa primului element al unei liste
nevide de tipul mai sus indicat, şi, apelând subprogramele definite anterior, creează o listă simplu înlănţuită
de acelaşi tip cu prima, listă care să reţină doar numerele ce apar de cel puţin două ori în prima listă. În lista
nou creată, fiecare dintre aceste numere va fi inserat o singură dată. Subprogramul va returna adresa
primului element al listei nou create.

6. O listă liniară simplu înlănţuită, alocată dinamic, reţine în câmpul info al fiecărui element câte un număr
natural din intervalul [100, 10000], iar în câmpul adr, adresa elementului următor din listă. Să se scrie
declarările de tipuri necesare definirii listei, precum şi definiţia completă a subprogramului scrie, care are
un parametru, p, prin care primeşte adresa de început a listei şi afişează pe ecran, separate printr-un spaţiu,
acele numere memorate în listă care au cifra sutelor pară.
Exemplu: pentru lista

se afişează 4231 7652 800

7. Se consideră definite subprogramele:


- creare, care citeşte de la tastatură mai multe cuvinte de cel mult 30 de litere fiecare şi creează o listă
simplu înlănţuită ce conţine în fiecare nod al său, în câmpul info, câte un cuvânt dintre cele citite, iar în
câmpul adr, adresa următorului nod din listă. Subprogramul are un singur parametru, p reprezentând
adresa de început a listei nou create;
-cautare, care caută în lista creată un anumit cuvânt; subprogramul are ca parametri variabila p prin care
se transmite adresa de început a listei şi variabila x prin care se transmite cuvântul căutat; subprogramul
returnează adresa nodului care conţine cuvântul căutat, sau NULL/nil în cazul în care acest cuvânt nu este
găsit în listă.
a) Scrieţi declarările de date ce definesc lista, antetul subprogramului creare şi definiţia completă a
subprogramului cautare.
b) Scrieţi programul PASCAL/C/C++ care construieşte o listă cu ajutorul subprogramului creare şi
caută în lista creată cuvântul bacalaureat folosind subprogramul cautare. Programul afişează pe
ecran un mesaj dacă acest cuvânt a fost găsit sau nu în lista creată.

8. Se introduce de la tastatură o frază de maximum 256 de caractere, ale cărei cuvinte sunt scrise cu
majuscule. Scrieţi programul care memorează într-o listă simplu înlănţuită, în ordine alfabetică, majusculele
care apar de mai multe ori (cel puţin de două ori) în frază. Fiecare nod al listei va memora o majusculă din
text şi numărul de apariţii al respectivei majuscule în fraza dată. Afişaţi lista astfel formată, pe fiecare rând
de ecran se va afişa o literă şi numărul ei de apariţii. În cazul în care fraza are caractere distincte se va afişa
mesajul Listă vidă.

Exemplu: pentru textul introdus de la tastatură: SUCCES LA Lista afişată va fi:


EXAMEN A 2
C 2
E 3
S 2

9. Fie o listă liniară simplu înlănţuită, în care fiecare nod reţine în câmpul inf un caracter şi în câmpul next
adresa nodului următor. Se consideră subprogramele:
- cre, care creează o listă liniară simplu înlănţuită ce conţine toate literele unui cuvânt cuv, în ordinea în care
acestea apar în cuvânt. Subprogramul are parametrii şirul de caractere cuv (cu cel mult 50 de caractere) şi
adresa p de început al listei;
- sterg, care elimină din listă toate nodurile ce memorează caractere egale cu un caracter c. Subprogramul
are parametrii adresa p de început al listei şi caracterul c;
- lungime, care determină şi returnează numărul de noduri ale listei; adresa de început a listei este dată
prin singurul parametru p.
Un nod al listei este de tipul nod.
a) Scrieţi antetul corect pentru fiecare din cele 3 subprograme. (4p.)
b) Scrieţi declarările de variabile şi programul principal care citeşte de la tastatură un cuvânt de cel
mult 50 de litere şi afişează pe ecran numărul de vocale ale cuvântului, utilizând doar apeluri ale
subprogramelor de la a).
De exemplu, dacă se citeşte cuvântul bacalaureat, pe ecran se va afişa 6. (6p.)

10. Se consideră o listă simplu înlănţuită (cu cel puţin două elemente) în care fiecare element reţine în câmpul
info un număr întreg nenul format din cel mult patru cifre, iar în câmpul adr adresa următorului element
din listă.
Scrieţi definiţiile de date şi definiţia completă a subprogramului S1 care are ca parametru adresa p a
primului element al listei şi care returnează numărul schimbărilor de semn obţinute în urma parcurgerii listei.
(O schimbare de semn apare când valorile conţinute de două elemente succesive din listă au semne diferite.)
(1
Exemplu: p

31 - - 79 21
17 50
Se obţine: k=2

11. Se consideră o listă simplu înlănţuită (cu cel puţin două elemente) în care fiecare element reţine în câmpul
info un număr real, iar în câmpul adr adresa următorului element din listă.
Scrieţi definiţiile de date şi definiţia completă a subprogramului S1 care are ca parametru adresa p a
primului element al listei şi care determină afişarea pe ecran a mesajului : ”elementele listei sunt
ordonate strict descrescător” dacă elementele listei sunt ordonate strict descrescător;
”elementele listei sunt ordonate strict crescător” dacă elementele listei sunt
ordonate strict crescător ; ”elementele listei nu sunt ordonate strict” în celelalte cazuri.

12. Se consideră o listă simplu înlănţuită (cu cel puţin două elemente) în care fiecare element reţine în câmpul
info un număr întreg nenul format din cel mult patru cifre, iar în câmpul adr adresa următorului element
din listă.
Scrieţi definiţiile de date şi definiţia completă a subprogramului S1 care are ca parametru adresa p a
primului element al listei şi care returnează adresa elementului din mijlocul listei. În cazul în care numărul de
elemente din listă este par, se va returna adresa ultimului element din prima jumătate a listei. (10p.)

13. Se consideră o listă simplu înlănţuită (cu cel puţin două elemente) în care fiecare element reţine în câmpul
info un număr real nenul, iar în câmpul adr adresa următorului element din listă. Scrieţi definiţiile de
date şi definiţia completă a subprogramului S1 care are ca parametru adresa p a primului element al listei şi
care modifică lista prin inserarea între oricare două elemente de semne contrare a unui nou element a cărui
valoare este egală cu media aritmetică a celor două elemente.
Ex. p

31 -17 -50 79

Se obţine :
p
31 7 -17 -50 14.5 79

14. O listă liniară simplu înlănţuită, reţine în fiecare nod, o valoare întreagă în câmpul info şi adresa nodului
următor, în câmpul urm.. Scrieţi în Pascal/C/C++, subprogramul Insereaza, care inserează în listă un
nod. Subprogramul are ca parametru adresa nodului după care se va insera noul nod. Câmpul info al nodului
inserat, reţine partea întreagă a rădăcinii pătrate a valorii info din nodul după care are loc inserarea.
a) Definiţi tipurile de date necesare lucrului cu această listă. (2p.)
b) Scrieţi definiţia completă a subprogramului Insereaza. (5p.)
c) Scrieţi secvenţa de program care, pentru o astfel de listă deja construită, cu adresa primului element
memorată în variabila prim, inserează după fiecare nod ce reţine în câmpul info un număr pătrat perfect,
rădăcina pătrată a acelui număr, folosind apeluri ale subprogramului Insereaza.
De exemplu dacă iniţial lista conţinea valorile 2→16→36→12→81, după executarea programului, conţinutul
listei este 2→16→4→36→6→12→81→9. (3p.)

15. Subprogramul nrprim primeşte prin parametrul n un număr întreg cu cel mult 4 cifre şi returnează
valoarea TRUE(1) dacă n este număr prim, respectiv FALSE(0) în caz contrar. Subprogramul
primulnrprim primeşte printr-un parametru p adresa unui element oarecare al unei liste liniare simplu
înlănţuite, alocată dinamic, în care fiecare element reţine în câmpul număr un număr întreg cu cel mult 4
cifre şi în câmpul urm adresa elementului următor. Subprogramul returnează adresa primului număr prim
găsit, parcurgând lista de la nodul p până la sfârşit, sau valoarea NIL/NULL, dacă nu este găsit nici un
număr prim până la sfârşitul listei. Subprogramul primulnrprim va utiliza apeluri ale subprogramului
nrprim.
a) Scrieţi numai antetul subprogramului nrprim. (2p.)
b) Scrieţi definiţia tipurilor de date necesare şi definiţia completă a subprogramului primulnrprim. (8p.)

16. Fie o listă simplu înlănţuită circulară, în care fiecare nod reţine în câmpul inf un caracter şi în câmpul next
adresa nodului următor. Se consideră subprogramele:
- creare care primeşte prin parametrul cuv un cuvânt de cel mult 20 de litere mici ale alfabetului englez,
creează o listă circulară cu toate literele cuvântului cuv, în ordinea în care sunt aşezate în cuvânt şi
returnează adresa nodului din listă care reţine prima literă din cuvânt.
- afişare care afişează pe ecran caracterele din toate nodurile listei circulare pornind de la adresa nodului
transmisă prin parametrul p şi vizitând toate nodurile listei o singură dată.
O variabilă ce reţine adresa unui nod este de tipul adnod.(Un nod al listei este de tipul nod -pentru
C/C++ )
. a) Scrieţi antetele pentru subprogramele creare şi afişare. (2 p.)
b) Definiţi tipurile de date necesare şi scrieţi programul Pascal care citeşte de la tastatură un cuvânt de
maxim 20 de litere, creează o listă circulară cu toate literele cuvântului şi afişează, câte una pe linie, toate
permutările circulare ale cuvântului, utilizând apeluri ale subprogramelor de la punctul a).
De exemplu, dacă se citeşte de la tastatură cuvântul carte, se vor afişa cuvintele carte, artec,
rteca, tecar, ecart. (8 p.)

17. Se consideră o listă circulară simplu înlănţuită, fiecare nod al listei reţinând în câmpul leg adresa
elementului următor al listei. Componentele listei memorează în câmpul info, în ordine, numere naturale
consecutive începând cu numărul 1.
Scrieţi declarările de date şi un subprogram elimin ce realizează ştergerea din listă a nodurilor ce
memorează numere pătrate perfecte. Subprogramul elimin are un singur parametru p, reprezentând
adresa nodului ce memorează valoarea 1.
De exemplu, dacă lista conţine iniţial numerele de la 1 la 6, după apelul subprogramului elimin(p)
aceasta va conţine, în ordine, valorile 2,3,5,6.
18. Se consideră o listă circulară simplu înlănţuită cu cel puţin 3 elemente. Fiecare p
nod memorează în câmpul info un număr natural şi în câmpul next adresa 1
elementului următor din listă. Scrieţi definiţia completă a unui subprogram 6
2 6
verif care primeşte prin intermediul parametrului p adresa unui element
oarecare din listă şi returnează valoarea 1 în cazul în care informaţia
memorată de nodul de la adresa p este media aritmetică a
informaţiilor 3
5 5
4
memorate în nodul precedent şi în nodul următor şi returnează valoarea 0 în caz contrar. De exemplu
pentru lista din figura alăturată funcţia verif va returna valoarea 0.
19. O listă liniară dublu înlănţuită, reţine în fiecare nod, o valoare întregă în cîmpul info şi adresele nodului
precedent, respectiv următor, în câmpurile prec şi respectiv urm.
a) Scrieţi definiţia tipului de dată corespunzător unui nod al listei. (3p.)
b) Scrieţi definiţia completă a subprogramului cu numele Sterge cu trei parametri: prim, ultim şi p
care reprezintă adresele primului, ultimului şi respectiv unui nod oarecare al listei şi care şterge din listă
nodul de la adresa p. (7p.)
20. Se consideră x, un cuvânt care are maxim 30 de caractere, litere ale alfabetului englez. Subprogramul
creare, creează o listă dublu înlănţuită alocată dinamic care conţine în ordine caracterele cuvântului x,
câte o literă în fiecare nod al listei.
Subprogramul va avea ca parametri: x cuvântul dat, prim adresa de început a listei formate şi ultim,
adresa ultimului nod din listă.
a) Scrieţi definiţia completă a subprogramului creare.
De exemplu: pentru cuvântul citit de la tastatură: IRINA, lista creată va fi:

b) Scrieţi programul care citeşte de la tastatură un cuvânt, creează folosind apeluri ale subprogramului
creare, lista dublu înlănţuită ce va conţine literele cuvântului citit şi afişează pe acelaşi rând de ecran, una
lângă alta, caracterele din listă, astfel încât să se obţină prenumele persoanei citit invers.
Exemplu: pentru lista creată mai sus se va afişa ANIRI.