Sunteți pe pagina 1din 8

Laborator 1

Tehnici de programare

2011

Liste
Definiie: O list este o colecie de elemente de informaie (noduri) aranjate ntr-o anumit ordine. Lungimea unei liste este numrul de noduri din list. Structura corespunztoare de date trebuie s ne permit s determinm eficient care este primul sau ultimul nod n structur i care este predecesorul sau succesorul unui nod. n imaginea de mai jos este reprezentat o list liniar de lungime patru.
Primul elem
nod 1 nod 2 nod 3

Capul listei

Ultimul elem
nod 4

Coada listei

predecesor

succesor

Operaiile care se fac n liste sunt: Crearea unui nod nou Inserarea sau adugarea unui nod tergerea sau extragerea unui nod Parcurgerea unei liste Implementarea unei liste se poate face n dou moduri: Implementarea secvenial conform ordinii nodurilor n list. Implementarea nlnuit, n care fiecare nod conine dou pri: informaia propriuzis i adresa nodului succesor.

Liste nlnuite
Dac un element din list conine o singur legtur, cea la elementul urmtor spunem c avem o lista simplu nlnuit.
nod 1 nod 2 info adr3 info

primul element

nod 3 adr4 info

info

adr2

nod 4 null

ultimul element

Dac un element din list conine dou legturi: una la elementul urmtor i cealalt la elementul precedent spunem c avem o lista dublu nlnuit.
nod 1 null info adr2 adr1 nod 2 info adr3 ... adr3 nod 4 info null

1
prep. univ. drd. Laura Cacovean

Laborator 1

Tehnici de programare

2011

Liste simplu nlnuite


Definiie: O list simplu nlnuit este o niruire de elemente numite noduri, n care fiecare nod se pstreaz o zon de informaie (numit informaie util) i un pointer ctre elementul urmtor. O list simplu nlnuit se poate reprezenta astfel:
nod 1 nod 2 info adr3 info

primul element

nod 3 adr4

info

adr2

nod 4 info null

ultimul element

Declararea tipului corespunztor de nod ntr-o list simplu nlnuit este:


typedef struct nod { tip_info info; nod *urm; }*adr;

Pentru o list simplu nlnuit avem urmtoarele operaii: 1. Crearea unui nod nou 2. Inserarea unui nod 3. tergerea unui nod 4. Parcurgerea listei (de la stnga la dreapta)

Operaii
1. Crearea unui nod ntr-o list simplu nlnuit Operaia de creare a listei este dat de funcia urmtoare, utilizndu-se definirea de mai jos a elementului listei. Funcia furnizeaz adresa prim. Caz 1: Situaia n care lista e vid avem prim=NULL i ultim=NULL Caz 2: Situaia n care lista e de un element
info null

prim=ultim=adr1 Caz 3: Situaia n care lista e de dou elemente


prim
info1

ultim adr2
info2

null

prim=adr1

ultim=adr2

2
prep. univ. drd. Laura Cacovean

Laborator 1

Tehnici de programare

2011

