Documente Academic
Documente Profesional
Documente Cultură
rularii programului.
Inserarea si stergerea de noduri se face mai rapid cu liste
2
Liste simplu inlatuite
Fiecare nod dintr-o lista inlantuita contine informatii despre
date.
3
Liste simplu inlatuite
O lista simplu inlantuita se numeste “inlantuita” deoarece
4
Cum se declara?
In primul rand, trebuie sa declaram o structura de date
5
Urmatorul pas este sa declaram un pointer care sa fie capul
listei.
ListNode *head;
listei.
6
Operatii cu liste
Vom folosi declararea clasei din slide-ul urmator, care este stocata
in FloatList.h.
7
class FloatList
{
private:
// declaram o structura pentru nod
struct ListNode
{
float value;
struct ListNode *next;
};
8
Adaugarea unui nod la o lista
A adauga un nod la o lista inlatuita inseamna a-l adauga la finalul listei.
Pseudocodul pentru aceasta operatie este prezentat mai jos. Codul C++
urmeaza.
9
void FloatList::appendNode(float num)
{
ListNode *newNode, *nodePtr;
void main(void)
{
FloatList List;
list.appendNode(2.5);
list.appendNode(7.9);
list.appendNode(12.6);
}
(Programul nu afiseaza nimic.)
11
Programul pas cu pas
Pointerul head este declarat ca variabila globala. head este
12
newNode = new ListNode;
newNode->value = num;
newNode->next = nULL;
13
Urmatoarea instructiune este if.
if (!head)
head = newNode;
preia controlul.
14
In cel de-al doilea apel al appendNode, 7.9 este
15
Deoarece head nu mai pointeaza NULL, intram pe
ramura de else.
else // altfel insereaza newNode la final
{
// initializeaza nodePtr cu capul listei
nodePtr = head;
// cauta ultimul nod din lista
while (nodePtr->next)
nodePtr = nodePtr->next;
// insereaza newNode la final
nodePtr->next = newNode;
}
16
nodePtr este deja la finalul listei, deci bucla while se
17
A treia oara cand metoda appendNode este apelata, 12.6
18
Apoi, else se executa. nodePtr pointeaza catre head.
19
Atat timp cat nodePtr->next nu este NULL, se
20
Testul din conditia lui while pica dupa prima iteratie
21
Parcurgerea unei liste
Functia displayList parcurge lista, afisand
22
void FloatList::displayList(void)
{
ListNode *nodePtr;
nodePtr = head;
while (nodePtr)
{
cout << nodePtr->value << endl;
nodePtr = nodePtr->next;
}
}
23
#include <iostream.h>
#include "FloatList.h"
void main(void)
{
FloatList List;
list.appendNode(2.5);
list.appendNode(7.9);
list.appendNode(12.6);
list.displayList();
}
24
Inserarea unui nod
Folosind structura listNode, pseudocodul urmator
ordonate.
25
Creeaza un nou nod
Stocheaza datele in noul nod
Daca nu sunt noduri in lista
Noul nod va fi capul listei
Altfel
Gaseste primul nod a carei valoare este mai mare sau egala cu noua valoare sau finalul listei.
Insereaza noul nod inaintea celui gasit sau pe ultima pozitie.
26
void FloatList::insertNode(float num)
{
ListNode *newNode, *nodePtr, *previousNode;
nodePtr = head;
27
// daca noul nod trebuie sa fie primul in lista, il inseram
//inaintea tuturor, daca trebuie sa fie ultimul se insereaza la final
if (previousNode == NULL)
{
head = newNode;
newNode-> = nodePtr;
}
else
{
previousNode->next = newNode;
newNode->next = nodePtr;
}
}
}
28
#include <iostream.h>
#include "FloatList.h”
void main(void)
{
FloatList list;
list.appendNode(2.5);
list.appendNode(7.9);
list.appendNode(12.6);
list.insertNode(10.5);
list.displayList();
}
29
In insertNode, un nou nod este creat si argumentul
functiei este copiat in value. Atat timp cat lista are deja
noduri stocate in ea, ramura de else se va executa. Incepe
prin a asigna nodePtr lui head.
30
Atat timp cat nodePtr nu este NULL si nodePtr-
31
Inca o data, bucla testeaza conditia. Deoarece nodePtr nu
32
Stergerea unui nod
Un nod se sterge dintr-o lista inaltuita in doi pasi:
33
void FloatList::deleteNode(float num)
{
ListNode *nodePtr, *previousNode;
void main(void)
{
FloatList list;
36
cout << “Stergem ultimul nod.\n";
cout << “Noduri ramase.\n";
list.deleteNode(12.6);
list.displayList();
cout << endl;
37
Variatii ale listelor inlantuite
Lista dublu inlantuita
38
Pe saptamana viitoare!
39