Lucrarea nr. 9 - Liste dublu înlănţuite Breviar teoretic În cadrul elementelor studiate anterior s-a putut observa utilitatea listelor simplu înlănuit

Documente similare
1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Programarea şi utilizarea calculatoarelor

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Lucrarea nr. 4 - Algoritmi de sortare şi ordonare Breviar teoretic Un algoritm de sortare este o metoda prin care se aranjează elementele unui tablou

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Procesarea de imagini folosind programarea paralela. Implementari Java. Continut laborator: 1. Obiectivul lucrarii. 2. Notiuni teoretice: 3. Cerinte l

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

Declararea variabilelor

PHP (II)

Laborator 3

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Slide 1

Microsoft Word - CarteC.doc

Top

CURS

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Proiectarea Sistemelor Software Complexe

PROGRAMARE OBIECT-ORIENTATA LABORATOR 1 INTRODUCERE IN CLASE SI OBIECTE Introducere teoretica Prin intermediul unei Clase ne dorim sa construim tipuri

Metode API - integrare FGO v.2.5 Cuprins ISTORIC VERSIUNI... 2 INTRODUCERE... 2 APELARE... 4 NOMENCLATOARE... 4 FACTURA... 5 EMITERE... 5 PRINT... 6 S

Paradigme de Programare

Ingineria Sistemelor de Programare

proiectarea bazelor de date

Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

Metode de sortare - pregătire admitere - Conf.dr. Alexandru Popa Lect. dr. Andrei Pătraşcu Universitatea din Bucureşti 1

Algoritmi genetici paraleli. Implementari Java. Continut laborator: 1. Obiectivul lucrarii. 2. Notiuni teoretice: 3. Cerinte laborator. 4. Tema. 1. Ob

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre de

Ingineria Sistemelor de Programare

Metode API - integrare FGO v.2.8 Cuprins ISTORIC VERSIUNI... 2 INTRODUCERE... 2 APELARE... 4 NOMENCLATOARE... 4 FACTURA... 4 EMITERE... 4 PRINT... 6 S

SUBPROGRAME

Ghid utilizare aplicație PARKING BUCUREȘTI Aplicație PARKING BUCUREȘTI 1

Programarea şi utilizarea calculatoarelor

E_d_Informatica_sp_MI_2015_bar_02_LRO

Microsoft PowerPoint - Curs_SDA_4_RO_2019_v2.pptx

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Structuri de date pentru partiţii de mulţimi O partiţie finită a unei mulţimi nevide S este o mulţime finită de submulţimi ale lui S: {S 1, S 2,..., S

PROGRAMARE ORIENTATA PE OBIECTE

Microsoft Word - Curs_07.doc

Ingineria Sistemelor de Programare

Paradigme de programare

Laborator 7: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea I - proceduri) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de blo

EXCEL FĂRĂ SECRETE Grafice şi diagrame

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

Slide 1

9. Design patterns - Singleton, Factory, Observer Scopul acestui curs este familiarizarea cu folosirea unor pattern-uri des întâlnite în design-ul atâ

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

Laborator Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate r

manual_ARACIS_evaluare_experti_v5

Metode API - integrare FGO v.3.0 Cuprins ISTORIC VERSIUNI... 2 INTRODUCERE... 2 APELARE... 4 NOMENCLATOARE... 4 FACTURA... 4 EMITERE... 4 PRINT... 6 S

Manual de utilizare Room Booking System

Diapositive 1

tehnologii web

Object Oriented Programming

Programarea şi utilizarea calculatoarelor

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

Raportarea serviciilor de dializă la nivel CNAS

Microsoft Word - PCLP2_Curs_4_2019.doc

-

Slide 1

Microsoft Word - Curs 11 - PHP.doc

Addendum Syllabus 6 Microsoft Access 2016 REF Syllabus 6.0 Cunoașterea domeniilor în care se utilizează bazele de date Datorită potenţialului ma

Cursul 1 1. Introducere Corpul numerelor complexe Dezvoltarea istorică a gândirii matematice a urmărit îndeaproape evoluţia ideii de număr. Această ev

Microsoft Word - CarteC.doc

Curs 10

Metode de programare Proiectarea algoritmilor

manual_ARACIS_evaluare_experti_v4

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

Analiză de flux de date 29 octombrie 2012

Web Social FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZE

INSTITUTUL DE DEZVOLTARE A SOCIETĂŢII INFORMAŢIONLE

