aveti aici cateva linkuri spre carti de programare gratuite in format PDF:
Cartea de algoritmi de Razvan Andonie & Ilie Garbacea. Algoritmii sint in C/C++, foarte buna pt. cei care vor sa invete C sau C++.
PHP-Manualul programatorului
Carti gratuite in engleza
Thinking in C++, Volume 2: Practical Programming [Bruce Eckel] Final version (print version) - December, 2003
Book in HTML + source-code tree and makefiles.
Teach Yourself C++ in 21 Days
C++ in action [Bartosz Milewski]
Optimizing C++ [Steve Heller]
The C Book [Mike Banahan, Declan Brady & Mark Doran]
de asemenea va recomand un site foarte util unde o sa va lamuriti toate problemele legate de programare www.programare.org
Se afișează postările cu eticheta Programare. Afișați toate postările
Se afișează postările cu eticheta Programare. Afișați toate postările
20.08.2008
Lista liniara simplu inlantuita
si se apropie sesiunea de restante....:D .....cred ca ar fi cazul sa ma pun sa citesc ceva la Programarea vietii!! si totodata m-am gandit sa-i fac o sectiune speciala, caci de acum incolo numai programare o sa vad si Grafica de asemenea...
Am sa incep cu "Lista liniara simplu inlantuita" :
DEF: O lista liniara inlantuita este o colectie de n>=0 elemente x[1].....x[n] toate de un tip oarecare, numite noduri intre care exista o relatie de ordine determinata de pozitia lor relativa.
Listele inlantuite cu un singur camp de legatura se numesc liste simple inlantuite (legatura indica urmatorul element din lista ) iar cele cu 2 campuri de legatura se numesc liste dublu inlantuite (o legatura indica nodul precedent iar cealalta nodul succesor)
#include
#include
#include
typedef struct lista // definirea listei
{
int cheie; //informatia propriu-zisa
struct lista *urm; //informatia de legatura, pointer spre urmatorul element
} lista; //al listei
lista *prim; //definire variabile
void creare() //crearea listei simple inlantuite
{
lista *p,*q;
int n,i=2;
printf("Introduceti nr de noduri:");
scanf("%d",&n);
prim=NULL; // initializarea listei
p=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt nodul ce urmeaza sa fie
printf("Introduceti valoarea primului nod: "); //introdus in lista si
scanf("%d",&p->cheie); //citirea informatiei aferente acestui nod
// generarea legaturilor corespunzatoare
p->urm=NULL; // nu exista inca un element urmator in lista
prim=p; //pointerul prim trebuie sa indice in permanenta capul listei
while(i<=n) //introducerea nodurilor
{ q=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt nodul ce urmeaza sa
printf("Introduceti valoarea din nodul: %d ",i); // fie inserat
scanf("%d",&q->cheie );
p->urm=q; //stabilim legatura dintre nodurile ce se insereaza
q->urm=NULL; //ultimul element nu are succesor si trebuie egalat cu NULL
p=q;
i++;
}
}
void afisare() //afisare lista
{
lista *p;
p=prim;
while(p)
{
printf("%d ",p->cheie);
p=p->urm;
}
}
void adaugare_cap(int x) //inserarea unui element in capul listei
{
lista *p;
p=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt elementul ce urmeaza
p->cheie=x; //sa fie inserat
//scanf("%d",&p->cheie);
p->urm=prim; //urmatorul element celui pe care il inseram va
//fi fostul prim element al listei
prim=p; //prim va indica noul cap al listei
}
void adaugare_sf(int x) //inserarea unui element la sfarsitul listei
{
lista *p,*q;
for(p=prim;p->urm;p=p->urm); //pornim cu pointerul p de la capul listei si
//iesim din ciclul for in momentul in care pointerul
//p va indica ultimul element al listei
q=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt elementul ce urmeaza sa fie inserat
q->cheie=x;
p->urm=q; //stabilim legatura dintre ultimul element si elementul ce urmeaza sa fie inserat
q->urm=NULL; //noul ultim element nu are succesor
}
void adaugare_dupa(int x) //inserare dupa nodul precizat de o cheie data
{
lista *p, *q;
for(p=prim;p;p=p->urm) // pornim cu pointerul p de la capul listei si
//iesim din ciclul for daca am ajuns la capatul listei
//sau daca valoarea din campul cheie este cea cautata
if (p->cheie==x) //daca iesirea din ciclu s-a facut prin gasirea valorii dorite
{
q=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt elem. ce urmeaza sa fie inserat
printf("Introduceti valoarea de inserat: ");
scanf("%d",&q->cheie);
q->urm=p->urm;
p->urm=q; //dupa nodul indicat de pointerul p va urma noul nod indicat de q
break; //iesirea din ciclu
}
}
void cautare(int x) //cautarea unei anumite valori intr-o lista simplu inlantuita
{
lista *p;
int v=0;
for(p=prim;p;p=p->urm) //traversam lista pana gasim elementul dorit sau ajungem la finalul listei
if (p->cheie==x) v=1;
if (v) {printf("valoarea a fost gasita ");putchar('\n');}
else {printf("valoarea nu a fost gasita ");putchar('\n');}
}
void sterge_prim() //stergerea primului nod din lista
{
lista *p;
p=prim;
prim=prim->urm; //pointerul prim va indica urmatorul element care devine astfel capul listei
free(p); //eliberam memoria ocupata de nodul indicat de pointerul p
}
void sterge_cheie(int x) //stergerea unui nod avand o cheie data
{
lista *p,*q;
q=NULL;
for(p=prim;p&&p->cheie!=x; q=p, p=p->urm); //traversam lista pana gasim elementul
//sau ajungem la finalul listei
if (!p) //daca nodul a fost gasit
if (p!=prim) //daca nodul cautat nu e capul listei
{
q->urm=p->urm; //pointerul p indica nodul ce urmeaza a fi sters iar r indica
//predecesorul nodului indicat de p
free(p); //eliberam memoria ocupata de nodul indicat de pointerul p
}
else //daca nodul ce urmeaza a fi sters este capul listei
{
prim=prim->urm; //pointerul prim va indica urmatorul element care devine astfel capul listei
free(p); //eliberam memoria ocupata de nodul indicat de pointerul p
}
else printf("nu exista cheia specificata"); //elementul nu a fost gasit
}
void sterge_lista() // stergerea tuturor elementelor unei liste
{
lista *p;
while(prim) //atat timp cat prim nu contine null
{
p=prim;
prim=prim->urm;
free(p); //eliberam memoria ocupata de nodul indicat de pointerul p
}
}
void main(void)
{
int a;
printf("Crearea listei \n");
creare();
printf("afisare lista \n");
afisare();putchar('\n');
printf("Introduceti elementul de adaugat in capul listei: \n");
scanf("%d",&a);
adaugare_cap(a);
printf("lista noua este ");putchar('\n');
afisare();putchar('\n');
printf("Introduceti elementul de adaugat la sfarsitul liste:i \n");
scanf("%d",&a);
adaugare_sf(a);
printf("lista noua este ");putchar('\n');
afisare();putchar('\n');
printf("Introduceti cheia dupa care se adauga o valoare: \n");
scanf("%d",&a);
adaugare_dupa(a);
printf("lista noua este ");putchar('\n');
afisare();putchar('\n');
printf("Introduceti valoarea care se cauta: ");
scanf("%d",&a);
cautare(a);putchar('\n');
printf("Introduceti cheia din nodul care se sterge: \n");
scanf("%d",&a);
sterge_cheie(a);
printf("lista noua este ");putchar('\n');
afisare();putchar('\n');
printf("se sterge primul nod ");putchar('\n');
sterge_prim();
printf("lista noua este "); putchar('\n');
afisare();putchar('\n');
getch();
printf("se sterge toata lista ");
sterge_lista();
}
Am sa incep cu "Lista liniara simplu inlantuita" :
DEF: O lista liniara inlantuita este o colectie de n>=0 elemente x[1].....x[n] toate de un tip oarecare, numite noduri intre care exista o relatie de ordine determinata de pozitia lor relativa.
Listele inlantuite cu un singur camp de legatura se numesc liste simple inlantuite (legatura indica urmatorul element din lista ) iar cele cu 2 campuri de legatura se numesc liste dublu inlantuite (o legatura indica nodul precedent iar cealalta nodul succesor)
#include
#include
#include
typedef struct lista // definirea listei
{
int cheie; //informatia propriu-zisa
struct lista *urm; //informatia de legatura, pointer spre urmatorul element
} lista; //al listei
lista *prim; //definire variabile
void creare() //crearea listei simple inlantuite
{
lista *p,*q;
int n,i=2;
printf("Introduceti nr de noduri:");
scanf("%d",&n);
prim=NULL; // initializarea listei
p=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt nodul ce urmeaza sa fie
printf("Introduceti valoarea primului nod: "); //introdus in lista si
scanf("%d",&p->cheie); //citirea informatiei aferente acestui nod
// generarea legaturilor corespunzatoare
p->urm=NULL; // nu exista inca un element urmator in lista
prim=p; //pointerul prim trebuie sa indice in permanenta capul listei
while(i<=n) //introducerea nodurilor
{ q=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt nodul ce urmeaza sa
printf("Introduceti valoarea din nodul: %d ",i); // fie inserat
scanf("%d",&q->cheie );
p->urm=q; //stabilim legatura dintre nodurile ce se insereaza
q->urm=NULL; //ultimul element nu are succesor si trebuie egalat cu NULL
p=q;
i++;
}
}
void afisare() //afisare lista
{
lista *p;
p=prim;
while(p)
{
printf("%d ",p->cheie);
p=p->urm;
}
}
void adaugare_cap(int x) //inserarea unui element in capul listei
{
lista *p;
p=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt elementul ce urmeaza
p->cheie=x; //sa fie inserat
//scanf("%d",&p->cheie);
p->urm=prim; //urmatorul element celui pe care il inseram va
//fi fostul prim element al listei
prim=p; //prim va indica noul cap al listei
}
void adaugare_sf(int x) //inserarea unui element la sfarsitul listei
{
lista *p,*q;
for(p=prim;p->urm;p=p->urm); //pornim cu pointerul p de la capul listei si
//iesim din ciclul for in momentul in care pointerul
//p va indica ultimul element al listei
q=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt elementul ce urmeaza sa fie inserat
q->cheie=x;
p->urm=q; //stabilim legatura dintre ultimul element si elementul ce urmeaza sa fie inserat
q->urm=NULL; //noul ultim element nu are succesor
}
void adaugare_dupa(int x) //inserare dupa nodul precizat de o cheie data
{
lista *p, *q;
for(p=prim;p;p=p->urm) // pornim cu pointerul p de la capul listei si
//iesim din ciclul for daca am ajuns la capatul listei
//sau daca valoarea din campul cheie este cea cautata
if (p->cheie==x) //daca iesirea din ciclu s-a facut prin gasirea valorii dorite
{
q=(lista*)malloc(sizeof(lista)); //alocarea de spatiu pt elem. ce urmeaza sa fie inserat
printf("Introduceti valoarea de inserat: ");
scanf("%d",&q->cheie);
q->urm=p->urm;
p->urm=q; //dupa nodul indicat de pointerul p va urma noul nod indicat de q
break; //iesirea din ciclu
}
}
void cautare(int x) //cautarea unei anumite valori intr-o lista simplu inlantuita
{
lista *p;
int v=0;
for(p=prim;p;p=p->urm) //traversam lista pana gasim elementul dorit sau ajungem la finalul listei
if (p->cheie==x) v=1;
if (v) {printf("valoarea a fost gasita ");putchar('\n');}
else {printf("valoarea nu a fost gasita ");putchar('\n');}
}
void sterge_prim() //stergerea primului nod din lista
{
lista *p;
p=prim;
prim=prim->urm; //pointerul prim va indica urmatorul element care devine astfel capul listei
free(p); //eliberam memoria ocupata de nodul indicat de pointerul p
}
void sterge_cheie(int x) //stergerea unui nod avand o cheie data
{
lista *p,*q;
q=NULL;
for(p=prim;p&&p->cheie!=x; q=p, p=p->urm); //traversam lista pana gasim elementul
//sau ajungem la finalul listei
if (!p) //daca nodul a fost gasit
if (p!=prim) //daca nodul cautat nu e capul listei
{
q->urm=p->urm; //pointerul p indica nodul ce urmeaza a fi sters iar r indica
//predecesorul nodului indicat de p
free(p); //eliberam memoria ocupata de nodul indicat de pointerul p
}
else //daca nodul ce urmeaza a fi sters este capul listei
{
prim=prim->urm; //pointerul prim va indica urmatorul element care devine astfel capul listei
free(p); //eliberam memoria ocupata de nodul indicat de pointerul p
}
else printf("nu exista cheia specificata"); //elementul nu a fost gasit
}
void sterge_lista() // stergerea tuturor elementelor unei liste
{
lista *p;
while(prim) //atat timp cat prim nu contine null
{
p=prim;
prim=prim->urm;
free(p); //eliberam memoria ocupata de nodul indicat de pointerul p
}
}
void main(void)
{
int a;
printf("Crearea listei \n");
creare();
printf("afisare lista \n");
afisare();putchar('\n');
printf("Introduceti elementul de adaugat in capul listei: \n");
scanf("%d",&a);
adaugare_cap(a);
printf("lista noua este ");putchar('\n');
afisare();putchar('\n');
printf("Introduceti elementul de adaugat la sfarsitul liste:i \n");
scanf("%d",&a);
adaugare_sf(a);
printf("lista noua este ");putchar('\n');
afisare();putchar('\n');
printf("Introduceti cheia dupa care se adauga o valoare: \n");
scanf("%d",&a);
adaugare_dupa(a);
printf("lista noua este ");putchar('\n');
afisare();putchar('\n');
printf("Introduceti valoarea care se cauta: ");
scanf("%d",&a);
cautare(a);putchar('\n');
printf("Introduceti cheia din nodul care se sterge: \n");
scanf("%d",&a);
sterge_cheie(a);
printf("lista noua este ");putchar('\n');
afisare();putchar('\n');
printf("se sterge primul nod ");putchar('\n');
sterge_prim();
printf("lista noua este "); putchar('\n');
afisare();putchar('\n');
getch();
printf("se sterge toata lista ");
sterge_lista();
}
Abonați-vă la:
Postări (Atom)