20.08.2008

Carti programare

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

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();
}