void adaug(adr &prim, adr &ultim, int val) { adr crt=new nod; crt->info=val; crt->urm=NULL; if(prim==NULL) // daca lista e vida prim=crt; else // daca lista nu e vida ultim->urm=crt; ultim=crt; }

2. Inserarea unui nod ntr-o list simplu nlnuit Pentru inserarea unui element ntr-o list este nevoie s fie cunoscut adresa elementului dup care se face inserarea. Operaia de inserare poate modifica adresa primului element i a ultimului. Caz 1: Situaia n care inserarea se face naintea primului element Caz 2: Situaia n care inserarea se face dup ultimul element Caz 3: Situaia n care inserarea se face n interiorul listei dup un element fixat Caz 4: Situaia n care inserarea se face n interiorul listei naintea unui element fixat
//cazul 1 void inserare_inc_lista(adr &prim, adr &ultim, int val) { adr crt = new nod; crt->info=val; if(prim!=NULL) crt->urm=prim; else { crt->urm=NULL; ultim=prim; } prim=crt; } //cazul 2 void inserare_sf_lista(adr &ultim, int val) { adr crt = new nod; crt->info=val; crt->urm=NULL; if(ultim!=NULL) ultim->urm=crt; else prim=crt; ultim=crt;

3
prep. univ. drd. Laura Cacovean

Laborator 1

Tehnici de programare

2011

//cazul 3 void inserare_dupa_un_nod(adr prim, int val, int val_nod_cautat) { adr crt = new nod; adr p; p=prim; // pornim cu un p de la primul nod pentru a incepe cautarea while(p!=NULL && p->info!=val_nod_cautat) p=p->urm; // merg la urmatorul nod if(p!=NULL) // daca s-a gasit nodul { crt->info=val; crt->urm=p->urm; p->urm=crt; } else printf("nu s-a gasit nodul dupa care se face inserarea\n");

//cazul 4 void inserare_inainte_de_un_nod(adr prim, int val, int val_nod_cautat) { adr p; p=prim; // pornim cu un p de la primul nod pentru a incepe cautarea //p se va pozitiona pe nodul dinaintea nodului cautat if(p==prim && p->info==val_nod_cautat) inserare_dupa_un_nod(prim,val,val_nod_cautat); while(p->urm!=NULL && p->urm->info!=val_nod_cautat) p=p->urm; // merg la urmatorul nod if(p->urm!=NULL) { adr crt = new nod; crt->info=val; crt->urm=p->urm; p->urm=crt; } else printf("nu s-a gasit nodul dupa care se face inserarea\n");

4
prep. univ. drd. Laura Cacovean

Laborator 1

Tehnici de programare

2011

3. tergerea unui nod dintr-o list simplu nlnuit Caz 1: Situaia n care tergerea se face pentru primul element Caz 2: Situaia n care tergerea se face pentru ultimul element Caz 3: Situaia n care tergerea se face n interiorul listei
//cazul 1 void sterg_nod_inc_lista(adr &prim) { adr crt; crt=prim; if(crt!=NULL) { prim=prim->urm; crt->urm=NULL; // rupem legatura cu lista delete crt; } else printf("Lista e vida\n"); } //cazul 2 void sterg_nod_sf_lista(adr prim, adr &ultim) { adr crt,p; p=prim; crt=ultim; if(crt==NULL) printf("Lista e vida\n"); else { //parcurg lista pana la penultimul nod while(p->urm!=ultim) p=p->urm; p->urm=NULL; // rupem legatura cu ultimul nod ultim=p; delete crt; } } //cazul 3 void sterg_nod_cautat(adr &prim, int val_caut) { adr crt,p; p=prim; //parcurg lista pana la elementul din fata elem cautat if(prim->info==val_caut) { crt=prim; prim=prim->urm; delete crt; } else { while(p->urm!=NULL && p->urm->info!=val_caut) p=p->urm; crt=p->urm;//fixam nodul de sters

5
prep. univ. drd. Laura Cacovean

Laborator 1

Tehnici de programare
if(crt==ultim) { p->urm=NULL; ultim=p; delete crt; } else if(crt!=NULL) { //schimbam legaturile p->urm=crt->urm; delete crt; } else printf("nu s-a gasit elem cautat\n");

2011

4. Listarea nodurilor unei liste simplu nlnuite Listarea se face de la stnga la dreapta
void listare(adr prim) { adr p=prim; while(p) { printf("%d ",p->info); p=p->urm; } }

Aplicaie 1: S se creeze o list simplu nlnuit ce conine numere naturale nenule. La ntlnirea unui numr mai mic dect 0 se ncheie crearea listei. La ncheierea crerii listei se cere s se afieze lista de la stnga la dreapta.
/* Sa se creeze o lista simplu inlantuita cu nr naturale. In cazul in care un nr este mai mic decat 0 sau o valoare ce nu este numr crearea listei se opreste

*/

#include<stdio.h> #include<stdlib.h> typedef struct nod { int info; nod *urm; }*adr; //crearea unui nod intr-o lista simplu inlantuita adr prim, ultim; void creare(adr &prim, adr &ultim, int val) { adr crt=new nod;

6
prep. univ. drd. Laura Cacovean

Laborator 1
crt->info=val; crt->urm=NULL;

Tehnici de programare

2011

if(prim==NULL) // daca lista e vida { prim=crt; } else // daca lista nu e vida { ultim->urm=crt; } ultim=crt;

void listare(adr prim) { adr p=prim; while(p) { printf("%d ",p->info); p=p->urm; } } void main() { int nr,rez; printf("Creare lista:\n"); do { printf("introduceti nr natural: ");rez=scanf("%d",&nr); if(!rez) { printf("afisarea listei de la stanga la dreapta este: \n"); listare(prim); printf("\n"); exit(1); } else if(nr>0)// verificam prin rez daca s-au citit numere creare(prim,ultim,nr); else printf("Crearea listei s-a incheiat.\n"); }while(nr>0);

printf("afisarea listei de la stanga la dreapta este: \n"); listare(prim); printf("\n");

Teme de laborator:
A) Pornind de la aplicaia 1 se cere: a. S se insereze naintea primului numr par gsit n list un numr natural citit de la tastatur. b. S se tearg din list primul numr divizibil cu 3. c. n cazul n care n list nu exist nici un numr divizibil cu trei s se afieze un mesaj corespunztor.

7
prep. univ. drd. Laura Cacovean

Laborator 1

Tehnici de programare

2011

B) Fie prim un pointer ctre primul nod al urmtoarei liste de tip coad, i ultim un pointer ctre ultimul nod:
prim ultim

NULL

Care va fi valoarea variabilei s n urma execuiei secvenei urmtoare?


int s=0; adr p=prim; while(p->urm->info<4) p=p->urm; while(p!=ultim) { s=s+p->info; p=p->urm; }

a) 12

b) 9

c) 18

d) 15

C) Fie prim un pointer ctre primul nod al urmtoarei liste:


prim ultim

NULL

Care va fi coninutul listei prin parcurgerea acesteia de la primul nod prim spre captul listei, n urma apelului funciei ce()?
void ce() { adr p=prim; while(p->urm->info<4) p=p->urm; adr q=new nod; q->info=10; q->urm=p->urm; p->urm=q; }

a) (1,2,10,3,4,5)

b) (1,2,3,4,10,5)

c) (1,2,3,10,4,5)

d) (1,2,3,4,5,10)

Teme suplimentare: 1. S se construiasc o list simplu nlnuit care conine numere ntregi. Se cere s se calculeze suma numerelor din list. 2. S se construiasc o list simplu nlnuit care conine numere naturale. Se cere s se calculeze produsul tuturor numerelor pare din list. 3. S se construiasc o list simplu nlnuit care conine numere ntregi aezate cresctor n list. Se cere s se citeasc o valoare de la tastatur i s se adauge acea valoare n list astfel nct poziionarea valorii s nu modifice lista ordonat cresctor. 4. S se construiasc o funcie care determin cte elemente are o list simplu nlnuit. 5. S se determine minimul dintr-o list simplu nlnuit.
8
prep. univ. drd. Laura Cacovean

S-ar putea să vă placă și