curs02.txt

来自「STRUCTURI DE DATE SI ALGORITMI」· 文本 代码 · 共 182 行

TXT
182
字号

			       Curs 2

Structuri de date elementare

O structura de date presupune un mod de organizare a datelor (宯 tablouri,
structuri, etc), si definirea operatiilor acceptate. Deci, o structura de date
reprezinta o colectie organizata de date si un set de operatii definite.
Si notiunea de tip de date presupune:
		 |--- reprezentare
		 |--- operatii acceptate

De exemplu, pentru tipul int:
		 |--- reprezentare: pe doi octeti: cod complementar
		 |---operatii acceptate: +, -, *, /, &, |, etc.

Daca pentru un tip de date nu intereseaza reprezentarea, ci doar operatiile
acceptate,宯seamna ca tipul de date este abstract.

Structuri de date
  Tablouri
Tabloul este o colectie de date 宯 care fiecare element poate fi identificat
pe baza unui index, colectia asigur僴d timp de acces constant pentru fiecare
element. Prin reprezentarea tabloului se intelege plasarea elementelor 宯
locatii succesive de memorie:


Locatiile de memorie pot fi numerotate, put僴d accesa direct orice element.
Timpul de accesare al elementului numar, de exemplu, fiind acelasi cu timpul
de accesare al elementului n.

  Liste
O lista este o multime de obiecte, numite atomi, pentru care este definita o
ordine:

Operatiile principale care se pot se face 宯 cadrul listei:
  inserare: introducerea unui nou element 宯tr-o anumita pozitie;
  stergere: scoaterea unui element dintr-o anumita pozitie;
  consultare: accesul asupra fiecarui element din lista;
  parcurgere.
 Tipuri speciale de liste

   Stive
O stiva este o lista 宯 care operatiile de inserare, stergere si consultare se
efectueaza asupra unui capat al listei. Stiva se poate asemana cu un recipient
宯 care se pun si se pot scoate diferite obiecte. Operatia care pune obiectele
宯 stiva se numeste push, iar cea care scoate obiecte din stiva se numeste pop.
Capatul accesibil pentru stiva se numeste v價ful stivei:
 Asadar:
  push  insereaza un element 宯 v價ful stivei;
  pop  sterge un element din v價ful stivei;
  top  consulta (citeste) elementul din v價ful stivei;
  top(S)  citeste v價ful stivei.

 Cozi
O coada este o lista 宯 care inserarea se face la un capat (la sf價sit),
iar stergerea se face de la celalalt capat al cozii (de la 宯ceput). Partea
din fata a cozii (a primului element) se numeste front, iar partea din spate
(a ultimului element) se numeste end.
 Operatia de inserare 宯 coada  add (put)
 Operatia de stergere din coada  del (get)

 Implementari de liste
O lista poate fi realizata ca:  lista ordonata sau
                                lista 宯lantuita
Lista ordonata tine cont de o ordine a pozitiilor elementelor listei, nu de
continutul elementelor.
 Inserarea 宯tr-o lista de forma:

se face cu deplasare de o pozitie la st僴ga din punctul 宯 care dorim sa
inseram (pentru a face acest loc noului element).
Deplasarea se face 宯spre zona de memorie libera (cea hasurata)  presupunem
ca dorim sa inseram pe a 宯 pozitia i):

Presupun僴d acum hasurat corpul de elemente din lista si nehasurata zona de
memorie libera, inserarea s-ar putea figura astfel:

Stergerea: deplasarea cu o pozitie la st僴ga din acel punct.

  Liste 宯lantuite
Intr-o lista 宯lantuita, ordinea din memorie nu mai corespunde cu ordinea din
lista. Fiecare element al listei 宯lantuite va avea urmatoarea structura:
(a(i) , succesor(a(i)))
unde a(i) este atomul listei 宯lantuite, iar informatia succesor(a(i)) ne
permite sa identificam un nou element de lista 宯lantuita. Ordinea din memorie
a elementelor listei nu conteaza. Informatia care indica primul element al
listei se numeste "capul" listei. Informatiei succesor(a(i)) i se potriveste
notiunea de pointer (identificator), pointer-ul fiind o variabila care
pastreaza o adresa din memorie. El indica pozitia elementului urmator. C僴d
informatiile de 宯lantuire sunt pointeri, putem utiliza urmatoarea
reprezentare:


Capul de lista este un pointer separat care duce la primul element din lista,
iar 0 este pointer-ul nul (NULL) cu valoare zero. La implementarea listei
宯lantuite concentrarea se face la fluxul instructiunilor, nu la declaratiile
de variabile.

In programe vom utiliza urmatoarele notatii:
 x  adresa unui element din lista, deci un pointer;
 data(x)  atomul memorat 宯 elementul de lista indicat de x;
 link(x)  informatia de legatura memorata 宯 elementul de lista indicat de x,
          adica adresa elementului urmator;
 y = get_sp()  y (de acelasi tip cu x) primeste adresa unei zone de memorie
             宯 care se poate memora un element din lista (get space sau
             alocare de memorie c僴d este vorba de pointer);
 ret_sp(x)  elibereza memoria ocupata de elementul de lista indicat de x (din
             momentul respectiv	acolo se poate memora altceva).

Un element de lista va fi o astfel de structura:

 struct Element {
             Atom data;
             Element* link;
                };
Se va scrie:
 tipul lui x ---------------- Element* x
 data(x) ---------------- x  data
 link(x) ---------------- x  link
 y = get_sp() ---------------- y = new Element
 ret_sp() ---------------- delete x

Deoarece lucram cu conceptul de lista vom face declaratia :
 typedef Element* Lista;
Un pointer la un element de lista considerat aproximeaza lista ce porneste cu
elementul indicat.

Operatii primitive pentru liste 宯lantuite

1.Inserarea
Inserarea se face:  宯 fata, sau
宯 interior (la mijloc ori la sf價sit)
a) Inserarea 宯 fata

1 - Prima atribuire: link(x) = l
2 - A doua atribuire: l = x 

Observatie: daca lista este vida, l are valoarea 0 (capatul listei) iar 
atribuirile de mai sus ram僴 valabile:


b) Inserarea la mijloc

Analog pentru inserarea la sf價sit.
1 - Prima atribuire: link(x) = link(y)
2 - A doua atribuire: link(y) = x

2.a)Stergerea (stergerea din fata):

1 - Prima atribuire: p = l
2 - A doua atribuire: l = link(l)
3 - ret_sp(p)
Sau, stergerea din fata s-ar mai putea reprezenta astfel:
Situatia initiala:

Situatia finala:

(1) p = cap;
(2) cap = cap  link;
    delete p ;                // Elibereaza zona de memorie

Elementul care a fost izolat de lista trebuie sa fie procesat 宯 continuare,
cel putin pentru a fi eliberata zona de memorie pe care o ocupa, de aceea
adresa lui trebuie salvata (sa zicem 宯 variabila pointer p).
2.b)Stergerea de la mijloc sau de la sf價sit

Varibila q va indica elementul din fata celui care va fi sters.

Situatia initiala:

Situatia finala:

(1) p = q->link;
(2) q-> link = p->link;     // sau q->link = q->link->link;
    delete p;

Observatii:
Atunci c僴d q indica penultimul element dintr-o lista, atribuirile de mai sus
functioneaza corect si sterg ultimul element din lista.
Nu se poate face stergerea elementului indicat de q fara parcurgerea listei de
la capat.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?