Introducere în limbajul JavaScript

A

E_d_Informatica_sp_SN_2014_bar_10_LRO

Baze de date - Anul 2 Laborator 8 Limbajul de definire a datelor (LDD) (partea I) În general, instrucţiunile LDD sunt utilizate pentru definirea struc

Analiză statică Analiza fluxului de date 23 octombrie 2014

Declaraţii. Instrucţiuni 19 octombrie 2005 Programarea calculatoarelor 2. Curs 3b Marius Minea

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

Microsoft Word - CarteC.doc

Limbaje de programare. Laborator Clasa, obiect, abstractizare Clasa : descrie tipul obiectelor dintr-un program; poate fi asociată cu un şablon

Proceduri stocate Syntax: CREATE PROCEDURE <Name> type1,...] AS -- secventa de comenzi SQL GO O procedura stocata se ruleaza cu EXEC: EXEC <N

R E G U L A M E N T U L privind utilizarea Sistemului Informațional Automatizat Acreditare (SIA Acreditare) în cadrul Centrului Național de Acreditare

Manual de utilizare a Sistemului Informațional al Institutului Național al Justiției (SI INJ) intranet.inj.md Ver.2 Manual de utilizare a Sistemului I

Documentaţie Tehnică Verificare TVA API Ultima actualizare: 1 ianuarie / 92 1

Microsoft Word - lab4.doc

Limbaje de Programare Curs 8 – Fisiere

Limbaje de Programare Curs 6 – Functii de intrare-iesire

FONDUL SOCIAL EUROPEAN

Laborator02

Slide 1

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 4. Dezvoltarea site-urilor si blog-uri

Baze de date-Anul 2 (semestrul 2)

Transcriere:

