UNIX,Linux,Retele,Programare

02 Apr 08 18:32

redkar23
Gamer
Locaţie: Timisoara
Înregistrat: 25 Mar 08
Mesaje: 151
Site web

[Curs C] - Lectia 12 - Liste

Finally, am reusit sa termin si lectia despre liste smile ( O parte din ea big_smile )
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 lol 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
           

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

nume_tip *nume_pointer = new <dimensiune> nume_tip ;
     delete nume_pointer ;

Exemplu
     

...
       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
     

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
       

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
     

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

b)Lista dublu inlantuita
     

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

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  )

#include <stdio.h>

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<n;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 lol 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_smile, de aceea sunt mai lent ^^


http://tn3-1.deviantart.com/fs32/300W/i/2008/233/5/7/Boo_by_Redkar23.png
What doesn't kill you, makes you stronger .       - Friedrich Nietzsche
O noua definitie a ironiei : life itself .                 - Redkar23

Offline

 

01 Jun 08 20:03

astan
SkullBox user
Locaţie: Bucuresti
Înregistrat: 02 Mar 08
Mesaje: 213
Site web

Re: [Curs C] - Lectia 12 - Liste

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)

Offline

 

» Press CTRL+ALT+DEL now for an IQ test

tutoriale,programare

Scuze de offtopic


Antet forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson



Ethical hacking and programming community