» Utilizator
LAMP
» Parteneri» De citit» Recomandari» Taskuri securitate » Statistici
  • 65486 de mesaje.
  • 7732 de topicuri.
  • 1230 de utilizatori.
  •  
  • Joistestisket8 e ultimul utilizator inregistrat.
[Detalii]

 

| |
Pagini: [1]
Print

[Curs C] - Lectia 12 - Liste [1446 afisari]

redkar23
*


Mesaje: 164
OfflineOffline

WWW

Finally, am reusit sa termin si lectia despre liste Smile ( O parte din ea Big grin )
In primul rand vom defini conceptul de lista.(apoi ne vom lungi cu niste teorie si exemple de cod)
 
  Lista = secventa de elemente de acelasi tip.
   
  Nota : chiar daca o lista nu are nici un element, tot lista se considera. Doar ca se va numi lista vida

  Sper ca ati citit macar lectiile nr. 6 si 9, fiindca listele sunt in legatura directa cu pointeri si structuri(veti vedea in continuare).
 
Partea teoretica

in C, o lista este tot o colectie, exact ca si structura. Dar exista o singura diferenta intre cele doua. Lista, spre deosebire de structura,este flexibila. Se poate micsora/creste,ocupa doar spatiul necesar in memorie (tipurile alocate static ocupa memorie chiar daca nu sunt folosite) si pot fi supuse unor operatii mai complexe( nu doar accesare si manipulare a elementelor unei liste).

Operatiile de baza pentru o lista sunt urmatoarele :
   * inserarea unui element in lista
   * stergerea unui element din lista
   * repozitionarea unui element in lista
   
La cerere, voi adauga la lectie si exemple de cod in care se fac operatii asupra listelor de fiecare tip(simpla,dubla,circulara). Deocamdata este doar un exemplu de cod la sfarsitul lectiei . Iar daca nimeni nu vrea noi exemple de cod, tot voi adauga Laughing doar ca nu am asa mult timp saptamanile acestea  Smile

*************************************************************************************************************************************

Partea practica

La aceasta parte vreau sa acopar urmatoarele idei :
   * Lista simpla inlantuita
   * Lista dubla inlantuita
   * Lista circulara

 Dupa cum am spus mai sus, listele sunt structuri flexibile. Flexibilitatea datelor este reprezentata de modul in care sunt alocate in memorie : static sau dinamic .
   
  a) Alocare statica
         
       - reprezinta orice declaratie normala de variabile .
 
       Exemplu
           
Quote
int a;
char x;
// etc...
b) Alocare dinamica
       - toate datele alocate dinamic sunt puse in Heap , nu pe stack sau pe segment.    
       - alocarea dinamica a datelor se face prin cuvantul cheie new
       - eliberarea memoriei(stergerea datelor alocate dinamic) se face prin cuvantul cheie delete
       - cand lucram cu liste, de fapt lucram cu pointeri spre anumite structuri  
       
     Forma generala
Quote
nume_tip *nume_pointer = new nume_tip ;
     delete nume_pointer ;
Exemplu
     
Quote
...
       int main() {
          int *p;
          int *p= new int;  // in acest fel se aloca dinamic memorie pentru o valoare de tip int
          *p = 5 ;          //incarcam o valoare la adresa indicata de pointer
          printf("%d\n",*p) ; // afisam valoarea retinuta la adresa respectiva
        delete p;           // eliberam memoria mai sus alocata:)
Ok. am acoperit basic-ul despre alocarea dinamica.
  Acum sa trecem la liste Smile
 
 Liste

  Definitie
       
      - este o colectie de structuri alocate dinamic

   a) Lista simpla inlantuita
         - fiecare element( structura ) contine un pointer care indica spre urmatorul element
   b) Lista dubla inlantuita
         - fiecare element( structura ) contine 2 pointeri, fiecare indicand unul din elementele vecine.
   c) Lista circulara
         - lista simpla inlantuita la care pointer-ul din ultimul element indica spre primul element din lista

   Forma generala a unui element

   a) Lista simpla inlantuita si lista circulara
     
Quote
struct nume_structura {
           nume_tip1 nume_var1;
           //...................
           nume_tipN nume_varN;
           nume_structura *nume_pointer; // pointer de tip nume_structura care va indica spre urmatorul element
           };
b) Lista dublu inlantuita
       
Quote
struct nume_structura {
           nume_tip1 nume_var1;
           //...................
           nume_tipN nume_varN;
           nume_structura *nume_pointer1; // pointeri care indica spre  
           nume_structura *nume_pointer2; // elementele vecine
           };
Exemplu de element
       
    a)Lista simpla inlantuita si lista circulara
     
Quote
struct record {
         int number;
         record *next;
         };
b)Lista dublu inlantuita
     
Quote
struct record {
         int number;
         record *prev,*next;
         };
Operatorul pentru accesare campurilor unui element :  -> ( Accesare indirecta ) . Operatorul .(point) de la structuri reprezenta accesarea directa a unui camp, dar fiindca la liste folosim pointeri, se foloseste accesarea indirecta.
       
       Exemplu
Quote
record->number = 2; // am initializat variabila number d
Exemplu de cod

 Urmatorul cod citeste un set de numere intr-o lista simpla inlantuita, apoi afiseaza lista pe ecran. ( Deci aici este acoperita operatia de inserare in lista Smile  )

Quote
#include

struct record{
   int number;
   record *next;
  };

record *first,*current;
 
int main(){
   int n;
   printf("Cate numere vor fi citite : ");
   scanf("%d",&n);
   
   int i,val;
   for(i=0;i      scanf("%d",&val);
      current = new record;  
      current->number = val;
      current->adr = first;
      first = current;
      }
   while(first){                 // NOTA : daca ati obs. mai sus, la citire, pointerul first va contine dupa citire
    printf("%d ",first->number); // o copie al ultimului element. Deci la afisare, numerele vor fi afisate in ordine
    first = first->next;         // inversa citirii acestora. Pentru a afisa numerele in ordine trebuie doar sa mai
   }                             // declarati un pointer de tip record si sa cititi primul element separat, si sa-l
   return 0;                     // copiati in acel pointer,iar la while,in loc de "first" puneti numele pointerului ce indica spre primul element
}
Inca nu am acoperit totul despre liste Laughing mai este mult. Voi adauga pe parcurs informatii la aceasta lectie.Desigur, daca ajung sa fac asta primul Tongue ,  poate apare vreun user cu ceva completari Smile In perioada asta sunt extremly busy cu scoala Big grin, de aceea sunt mai lent ^^
Logged
02-04-2008, 16:32 Twitt ::
astan
*


Mesaje: 773
OfflineOffline


Cred ca in cadrul lectiilor de C ar trebui sa fie folosite numai elemente ale limbajului C, fara elemente de C++.
Ar trebui folosite functiile din libraria standard C pentru alocarea memoriei (malloc, calloc, realloc) si nu operatorul "new".
Motivul: daca folosim elemente ale limbajului C++, atunci cursul se transforma intr-unul de C++. Iar daca cursul e de C++, nu prea mai are rost implementarea unor structuri de date gen liste (folosim direct std::list din STL si gata)
Logged
01-06-2008, 18:03 Twitt ::
Pagini: [1]
Print
SkullBox Forum  |  Development  |  Java / C / C++ / C#  |  Topic: [Curs C] - Lectia 12 - Liste