Lucrarea nr. 9 - Liste dublu înlănţuite Breviar teoretic În cadrul elementelor studiate anterior s-a putut observa utilitatea listelor simplu înlănuite, a inserării unor elemente în cadrul listelor, a sortării acestora. Se pune problema modului în care se poate implementa o lista cu 2 identificatori de cuplare: unul cu următorul element, iar celalalt cu predecesorul. Prin urmare vor fi două elemente individuale, care vor identifica capatul listei elementul prim First şi elementul ultim Last. Pentru ambele cazuri construcţia, inserţia unui element ca trebui să ia în considerare cazul în care avem de-a face cu mulţimea vida. Structura unui program va cuprinde următoarele module: Crearea elementului unei liste Se observă că această clasă crează un element al listei conţinând, informaţia efectivă - ddata, informaţie de cuplaj (de tip clasă element al listei)- next şi previous class Link { public double ddata; public Link next; public Link previous; - un constructor care permite iniţializarea informaţiei efective, (o suprainscriere a clasei) public Link(double d) { ddata = d; - o metodă de vizualizare a informaţiei conţinute în respectivul element: public void displaylink() { System.out.print(dData + " "); În continuare este creată structura listei dublu înlănţuite - DoublyLinked, având la bază descrierea elementelor realizată în cadrul clasei Link: În cadrul listei sunt inserate cele două elemente particulare: primul capăt al listei first şi cel de-al doilea capăt al listei last, fiind iniţializate cu elementul vid null. 1

class DoublyLinkedList { private Link first; private Link last; public DoublyLinkedList() {first = null;last = null; Este creat indicatorul boolean - isempty() - de listă vidă echivalent cu identificarea cu elementul nul al primului element first public boolean isempty() { return first==null; Este creată metoda de inserare a unui element la primul capăt al listei insertfirst(). Această metodă tretează separate, prin intermediul unei structuri if cazul în care lista era vidă (isempty este true ), situaţie în care elementul introdus prin intermediul metodei este identificat cu elementul last, respectiv cazul în care pe prima poziţie exista deja un element. Acest element va deveni elementul next pentru elemental nou introdus, în timp ce elementul nou introdus va deveni first (ca locaţie intermediară pentru interschimbare este folosită locaţia first.previous). public void insertfirst(double dd) { if( isempty() ) last = newlink; first.previous = newlink; newlink.next = first; first = newlink; În mod similar se construieşte metoda insertlast(). public void insertlast(double dd) { if( isempty() ) first = newlink; { last.next = newlink; 2

newlink.previous = last; last = newlink; Metoda de ştergere a primului element deletefirst(), tratează separate cele două cazuri posibile: la ştergere lista având un singur element, devine lista vidă first.next==null atunci şi last=null lista conţine mai multe elemente şi la ştergere trebuie refacute legăturile cu elementul de după elementul şters (first devine elementul care era anterior first.next, în timp ce elementul previous al elementului de după first, înainte de ştergere devine null vezi figura. Anterior era elementul first ce este şters şi trimis în afara metodei prin variabila temp) public Link deletefirst() { Link temp = first; if(first.next == null) last = null; first.next.previous = null; first = first.next; return temp; Similar metoda deletelast() public Link deletelast() { Link temp = last; if(first.next == null) first = null; last.previous.next = null; last = last.previous; return temp; Metoda insertafter() permite inserarea unei înregistrări, în cadrul listei după un anumit element indicat în cadrul metodei. Prin funcţia while se realizează parcurgerea listei până în momentul în care este localizată înregistrarea identică cu valoarea key introdusă. Structura if transează cazul în care nu a fost găsită nici o înregistrare corespunzătoare, când metoda întoarce rezultatul false, respectiv cazul în care a fost localizată corespunzător respectiva înregistrare. Dacă locaţia identificată este ultima locaţie, atunci este introdusă direct noua înregistrare dd care a fost instanţiată prin variabila newlink, nu înainte de a fi iniţializată legatura next cu null (vezi figura). Dacă locaţia este diferită de ultima poziţie, atunci locaţia curentă a cheii identificate, va transfera legătura next, la înregistrarea introdusă, poziţia previous a locaţiei current.next va fi identificată prin înregistrarea introdusă, în timp ce locaţia previous a înregistrării introduce va reveni înregistrării curente, care se va lega de înregistrarea introdusă prin câmpul next. Transferul va fi semnalizat prin transferul variabilei booleene true, care va confirma realizarea inserării. 3

public boolean insertafter(double key, double dd) { Link current = first; while(current.ddata!= key) {current = current.next; if(current == null) return false; if(current==last) {newlink.next = null; last = newlink; { newlink.next = current.next; current.next.previous = newlink; newlink.previous = current; current.next = newlink; return true; Similar, metoda de ştergere a unei înregistrări situate după o anumită cheie de identificare deletekey() public Link deletekey(double key) { Link current = first; while(current.ddata!= key) {current = current.next; if(current == null) return null; if(current==first) first = current.next; current.previous.next = current.next; if(current==last) last = current.previous; current.next.previous = current.previous; return current; Metoda displayforward permite vizualizarea listei de la primul element la ultimul. Astfel, după afişarea mesajului de identificare a direcţiei de afişare : Lista (Primul --> Ultimul ):, este citită prima înregistrare a listei, după care utilizând o structură while, care permite baleierea întregii liste (până la identificarea elementului vid), prin apelarea metodei displaylink() din clasa de creare a unei înregistrări (clasa Link). public void displayforward() { System.out.print("Lista (Primul-->Ultimul ): "); Link current = first; 4

while(current!= null) { current.displaylink(); current = current.next; System.out.println(""); Metoda displaybackward() este similară cu metoda anterioară cu observaţia că afişarea se face de la ultimul element la primul. public void displaybackward() { System.out.print("Lista (Ultimul -->Primul: "); Link current = last; while(current!= null) { current.displaylink(); current = current.previous; System.out.println(""); Aplicatie : Creaţi şi implementaţi o listă dublu înlănţuită în proiectul DoubleLinkList: import java.io.*; class Link{ public double ddata; public Link next; public Link previous; public Link(double d){ ddata = d; public void displaylink(){ System.out.print(dData +" "); class DoublyLinkedList{ private Link first; private Link last; public DoublyLinkedList(){ first = null; last = null; public boolean isempty(){ return first==null; public void insertfirst(double dd){ if(isempty()) last=newlink; { first.previous = newlink; newlink.next = first; first = newlink; public void insertlast(double dd){ if(isempty()) first = newlink; 5

{ last.next = newlink; newlink.previous = last; last = newlink; public Link deletefirst(){ Link temp = first ; if(first.next == null) last = null; first.next.previous = null; first = first.next; return temp; public Link deletelast(){ Link temp = last; if(first.next==null) first = null; last.previous.next = null; last = last.previous; return temp; public boolean insertafter(double key, double dd){ Link current = first; while(current.ddata!= key){ current = current.next; if(current ==null) return false; if(current==last){ newlink.next=null; last = newlink; { newlink.next = current.next; current.next.previous = newlink; newlink.previous = current; current.next = newlink; return true; public Link deletekey(double key){ Link current = first; while(current.ddata!= key){ current = current.next; if(current==null) return null; if(current==first) first = current.next; current.previous.next = current.next; if(current==last) last = current.previous; current.next.previous = current.previous; return current; public void displayforward(){ 6

System.out.print("Lista( Primul --> Ultimul ):") ; Link current = first ; while(current!= null){ current.displaylink(); current = current.next; System.out.println(""); public void displaybackward(){ System.out.print("Lista( Ultimul --> Primul ): "); Link current = last; while(current!= null){ current.displaylink(); current = current.previous; System.out.println(""); Aplicatie : Creaţi şi implementaţi o listă dublu înlănţuită în proiectul InterIterApp: import java.io.*; class Link{ public double ddata; public Link next; public Link(double dd){ ddata=dd; public void displaylink(){ System.out.print(dData +" "); class LinkList{ private Link first; public LinkList(){ first=null; public Link getfirst(){ return first; public void setfirst(link f){ first = f; public boolean isempty(){ return first==null; public ListIterator getiterator(){ return new ListIterator(this); public void displaylist(){ Link current = first; while(current!=null){ current.displaylink(); current = current.next; System.out.println(""); class ListIterator{ private Link previous; private Link current; private LinkList ourlist; public ListIterator(LinkList list){ ourlist = list; reset(); 7

public void reset(){ current= ourlist.getfirst(); previous = null; public boolean atend(){ return(current.next==null); public void nextlink(){ previous = current; current=current.next; public Link getcurrent(){ return current; public void insertafter(double dd){ if(ourlist.isempty()){ ourlist.setfirst(newlink); current=newlink; { newlink.next=current.next; current.next=newlink; nextlink(); public void insertbefore(double dd){ if(previous==null){ newlink.next = ourlist.getfirst(); ourlist.setfirst(newlink); reset(); { newlink.next = previous.next; previous.next = newlink; current = newlink; public double deletecurrent(){ double value = current.ddata; if(previous==null){ ourlist.setfirst(current.next); reset(); { previous.next = current.next; if(atend()) reset(); current = current.next; return value; import java.io.*; class InterIterApp{ public static void main(string args[]) throws IOException{ LinkList thelist = new LinkList(); ListIterator iter1 = thelist.getiterator(); double value; iter1.insertafter(20); iter1.insertafter(40); iter1.insertafter(80); iter1.insertafter(60); while(true){ System.out.println("..."); System.out.println("tastati prima litera de la Arata=show, Sterge=reset, "); System.out.println("next, afiseaza=get, inainte=before, dupa=after, sterge=delete;"); System.out.println("..."); System.out.flush(); int choise= getchar(); switch(choise){ case 's': if(!thelist.isempty()) 8

thelist.displaylist(); System.out.println("Lista este goala"); case 'r': iter1.reset(); case 'n': if(!thelist.isempty() && iter1.atend()) iter1.nextlink(); System.out.println("Nu pot gasi legatura urmatoare"); case 'g': if(!thelist.isempty()){ value = iter1.getcurrent().ddata; System.out.println("Valoarea preluata este "+value); System.out.println("Lista goala"); case 'b': System.out.print("Introduceti valoarea ce doriti sa o inserati: "); System.out.flush(); value = getint(); iter1.insertbefore(value); case 'a': System.out.print("Introduceti valoarea dorita "); System.out.flush(); value = getint(); iter1.insertafter(value); case 'd': if(!thelist.isempty()){ value = iter1.deletecurrent(); System.out.println("Valoarea stearsa este "+value); System.out.println("Nu pot sterge"); default: System.out.println("Intrare invalida"); public static String getstring() throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s = br.readline(); return s; public static int getchar() throws IOException{ String s = getstring(); return s.charat(0); public static int getint() throws IOException{ String s = getstring(); return Integer.parseInt(s); 9

Probleme propuse 1. Rulaţi si comentati programul DoubleLinkList. 2. Modificaţi programul DoubleLinkList prin inserarea în cadrul zonei de informaţie a înregistrării a unui string. 3. Rulati şi comentaţi programul: InterIterApp 4. Modificaţi programul InterIterApp prin inserarea în cadrul zonei de informaţie a înregistrării a unui string. 10