summaryrefslogtreecommitdiff
path: root/sem_3/algo
diff options
context:
space:
mode:
Diffstat (limited to 'sem_3/algo')
-rw-r--r--sem_3/algo/TP3/FichiersTP3.tgzbin0 -> 2607 bytes
-rw-r--r--sem_3/algo/TP3/enonceTP3.pdfbin0 -> 125909 bytes
-rw-r--r--sem_3/algo/TP3/fichierTP3.cpp127
-rw-r--r--sem_3/algo/TP3/fichierTP3.h43
-rw-r--r--sem_3/algo/TP3/mainTP3.cpp84
-rw-r--r--sem_3/algo/TP3/progListeSC.cpp105
-rw-r--r--sem_3/algo/TP3/progListeSC.h56
-rw-r--r--sem_3/algo/TP3/tp3bin0 -> 19624 bytes
-rw-r--r--sem_3/algo/TP4/fichierTP4.cpp194
-rw-r--r--sem_3/algo/TP4/progListeSC.cpp114
-rw-r--r--sem_3/algo/TP4/progListeSC.h59
-rw-r--r--sem_3/algo/TP4/tpIN301_4.pdfbin0 -> 94341 bytes
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/mainTP1.cpp65
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/outilsTab.cpp131
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/outilsTab.h74
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/sm1.dat10
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/sm2.dat7
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/sm3.dat10
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/sm4.dat10
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/tp1bin0 -> 19257 bytes
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/trace1.gnu5
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/trace2.gnu5
-rw-r--r--sem_3/algo/tp1-done/PROG_TP1/trace3.gnu5
-rw-r--r--sem_3/algo/tp1-done/énoncéTP1.pdfbin0 -> 99901 bytes
-rw-r--r--sem_3/algo/tp2/fichierTP2.cpp214
-rw-r--r--sem_3/algo/tp2/progbin0 -> 19149 bytes
-rw-r--r--sem_3/algo/tp2/progListeSC.cpp104
-rw-r--r--sem_3/algo/tp2/progListeSC.h56
-rw-r--r--sem_3/algo/tp2/énoncé TP2.pdfbin0 -> 100541 bytes
29 files changed, 1478 insertions, 0 deletions
diff --git a/sem_3/algo/TP3/FichiersTP3.tgz b/sem_3/algo/TP3/FichiersTP3.tgz
new file mode 100644
index 0000000..2986ae0
--- /dev/null
+++ b/sem_3/algo/TP3/FichiersTP3.tgz
Binary files differ
diff --git a/sem_3/algo/TP3/enonceTP3.pdf b/sem_3/algo/TP3/enonceTP3.pdf
new file mode 100644
index 0000000..887d4cb
--- /dev/null
+++ b/sem_3/algo/TP3/enonceTP3.pdf
Binary files differ
diff --git a/sem_3/algo/TP3/fichierTP3.cpp b/sem_3/algo/TP3/fichierTP3.cpp
new file mode 100644
index 0000000..1b804ed
--- /dev/null
+++ b/sem_3/algo/TP3/fichierTP3.cpp
@@ -0,0 +1,127 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "progListeSC.h"
+#include "fichierTP3.h"
+using namespace std;
+
+
+
+bool estTrieeLSC(ListeSC L){
+ // Res : Renvoie true si L est une ListeSC tri�e, false sinon
+
+ if (estVideLSC(L) || estVideLSC(L->succ))
+ return true;
+ else
+ return (L->info < (L->succ)->info) && estTrieeLSC(L->succ);
+}
+
+bool estListeIntervalle(ListeSC L){
+ // Res : renvoie true si L est une Liste intervalle, renvoie false sinon
+ // A COMPLETER
+ while ( L->succ != NULL) {
+ if (L->succ->info - L->info != 1) return false;
+ L=L->succ;
+ }
+ return true;
+}
+
+ListeSC consListeIntervalle1(int l, int p){
+ // Donn�e : l>0
+ // Res : renvoie une liste intervalle de longueur l et dont le premier �l�ment a pour valeur p
+ // Complexit� : Complexité dans le pire cas : O(N^2) ( boucle for + complexité de base de insererFinLC)
+ assert(l>0);
+
+ int i; ListeSC L;
+ L=NULL;
+ for(i=0;i<l;i++)
+ insererFinLSC(L,p+i);
+ return L;
+}
+
+ListeSC consListeIntervalle2(int l, int p){
+ // Donn�e : l>0
+ // Res : renvoie une liste intervalle de longueur l et dont le premier �l�ment a pour valeur p
+ // Complexit� : O(N)
+ // Version iterative
+ p=p+l-1 ; //valeur du dernier element
+ ListeSC L = NULL;
+ while ( l>0) {
+ L=creerLSC(p, L);
+ p--;
+ l--;
+ }
+ return L;
+}
+
+ListeSC consListeIntervalle3(int l, int p){
+ // Donn�e : l>0
+ // Res : renvoie une liste intervalle de longueur l et dont le premier �l�ment a pour valeur p
+ // Complexit� : O(N-1)
+ // Version r�cursive
+ ListeSC L=NULL;
+ if ( l == 0) return L;
+ else {
+ L = creerLSC(p,consListeIntervalle3(l-1,p+1));
+ return L;
+ }
+}
+
+void transfListeIntervalle(ListeSC L){
+ // Donn�e : L est une liste tri�e non vide
+ // Res : modifie L en y inserant des �l�ments de sorte qu'elle soit une Liste Intervalle
+ // Complexit� : ????
+ while ( L->succ != NULL) {
+ if (L->succ->info - L->info != 1) {
+ insererApresLSC(L,L,L->info+1);
+ }
+ L=L->succ;
+ }
+ return;
+}
+
+ListeSC intersectionListesIntervalles(ListeSC l1, ListeSC l2){
+ // Donn�e : l1 et l2 2 listes intervalles
+ // Res : Renvoie l'intersection de l1 et l2; les �l�ments de la liste r�sultat sont recopi�s
+ // Complexit� : ordre O(N) une premiere partie au moins inferieure a la somme
+ // de la longueur des listes, plus un appel lineaire a consListeIntervalle2
+ assert(estListeIntervalle(l1));
+ assert(estListeIntervalle(l2));
+ while (l1 != NULL && l2 != NULL && l1->info != l2->info){
+ if (l1->info<l2->info){
+ l1= l1->succ;
+ }
+ else {
+ l2=l2->succ;
+ }
+ }
+ int p= l1->info;
+ int l =0;
+ while ( l1 != NULL && l2 != NULL && l1->info == l2->info){
+ l1=l1->succ;
+ l2=l2->succ;
+ l++;
+ }
+ return consListeIntervalle2(l,p);
+}
+
+void plusLgSsLiInterv(ListeSC &L){
+ // Donn�e : L liste
+ // Res : L est modifiee, elle est la plus longue sous-liste intervalle de la liste en entr�e
+ // Complexit� : ????
+ // ListeSC ret = L;
+ // ListeSC ancien = NULL;
+ // int lenght = 0;
+ // while ( ret->succ != NULL){
+ // if (ret->succ->info - ret->info != 1){
+ // lenght=0;
+ // ret=ret->succ;
+ // }
+ // else {
+ // ancien
+ // }
+ // }
+}
diff --git a/sem_3/algo/TP3/fichierTP3.h b/sem_3/algo/TP3/fichierTP3.h
new file mode 100644
index 0000000..17cf091
--- /dev/null
+++ b/sem_3/algo/TP3/fichierTP3.h
@@ -0,0 +1,43 @@
+
+#ifndef FicTP3_H
+#define FicTP3_H
+
+
+bool estTrieeLSC(ListeSC L);
+ // Res : Renvoie true si L est une ListeSC triée, false sinon
+
+bool estListeIntervalle(ListeSC L);
+ // Res : renvoie true si L est une Liste intervalle, renvoie false sinon
+
+ListeSC consListeIntervalle1(int l, int p);
+ // Donnée : l>0
+ // Res : renvoie une liste intervalle de longueur l et dont le premier élément a pour valeur p
+
+ListeSC consListeIntervalle2(int l, int p);
+ // Donnée : l>0
+ // Res : renvoie une liste intervalle de longueur l et dont le premier élément a pour valeur p
+
+ListeSC consListeIntervalle3(int l, int p);
+ // Donnée : l>0
+ // Res : renvoie une liste intervalle de longueur l et dont le premier élément a pour valeur p
+
+
+void transfListeIntervalle(ListeSC L);
+ // Donnée : L est une liste triée non vide
+ // Res : modifie L en y inserant des éléments de sorte qu'elle soit une Liste Intervalle
+
+ListeSC intersectionListesIntervalles(ListeSC l1, ListeSC l2);
+ // Donnée : l1 et l2 2 listes intervalles
+ // Res : Renvoie l'intersection de l1 et l2; les éléments de la liste résultat sont recopiés
+
+
+void plusLgSsLiInterv(ListeSC &L);
+ // Donnée : L liste
+ // Res : L est modifiee, elle est la lus longue sous-liste intervalle de la liste en entrée
+
+
+#endif
+
+
+
+
diff --git a/sem_3/algo/TP3/mainTP3.cpp b/sem_3/algo/TP3/mainTP3.cpp
new file mode 100644
index 0000000..a0fb341
--- /dev/null
+++ b/sem_3/algo/TP3/mainTP3.cpp
@@ -0,0 +1,84 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "progListeSC.h"
+#include "fichierTP3.h"
+
+using namespace std;
+
+
+int main(int argc, char *argv[]){
+ ListeSC l1,l2,l3;
+ int q, lg, prem;
+ clock_t t1,t2,t3, t4;
+
+ cout << "Numero de la question traitee (1/2/3/4/5/6) ? ";
+ cin >> q ;
+ switch (q){
+ case 1 :
+ l1=lireLSC();
+ if (estListeIntervalle(l1))
+ cout << "Cette liste est une liste intervalle \n";
+ else
+ cout << "Cette liste n'est pas une liste intervalle \n";
+ break;
+
+ case 2 :
+ cout << "Donnez 2 entiers strictement positifs (longueur et premier element de la liste intervalle) : ";
+ cin >> lg >> prem;
+ l1=consListeIntervalle1(lg,prem);
+ afficherLSC(l1);
+ l2=consListeIntervalle2(lg,prem);
+ afficherLSC(l2);
+ l3=consListeIntervalle3(lg,prem);
+ afficherLSC(l3);
+ break;
+ case 3 :
+ cout << "Donnez 2 entiers strictement positifs (longueur et premier element de la liste intervalle) : ";
+ cin >> lg >> prem;
+ t1=clock();
+ l1=consListeIntervalle1(lg,prem);
+ t2=clock();
+ l2=consListeIntervalle2(lg,prem);
+ t3=clock();
+ l3=consListeIntervalle3(lg,prem);
+ t4=clock();
+
+ cout << " Construction d'une Liste de taille " << lg
+ << "\n version 1 " <<(double) (t2-t1)/CLOCKS_PER_SEC
+ << " sec\n version 2 " <<(double) (t3-t2)/CLOCKS_PER_SEC
+ << " sec\n version 3 "<<(double) (t4-t3)/CLOCKS_PER_SEC<< " sec\n";
+ break;
+ case 4 : // Transformation d'une liste triee en liste Intervalle
+ cout << "Entrez une Liste Triee : ";
+ l1=lireLSC();
+ transfListeIntervalle(l1);
+ cout << "Liste Intervalle construite ";
+ afficherLSC(l1);
+ break;
+ case 5 : // intersection de 2 listes intervalle
+ cout << "Liste intervalle : ";
+ l1=lireLSC();
+ cout << "Liste intervalle : ";
+ l2=lireLSC();
+ l3=intersectionListesIntervalles(l1,l2);
+ cout << "Intersection : \n";
+ afficherLSC(l3);
+ break;
+ case 6 :
+ cout << "Entrez une Liste : ";
+ l1=lireLSC();
+ plusLgSsLiInterv(l1);
+ cout << "Plus longue sousListe Intervalle : ";
+ afficherLSC(l1);
+ }
+ return 0;
+}
+
+
+
+
+
diff --git a/sem_3/algo/TP3/progListeSC.cpp b/sem_3/algo/TP3/progListeSC.cpp
new file mode 100644
index 0000000..40efb3e
--- /dev/null
+++ b/sem_3/algo/TP3/progListeSC.cpp
@@ -0,0 +1,105 @@
+// progListeSC.c
+#include <iostream>
+#include <fstream>
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "progListeSC.h"
+
+using namespace std;
+
+
+int estVideLSC(ListeSC l)
+{ return (l==NULL);}
+
+ListeSC creerLSC(int val, ListeSC succ){
+ ListeSC l = new CelluleSC;
+ l->info=val;
+ l->succ=succ;
+ return l;}
+
+void insererDebutLSC(ListeSC &p, int val){
+ p=creerLSC(val,p);
+ return;}
+
+void insererApresLSC(ListeSC &l, ListeSC p, int val){
+ assert((l)!=NULL); assert(p!=NULL);
+ (p->succ)=creerLSC(val,(p->succ));
+ return;}
+
+void insererFinLSC(ListeSC &p, int val){
+ if (p==NULL)
+ p=creerLSC(val,NULL);
+ else
+ insererFinLSC(p->succ,val);
+ return;
+}
+
+ListeSC predecesseurLSC(ListeSC L, ListeSC P){
+ assert(L!=NULL);
+ assert(P!=NULL);
+
+ if (L->succ==P){return L;}
+ else {return predecesseurLSC(L->succ,P);}
+}
+
+void supprimerLSC(ListeSC &L, ListeSC P){
+ assert(L!=NULL);
+ assert(P!=NULL);
+
+ if (L==P){L = L->succ;}
+ else {
+ predecesseurLSC(L,P)->succ = P->succ;
+ }
+ delete P;
+ return;}
+
+void supprimerDebutLSC(ListeSC &L){
+ ListeSC P;
+ assert(L!=NULL);
+
+ P=L;
+ L=L->succ;
+ delete P;
+
+ return;}
+
+
+void supprimerFinLSC(ListeSC &L){
+ assert(L!=NULL);
+
+ if (L->succ==NULL){
+ delete L;
+ L=NULL;}
+ else {
+ ListeSC P=L,Q;
+ while ((P->succ)->succ!=NULL){
+ P=P->succ;}
+ Q=P->succ;
+ P->succ=NULL;
+ delete Q;}
+ return;}
+
+
+
+void afficherLSC(ListeSC l){
+ cout << "ListeSC : ";
+ while (! estVideLSC(l)){
+ cout << l->info << " ";
+ l=l->succ;}
+ cout << endl;
+ return;}
+
+ListeSC lireLSC(){
+ ListeSC l;
+ int i;
+ cout << "Entrez les éléments d'une liste d'entiers (0 pour finir)\n";
+ l=NULL;
+ cin >> i;
+ while (i!=0) {
+ insererFinLSC(l,i);
+ cin >> i;
+ }
+ return l;
+}
+
diff --git a/sem_3/algo/TP3/progListeSC.h b/sem_3/algo/TP3/progListeSC.h
new file mode 100644
index 0000000..e35deed
--- /dev/null
+++ b/sem_3/algo/TP3/progListeSC.h
@@ -0,0 +1,56 @@
+
+//* ListeSC.h *
+// Implantation du type Liste d'entiers Simplement Chainée
+
+#ifndef LISTESC_H
+#define LISTESC_H
+
+typedef struct cellule {
+ int info;
+ struct cellule *succ;} CelluleSC;
+
+typedef CelluleSC *ListeSC;
+
+
+// Res : renvoie 1 si L est la liste vide, renvoie 1 sinon
+int estVideLSC(ListeSC L );
+
+// Res : renvoie une ListeSC dont le premier élément est e et la suite de la liste L
+ListeSC creerLSC(int e, ListeSC L);
+
+// Res : modifie la ListeSC L en y insérant en première place l'élément e
+void insererDebutLSC(ListeSC &L, int e);
+
+// Donnée : L est une ListeSC non vide, P l'adresse d'un élément de L, e un entier
+// Res : insère dans la liste L après l'élément d'adresse P 1 élément de valeur e
+void insererApresLSC(ListeSC &L, ListeSC P, int e);
+
+// Res : modifie la listeSC L en y insérant en dernière place l'élément e
+void insererFinLSC(ListeSC &L, int e);
+
+// Donnée : L est une ListeSC non Vide ;
+// P est un pointeur non vide vers une cellule de la liste L
+// L != P
+// Res : renvoie l'adresse de la cellule précédant dans L celle pointée pas P
+ListeSC predecesseurLSC(ListeSC L, ListeSC P);
+
+// Donnée : L est une ListeSC non Vide ;
+// P est un pointeur non vide vers une cellule de la liste L
+// Res : modifie L en supprimant de L la cellule pointée pas P
+void supprimerLSC(ListeSC &L, ListeSC P);
+
+// Donnée : L est une ListeSC non Vide ;
+// Res : modifie L en supprimant son dernier élément
+void supprimerFinLSC(ListeSC &L);
+
+// Donnée : L est une ListeSC non Vide ;
+// Res : modifie L en supprimant son premier élément
+void supprimerDebutLSC(ListeSC &L);
+
+// Res : affiche la liste L
+void afficherLSC(ListeSC L);
+
+// Res : renvoie la ListeSC des éléments saisis au clavier
+ListeSC lireLSC();
+
+#endif //LISTESC_H
diff --git a/sem_3/algo/TP3/tp3 b/sem_3/algo/TP3/tp3
new file mode 100644
index 0000000..527995d
--- /dev/null
+++ b/sem_3/algo/TP3/tp3
Binary files differ
diff --git a/sem_3/algo/TP4/fichierTP4.cpp b/sem_3/algo/TP4/fichierTP4.cpp
new file mode 100644
index 0000000..9b90ad7
--- /dev/null
+++ b/sem_3/algo/TP4/fichierTP4.cpp
@@ -0,0 +1,194 @@
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <string>
+//#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "progListeSC.h"
+using namespace std;
+
+typedef struct noeud {
+ int info;
+ struct noeud *sag;
+ struct noeud *sad;} NoeudSC;
+typedef NoeudSC *ArbreBin;
+
+ArbreBin creerArbreBin(int e, ArbreBin G, ArbreBin D){
+ /* Res : renvoie une ArbreBin dont la racine vaut e, le sag G et le sad D */
+ ArbreBin A = new NoeudSC;
+ A->info=e; A->sag=G; A->sad=D;
+ return A;}
+
+void codageABdot(ofst ream& fichier, ArbreBin A){
+ if (A != NULL){
+ fichier << (long) A << " [label=\"" << A->info << "\" ] ;\n";
+ if (A->sag != NULL) {
+ fichier << (long)A << " -> " << (long)(A->sag) << " [color=\"red\",label=\"g\" ] ;\n";
+ codageABdot(fichier,A->sag);}
+ if (A->sad != NULL) {
+ fichier << (long)A << " -> " << (long)(A->sad) << " [color=\"blue\",label=\"d\" ] ;\n";
+ codageABdot(fichier,A->sad);}
+ }
+ return;}
+
+
+void dessinerAB(ArbreBin A, const char * nomFic, string titre){
+ ofstream f(nomFic);
+ if (!f.is_open()){
+ cout << "Impossible d'ouvrir le fichier en �criture !" << endl;
+ }
+ else {
+ f<< "digraph G { label = \""<< titre << "\" \n";
+ codageABdot(f,A);
+ f << "\n }\n" ;
+ f.close();}
+ return;}
+
+
+/* A COMPLETER */
+int sommeNoeuds(ArbreBin A){
+ /* renvoie la somme des etiquettes des noeuds de l arbre binaire A */
+ /* A COMPLETER */
+ return A == NULL ? 0: A->info+sommeNoeuds(A->sag)+sommeNoeuds(A->sad);
+}
+
+int profMinFeuille(ArbreBin A){
+ /* renvoie la profondeur minimum des feuilles de l'arbre A ; A est non vide */
+ assert(A!=NULL);
+ /* A COMPLETER */
+ return A==NULL ? 0: A->info + ( profMinFeuille(A->sag)<= profMinFeuille(A->sad)) ? profMinFeuille(A->sag):profMinFeuille(A->sad));
+}
+
+ListeSC parcoursInfixe(ArbreBin A){
+ /* renvoie la liste composee des etiquettes des noeuds de l'arbre A ordonn�e
+ selon l'ordre infixe */
+ /* A COMPLETER */
+ return A==NULL ? NULL: concatLSC(concatLSC(parcoursInfixe((A->sag), A->info),A->sad));
+}
+
+void effeuiller(ArbreBin& A){
+ /* modifie l'arbre A en supprimant ses feuilles */
+ /* A COMPLETER */
+ return;}
+
+void tailler(ArbreBin& A, int p){
+ /* modifie l'arbre A, en supprimant ses noeuds de profondeur au moins p ; p est un entier positif ou nul */
+ /* A COMPLETER */
+ return;}
+
+void tronconner(ArbreBin& A){
+ /* modifie l'arbre A, en supprimant les noeuds dont un seul sous-arbre est vide */
+ /* A COMPLETER */
+ return;}
+
+ArbreBin genereAB(int n){
+ /* A COMPLETER */
+ return NULL;}
+
+
+bool estParfait(ArbreBin A){
+ // V�rifie si A est un arbre binaire parfait
+ return true;
+}
+
+/*****************************************************************************/
+/* */
+/* main */
+/* */
+/*****************************************************************************/
+int main(int argc, char *argv[]){
+ int q,i;
+ ArbreBin A,B,C;
+ ostringstream stre;
+ ListeSC L;
+ string chaine;
+ A=creerArbreBin(8,
+ creerArbreBin(7,
+ creerArbreBin(4,NULL,NULL),
+ creerArbreBin(9,NULL,NULL)),
+ creerArbreBin(3,NULL,NULL));
+
+ B=creerArbreBin(8,
+ creerArbreBin(2,
+ creerArbreBin(4,NULL,NULL),
+ creerArbreBin(9,
+ NULL,
+ creerArbreBin(1,
+ NULL,
+ creerArbreBin(7,
+ creerArbreBin(11,NULL,NULL),
+ creerArbreBin(5,
+ NULL,
+ NULL))))),
+ creerArbreBin(3,
+ creerArbreBin(12,
+ creerArbreBin(6,NULL,NULL),
+ NULL),
+ creerArbreBin(9,NULL,NULL)));
+ C=NULL;
+ C= creerArbreBin(1,C,C);
+ cout << "Numero de la question traitee (1/2/3/4/5/6/7) ? ";
+ cin >> q;
+ switch (q){
+ case 1 :
+ dessinerAB(A,"arbre.dot","Arbre Bin");
+ cout << "Somme des noeuds de l'arbre :"<< sommeNoeuds(A) << endl;
+ cout << "Profondeur minimum des feuilles de l'arbre : " << profMinFeuille(A) << endl;
+ system("dotty arbre.dot");
+ break;
+ case 2 :
+ dessinerAB(A,"arbre.dot","Arbre Bin");
+ L=parcoursInfixe(A);
+ cout << "Liste des noeuds de l'arbre en ordre infixe : ";
+ afficherLSC(L);
+ system("dotty arbre.dot");
+ break;
+ case 3 :
+ dessinerAB(B,"arbre.dot","Arbre Bin");
+ system("dotty arbre.dot&");
+ effeuiller(B);
+ dessinerAB(B,"arbre2.dot","Arbre Bin effeuille");
+ system("dotty arbre2.dot");
+ break;
+ case 4 :
+ dessinerAB(B,"arbre.dot","Arbre Bin");
+ system("dotty arbre.dot&");
+ cout << " Donner une profondeur (entier positif) :";
+ cin >> i;
+ tailler(B,i);
+ stre << i;
+ chaine = stre.str();
+ chaine = "Arbre Bin taille a la profondeur " + chaine;
+ dessinerAB(B,"arbre2.dot",chaine);
+ system("dotty arbre2.dot&");
+ break;
+ case 5 :
+ cout << " Donner un entier positif :";
+ cin >> i;
+ stre << i;
+ chaine = "Arbre Bin " + stre.str();
+ dessinerAB(genereAB(i),"arbre.dot", "Arbre Bin " + stre.str());
+ system("dotty arbre.dot&");
+ break;
+ case 6 :
+ dessinerAB(B,"arbre.dot","Arbre Bin");
+ system("dotty arbre.dot&");
+ tronconner(B);
+ dessinerAB(B,"arbre2.dot","Arbre tronconne");
+ system("dotty arbre2.dot&");
+ break;
+ case 7 :
+ A=genereAB(7);
+ chaine= estParfait(A) ? "Arbre parfait" : "Arbre non parfait";
+ dessinerAB(A,"arbre.dot",chaine);
+ system("dotty arbre.dot");
+
+ B=genereAB(8);
+ chaine= estParfait(B) ? "Arbre parfait" : "Arbre non parfait";
+ dessinerAB(B,"arbre2.dot",chaine);
+ system("dotty arbre2.dot&");
+ break;
+ }
+ return 0;
+}
diff --git a/sem_3/algo/TP4/progListeSC.cpp b/sem_3/algo/TP4/progListeSC.cpp
new file mode 100644
index 0000000..0a88c29
--- /dev/null
+++ b/sem_3/algo/TP4/progListeSC.cpp
@@ -0,0 +1,114 @@
+/**************************** progListeSC.c **********************************/
+
+#include <iostream>
+#include <fstream>
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "progListeSC.h"
+
+using namespace std;
+
+
+bool estVideLSC(ListeSC l)
+{ return (l==NULL);}
+
+ListeSC creerLSC(int val, ListeSC succ){
+ ListeSC l = new CelluleSC;
+ l->info=val;
+ l->succ=succ;
+ return l;}
+
+void insererDebutLSC(ListeSC& p, int val){
+ p=creerLSC(val,p);
+}
+
+void insererApresLSC(ListeSC& l, ListeSC p, int val){
+ assert((l)!=NULL); assert(p!=NULL);
+ (p->succ)=creerLSC(val,(p->succ));
+}
+
+void insererFinLSC(ListeSC& p, int val){
+ if ((p)==NULL)
+ p=creerLSC(val,NULL);
+ else
+ insererFinLSC(p->succ,val);
+}
+
+ListeSC predecesseurLSC(ListeSC L, ListeSC P){
+ assert(L!=NULL);
+ assert(P!=NULL);
+
+ if (L->succ==P){return L;}
+ else {return predecesseurLSC(L->succ,P);}
+}
+
+void supprimerLSC(ListeSC& L, ListeSC P){
+ assert(L!=NULL);
+ assert(P!=NULL);
+
+ if (L==P){L=L->succ;}
+ else {
+ predecesseurLSC(L,P)->succ=P->succ;
+ }
+ delete(P);
+}
+
+void supprimerDebutLSC(ListeSC& L){
+ ListeSC P;
+
+ assert(L!=NULL);
+
+
+ P=L;
+ L=L->succ;
+ delete(P);
+}
+
+
+void supprimerFinLSC(ListeSC& L){
+ assert(L!=NULL);
+
+ if (L->succ==NULL){
+ delete(L);
+ L=NULL;}
+ else {
+ ListeSC P=L,Q;
+ while ((P->succ)->succ!=NULL){
+ P=P->succ;}
+ Q=P->succ;
+ P->succ=NULL;
+ delete(Q);}
+}
+
+
+
+void afficherLSC(ListeSC l){
+ cout<< "ListeSC : ";
+ while (! estVideLSC(l)){
+ cout << " " << l->info <<" ";
+ l=l->succ;}
+ cout << endl;
+}
+
+ListeSC lireLSC(){
+ ListeSC l;
+ int i;
+ cout << "Entrez les éléments d'une liste d'entiers (0 pour finir)\n";
+ l=NULL;
+ cin >> i;
+ while (i!=0) {
+ insererFinLSC(l,i);
+ cin >>i ;
+ }
+ return l;
+}
+
+ListeSC concatLSC(ListeSC L1, ListeSC L2){
+ ListeSC P;
+ if (L1==NULL) return L2;
+ else {
+ P= L1;
+ while (P->succ != NULL) P=P->succ;
+ P->succ = L2;
+ return L1;}}
diff --git a/sem_3/algo/TP4/progListeSC.h b/sem_3/algo/TP4/progListeSC.h
new file mode 100644
index 0000000..f60d8f4
--- /dev/null
+++ b/sem_3/algo/TP4/progListeSC.h
@@ -0,0 +1,59 @@
+
+/**************************** ListeSC.h **************************************/
+/* Implantation du type Liste d'entiers Simplement Chainée */
+
+#ifndef LISTESC_H
+#define LISTESC_H
+
+typedef struct cellule {
+ int info;
+ struct cellule *succ;} CelluleSC;
+
+typedef CelluleSC *ListeSC;
+
+
+bool estVideLSC(ListeSC L );
+/* Res : renvoie 1 si L est la liste vide, renvoie 1 sinon */
+
+ListeSC creerLSC(int e, ListeSC L);
+/* Res : renvoie une ListeSC dont le premier élément est e et la suite de la liste L */
+
+void insererDebutLSC(ListeSC & L, int e);
+/* Res : modifie la ListeSC L en y insérant en premiere place l'élément e */
+
+void insererApresLSC(ListeSC & L, ListeSC P, int e);
+/* Donnée : L est une ListeSC non vide, P l'adresse d'un élément de L, e un entier */
+/* Res : insère dans la liste L après l'élément d'adresse P 1 élément de valeur e */
+
+void insererFinLSC(ListeSC & L, int e);
+/* Res : modifie la listeSC L en y insérant en dernière place l'élément e */
+
+ListeSC predecesseurLSC(ListeSC L, ListeSC P);
+/* Donnée : L est une ListeSC non Vide ; */
+/* P est un pointeur non vide vers une cellule de la liste L */
+/* L != P */
+/* Res : renvoie l'adresse de la cellule précédant dans L celle pointée pas P */
+
+void supprimerLSC(ListeSC & L, ListeSC P);
+/* Donnée : L est une ListeSC non Vide ; */
+/* P est un pointeur non vide vers une cellule de la liste L */
+/* Res : modifie L en supprimant de L la cellule pointée pas P */
+
+void supprimerFinLSC(ListeSC & L);
+/* Donnée : L est une ListeSC non Vide ; */
+/* Res : modifie L en supprimant son dernier élément */
+
+void supprimerDebutLSC(ListeSC & L);
+/* Donnée : L est une ListeSC non Vide ; */
+/* Res : modifie L en supprimant son premier élément */
+
+void afficherLSC(ListeSC L);
+/* Res : affiche la liste L */
+
+ListeSC lireLSC();
+/* Res : renvoie la ListeSC des éléments saisis au clavier */
+
+ListeSC concatLSC(ListeSC L1, ListeSC L2);
+/* Res : renvoie la ListeSC, concaténation des listes L1 et L2, en modifiant le chaînage de L1*/
+
+#endif /*LISTESC_H*/
diff --git a/sem_3/algo/TP4/tpIN301_4.pdf b/sem_3/algo/TP4/tpIN301_4.pdf
new file mode 100644
index 0000000..fde8e51
--- /dev/null
+++ b/sem_3/algo/TP4/tpIN301_4.pdf
Binary files differ
diff --git a/sem_3/algo/tp1-done/PROG_TP1/mainTP1.cpp b/sem_3/algo/tp1-done/PROG_TP1/mainTP1.cpp
new file mode 100644
index 0000000..18d30ab
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/mainTP1.cpp
@@ -0,0 +1,65 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include "outilsTab.h"
+
+using namespace std;
+
+
+int main(int argc, char ** argv)
+{
+ int* Tab;
+ struct triplet res;
+ int sm, taille, q;
+ clock_t t1, t2;
+
+ srand(time(NULL));
+ printf("Numero de la question traitee (1/2/3/4) ? ");
+ scanf("%d",&q);
+ switch (q){
+ case 1 :
+ taille=1000;
+ Tab=genTab(taille);
+ t1=clock(); sm=ssTabSomMax1(Tab,taille); t2=clock();
+ cout << "\n Somme Max1 : " << sm << " tps : " << (double) (t2-t1)/ (double) CLOCKS_PER_SEC << endl;
+ t1=clock(); sm=ssTabSomMax2(Tab,taille); t2=clock();
+ cout << "\n Somme Max2 : " << sm << " tps : " << (double) (t2-t1)/ (double) CLOCKS_PER_SEC << endl;
+ t1=clock(); sm=ssTabSomMax3(Tab,taille); t2=clock();
+ cout << "\n Somme Max3 : " << sm << " tps : " << (double) (t2-t1)/ (double) CLOCKS_PER_SEC << endl;
+ t1=clock(); sm=ssTabSomMax4(Tab,taille); t2=clock();
+ cout << "\n Somme Max4 : " << sm << " tps : " << (double) (t2-t1)/ (double) CLOCKS_PER_SEC << endl;
+
+ break;
+ case 2 :
+ fichierTemps("sm1.dat", 1000, 100, ssTabSomMax1);
+ fichierTemps("sm2.dat", 1000, 100, ssTabSomMax2);
+ fichierTemps("sm3.dat", 1000, 100, ssTabSomMax3);
+ fichierTemps("sm4.dat", 1000, 100, ssTabSomMax4);
+ system("gnuplot trace1.gnu");
+ fichierTemps("sm2.dat", 20000, 1000, ssTabSomMax2);
+ fichierTemps("sm3.dat", 20000, 1000, ssTabSomMax3);
+ fichierTemps("sm4.dat", 20000, 1000, ssTabSomMax4);
+ system("gnuplot trace2.gnu");
+ fichierTemps("sm3.dat", 1000000, 100000, ssTabSomMax3);
+ fichierTemps("sm4.dat", 10000000, 1000000, ssTabSomMax4);
+ system("gnuplot trace3.gnu");
+ break;
+ case 3 :
+ Tab=genTab(20);
+ afficheTab(Tab,20);
+ res=indSsTabSomMax(Tab,20);
+ cout << "\n somme Max : " << res.somMax << "\n debut souTab : " << res.deb << "\n fin SouTab : " << res.fin << endl;
+ break;
+ case 4 :
+ Tab=genTab(20);
+ afficheTab(Tab,20);
+ rangerElemNeg(Tab,20);
+ afficheTab(Tab,20);
+ break;
+ }
+ return 0;
+}
+
diff --git a/sem_3/algo/tp1-done/PROG_TP1/outilsTab.cpp b/sem_3/algo/tp1-done/PROG_TP1/outilsTab.cpp
new file mode 100644
index 0000000..6643b13
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/outilsTab.cpp
@@ -0,0 +1,131 @@
+#include <iostream>
+#include <fstream>
+
+#include <stdlib.h> // pour rand
+#include <assert.h>
+#include "outilsTab.h"
+using namespace std;
+
+int* genTab(int n){
+ int* t; int i;
+ t=new int[n];
+ for (i=0;i<n;i++) t[i]=-100+rand()%200;
+ return t;
+}
+
+void afficheTab(int* T, int taille){
+ int i;
+ cout << "\n[ ";
+ for (i=0;i<taille;i++) cout << T[i] << " ";
+ cout << "]\n";
+ }
+
+void fichierTemps(const char* nomFic, int tMaxTab, int pas, int (*f)(int*, int)){
+ int taille;
+ int* Tab;
+ clock_t t1, t2;
+ ofstream fichier(nomFic,ios::out);
+
+ if (fichier)
+ {
+ for (taille=pas; taille<=tMaxTab; taille=taille+pas){
+ Tab=genTab(taille);
+ t1=clock();
+ (*f)(Tab,taille);
+ t2=clock();
+ fichier << taille <<" "<< (double)(t2-t1)/ CLOCKS_PER_SEC << endl;
+ }
+ fichier.close();
+ }
+ else cerr << " Problème ouverture fichier"<< endl;
+
+ return ;
+}
+
+int ssTabSomMax1(int* T, int taille){
+ int somMax, som, i, j, k;
+ somMax=0;
+ for (i=0;i<taille;i++){
+ for (j=i; j<taille; j++){
+ som=0;
+ for (k=i; k<=j; k++) {
+ som = som + T[k];
+ }
+ if (som > somMax) somMax = som;
+ }
+ }
+ return somMax;
+}
+
+int ssTabSomMax2(int* T, int taille){
+ int somMax, som, i, j;
+ somMax=0;
+ for (i=0;i<taille;i++){
+ som=0;
+ for (j=i; j<taille; j++){
+ som = som + T[j];
+ if (som > somMax) somMax = som;
+ }
+ }
+ return somMax;
+}
+
+int sTSM3(int* T,int g,int d){
+ int m, som, i, smgd, smdg, smm, smg, smd;
+ assert(g<=d);
+ if (g==d){
+ if (T[g]>0) return T[g]; else return 0;
+ }
+ else {
+ m = (d+g)/2;
+ smg=sTSM3(T,g,m);
+ smd=sTSM3(T,m+1,d);
+ smgd=0; som=0;
+ for (i=m;i>=g;i--){
+ som=som+T[i];
+ if (som > smgd) smgd=som;
+ }
+ smdg=0; som=0;
+ for(i=m+1;i<=d;i++){
+ som=som+T[i];
+ if (som>smdg) smdg=som;
+ }
+ smm=smgd+smdg;
+ if ((smg>=smd) && (smg>=smm)) return smg;
+ else {
+ if (smd>=smm) return smd;
+ else return smm;
+ }
+ }
+}
+
+int ssTabSomMax3(int* T, int taille){
+ return sTSM3(T,0,taille-1);
+}
+
+int ssTabSomMax4(int* T, int taille){
+ int ancienplusgrand = 0;
+ int somme =0;
+ for (int i =0; i < taille; i ++) {
+ somme+=T[i];
+ if (somme < 0 ){
+ somme= 0;
+ }
+ ancienplusgrand= ancienplusgrand> somme ? ancienplusgrand : somme;
+ }
+ return ancienplusgrand;
+}
+
+struct triplet indSsTabSomMax(int* T, int taille){
+/* A COMPLETER */
+ struct triplet res;
+ res.somMax=0; res.deb=0; res.fin=0;
+ return res;
+}
+
+
+void rangerElemNeg(int* T,int taille){
+/* A COMPLETER */
+ return;
+
+}
diff --git a/sem_3/algo/tp1-done/PROG_TP1/outilsTab.h b/sem_3/algo/tp1-done/PROG_TP1/outilsTab.h
new file mode 100644
index 0000000..9576c28
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/outilsTab.h
@@ -0,0 +1,74 @@
+#ifndef OUTILSTAB_H_INCLUDED
+#define OUTILSTAB_H_INCLUDED
+
+struct triplet {
+ int deb, fin, somMax;} ;
+
+int* genTab(int t);
+// Renvoie un tableau de taille t, dont les éléments sont des entiers aléatoires compris entre -100 et 100
+
+
+void afficheTab(int* T, int t);
+// Affiche les éléments de T, tableau d'entiers de taille t
+
+
+void fichierTemps(const char* nomFic, int tMaxTab, int pasTaille, int (*fssTabSomMax)(int*, int));
+// Données nomFic une chaîne de caractères, tMaxTab et pasTaille 2 entiers positifs pasTaille < tMaxTab
+// fssTabSomMax nom d'une fonction dont les données sont 1 tableau d'entiers et la taille de ce tableau et renvoyant 1 entier
+// Resultat : crée un fichier de nom nomfic et pour chaque taille comprise entre pasTaille et tMaxTab (avec un pas de pasTaille),
+// génère un tableau de cette taille
+// execute la fonction ssTabSomMax sur ce tableau
+// ajoute au fichier de nom nomfic la taille du tableau et le temps d'execution de ssTabSomMax
+
+
+int ssTabSomMax1(int* Tab, int n);
+/*
+ Données : Tab un tableau d'entiers de taille n
+ Resultat : renvoie la somme max des sous-tableaux de tab, algo de complexite O(n^3)
+*/
+
+int ssTabSomMax2(int*, int);
+
+/*
+ Données : Tab un tableau d'entiers de taille n
+ Resultat : renvoie la somme max des sous-tableaux de tab, algo de complexite O(n^2)
+*/
+
+int ssTabSomMax3(int* Tab, int n);
+/*
+ Données : Tab un tableau d'entiers de taille n
+ Resultat : renvoie la somme max des sous-tableaux de tab, algo de complexite O(n log n)
+*/
+
+int ssTabSomMax4(int* Tab, int n);
+/*
+ Données : Tab un tableau d'entiers de taille n
+ Resultat : renvoie la somme max des sous-tableaux de tab, algo de complexite O(n)
+ FONCTION A COMPLETER
+*/
+
+struct triplet indSsTabSomMax(int* Tab,int n);
+/*
+ Données : Tab un tableau d'entiers de taille n
+ Resultat : renvoie une structure contenant
+ la somme max des sous-tableaux de tab,
+ l'indice de début d'un sous-tableau de somme max
+ l'indice de fin d'un sous-tableau de somme max
+ algo de complexite O(n)
+ FONCTION A COMPLETER
+
+*/
+
+
+void rangerElemNeg(int* Tab,int n);
+/*
+ Données : Tab un tableau d'entiers de taille n
+ Resultat : modifie le tableau Tab de sorte que tous les éléments négatifs soient placés avant tous les éléments positifs
+ algo de complexite O(n)
+ FONCTION A COMPLETER
+
+*/
+
+
+
+#endif /* OUTILSTAB_H_INCLUDED */
diff --git a/sem_3/algo/tp1-done/PROG_TP1/sm1.dat b/sem_3/algo/tp1-done/PROG_TP1/sm1.dat
new file mode 100644
index 0000000..6fe54af
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/sm1.dat
@@ -0,0 +1,10 @@
+100 0
+200 0
+300 0.03125
+400 0.03125
+500 0.046875
+600 0.09375
+700 0.15625
+800 0.21875
+900 0.3125
+1000 0.4375
diff --git a/sem_3/algo/tp1-done/PROG_TP1/sm2.dat b/sem_3/algo/tp1-done/PROG_TP1/sm2.dat
new file mode 100644
index 0000000..79cda5f
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/sm2.dat
@@ -0,0 +1,7 @@
+1000 0
+2000 0
+3000 0.015625
+4000 0.015625
+5000 0.03125
+6000 0.046875
+7000 0.0625
diff --git a/sem_3/algo/tp1-done/PROG_TP1/sm3.dat b/sem_3/algo/tp1-done/PROG_TP1/sm3.dat
new file mode 100644
index 0000000..811f1f9
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/sm3.dat
@@ -0,0 +1,10 @@
+100 0
+200 0
+300 0
+400 0
+500 0
+600 0
+700 0
+800 0
+900 0
+1000 0
diff --git a/sem_3/algo/tp1-done/PROG_TP1/sm4.dat b/sem_3/algo/tp1-done/PROG_TP1/sm4.dat
new file mode 100644
index 0000000..811f1f9
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/sm4.dat
@@ -0,0 +1,10 @@
+100 0
+200 0
+300 0
+400 0
+500 0
+600 0
+700 0
+800 0
+900 0
+1000 0
diff --git a/sem_3/algo/tp1-done/PROG_TP1/tp1 b/sem_3/algo/tp1-done/PROG_TP1/tp1
new file mode 100644
index 0000000..8cce618
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/tp1
Binary files differ
diff --git a/sem_3/algo/tp1-done/PROG_TP1/trace1.gnu b/sem_3/algo/tp1-done/PROG_TP1/trace1.gnu
new file mode 100644
index 0000000..a7f446a
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/trace1.gnu
@@ -0,0 +1,5 @@
+set ylabel "secondes"
+plot "sm4.dat" with lines, "sm3.dat" with lines, "sm2.dat" with lines, "sm1.dat" with lines
+pause -1 "Appuyez sur RETURN pour continuer"
+exit
+
diff --git a/sem_3/algo/tp1-done/PROG_TP1/trace2.gnu b/sem_3/algo/tp1-done/PROG_TP1/trace2.gnu
new file mode 100644
index 0000000..ba4de89
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/trace2.gnu
@@ -0,0 +1,5 @@
+set ylabel "secondes"
+plot "sm4.dat" with lines, "sm3.dat" with lines, "sm2.dat" with lines
+pause -1 "Appuyez sur RETURN pour continuer"
+exit
+
diff --git a/sem_3/algo/tp1-done/PROG_TP1/trace3.gnu b/sem_3/algo/tp1-done/PROG_TP1/trace3.gnu
new file mode 100644
index 0000000..1907656
--- /dev/null
+++ b/sem_3/algo/tp1-done/PROG_TP1/trace3.gnu
@@ -0,0 +1,5 @@
+set ylabel "secondes"
+plot "sm4.dat" with lines, "sm3.dat" with lines
+pause -1 "Appuyez sur RETURN pour continuer"
+exit
+
diff --git a/sem_3/algo/tp1-done/énoncéTP1.pdf b/sem_3/algo/tp1-done/énoncéTP1.pdf
new file mode 100644
index 0000000..bdd788a
--- /dev/null
+++ b/sem_3/algo/tp1-done/énoncéTP1.pdf
Binary files differ
diff --git a/sem_3/algo/tp2/fichierTP2.cpp b/sem_3/algo/tp2/fichierTP2.cpp
new file mode 100644
index 0000000..3a73196
--- /dev/null
+++ b/sem_3/algo/tp2/fichierTP2.cpp
@@ -0,0 +1,214 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "progListeSC.h"
+using namespace std;
+
+// DERNIERLSC ET ESTTRIEELSC
+// Res : Renvoie l'adresse de la derniere cellule de la liste non vide L
+ListeSC dernierLSC(ListeSC L){
+ while ( L->succ != NULL){
+ L=L->succ;
+ }
+ return L;
+}
+
+// Res : Renvoie 1 si L est une ListeSC triee, 0 sinon
+int estTrieeLSC(ListeSC L){
+ while(L->succ != NULL){
+ if (L->info > L->succ->info) {
+ return 0;
+ }
+ L=L->succ;
+ }
+ return 1;
+}
+
+
+// OTERREPETITION
+// Res : Supprime de la ListeSC L tous les elements consecutifs egaux
+// Opere en modifiant le chainage de la ListeSC L
+// version iterative
+void oterRepetitionLSC(ListeSC L){
+ if (L->succ==NULL || L== NULL) return;
+ while ( L->succ != NULL){
+ if (L->info == L->succ->info ) {
+ ListeSC tmp= L->succ;
+ L->succ=L->succ->succ;
+ delete tmp;
+ }
+ if ( L->succ != NULL ) L=L->succ;
+ }
+}
+
+// Res : Supprime de la ListeSC L tous les elements consecutifs egaux
+// Opere en modifiant le chainage de la ListeSC L
+// version recursive
+void oterRepetitionLSCR(ListeSC L){
+ if ( L -> succ == NULL || L== NULL) return;
+ if ( L->succ->info==L->info){
+ ListeSC tmp = L;
+ L->succ=L->succ->succ;
+ delete tmp;
+ }
+ oterRepetitionLSC(L->succ);
+ return;
+}
+
+
+// CONCATENATION DE 2 LISTES
+// Res : Modifie la liste L1 en la concatenant avec la liste l2
+// Opere en modifiant le chainage de la listeSC L1
+// Version utilisant la fonction dernierLSC
+void concatLSC(ListeSC L1,ListeSC L2){
+ ListeSC tmp = dernierLSC(L1);
+ tmp->succ = L2;
+ return;
+}
+
+// Res : Renvoie la ListeSC obtenue par concatenation des ListeSC L1 et L2
+// Opere en recopiant les elements des 2 listeSC L1 et L2
+// complexite : ???
+ListeSC concatLSCCopie(ListeSC L1,ListeSC L2){
+ ListeSC L3=NULL;
+ while ( L1 != NULL) {
+ insererFinLSC(L3, L1->info);
+ L1 = L1->succ;
+ }
+ while (L2 != NULL){
+ insererFinLSC(L3,L2->info);
+ L2=L2->succ;
+ }
+ return L3;
+}
+
+
+int main(int argc, char *argv[]){
+ ListeSC l1,l2,l3;
+ int q;
+
+ cout << "Numero de la question traitee (1/2/3/4/5) ? ";
+ cin >> q;
+ switch (q){
+ case 1 : // Test des operations de base sur les listes
+ l1 = lireLSC();
+
+ // insertion d'un element de valeur 11 en derniere position de la liste l1
+ // en utilisant insererFinLSC
+ // Completez
+ insererFinLSC(l1, 11);
+
+
+ cout << "Insertion de 11 en derniere position "; afficherLSC(l1);
+
+ // insertion d'un element de valeur 22 en 2eme position de la liste l1
+ // en utilisant insererApresLSC
+ // Completez
+ insererApresLSC(l1, l1,22);
+
+
+ cout << "Insertion de 22 en 2eme position ";afficherLSC(l1);
+
+ // insertion d'un element de valeur 33 en 2eme position de la liste l1
+ // sans utiliser insererApresLSC
+ // Completez
+ l1=creerLSC(l1->info, creerLSC(33, l1->succ));
+
+
+ cout << "Insertion de 33 en 2eme position ";afficherLSC(l1);
+
+ // Suppression du 2eme element de la liste en utilisant supprimerLSC
+ // Completez
+ supprimerLSC(l1, l1->succ);
+
+
+ cout << "Suppression du 2eme element "; afficherLSC(l1);
+
+ // Suppression du 2eme element de la liste sans utiliser supprimerLSC
+ // Completez
+ if ( l1->succ!=NULL){
+ ListeSC templist = l1->succ;
+ l1->succ = l1->succ->succ;
+ delete templist;
+ }
+
+ cout << "Suppression du 2eme element "; afficherLSC(l1);
+
+ // Inversion des valeurs des 2 premiers elements
+ // en modifiant les champs info (sans modifier le chainage)
+ // Completez
+ if (l1->succ != NULL){
+ int tmp = l1->succ->info;
+ l1->succ->info=l1->info;
+ l1->info= tmp;
+ }
+
+
+ cout << "Inversion des valeurs des 2 premiers elements " ; afficherLSC(l1);
+
+ // Inversion des 2 premiers elements
+ // en modifiant les champs succ (le chainage)
+ // Completez
+ if ( l1->succ != NULL) {
+ ListeSC templist;
+ templist = l1;
+ l1 = l1->succ;
+ templist->succ = l1->succ;
+ l1->succ= templist;
+ }
+
+
+ cout << "Inversion des 2 premiers elements "; afficherLSC(l1);
+ break;
+
+ case 2 : // Test des fonctions estTrieeLSC et dernierLSC
+ l1 = lireLSC();
+ if (estTrieeLSC(l1)) cout << "Cette liste est triee\n";
+ else cout << "Cette liste n'est pas triee\n";
+ if (l1 != NULL)
+ cout << "La valeur de son dernier element est " << dernierLSC(l1)->info << endl;
+ break;
+
+ case 3: // Test des fonctions oterRepetitionLSC
+ l1 = lireLSC();
+ oterRepetitionLSC(l1);
+ cout << "Liste sans repetition (version iterative) :\n";
+ afficherLSC(l1);
+ l1 = lireLSC();
+ oterRepetitionLSCR(l1);
+ cout << "Liste sans repetition (version recursive) :\n";
+ afficherLSC(l1);
+ break;
+
+ case 4 : // Test de la premiere fonction de concatenation de listes
+ l1 = lireLSC();
+ l2 = lireLSC();
+ concatLSC(l1,l2);
+ cout << "Concatenation des 2 listes (en modifiant le chainage) :\n"; afficherLSC(l1);
+ if ((l1 != NULL) && (l2 != NULL) )
+ cout << "Adresse derniere cellule de l1 : " << (void *) dernierLSC(l1) << ", de l2 : "<< (void *) dernierLSC(l2) << endl;
+ cout << " Ajout de 44 en fin de la liste l1\n";
+ insererFinLSC(l1,44);
+ cout << "Nouvelle valeur de l1:"; afficherLSC(l1); cout << endl;
+ cout << "Nouvelle valeur de l2: "; afficherLSC(l2); cout << endl;
+ break;
+
+ case 5 : // Test des fonctions de concatenation de listes
+ l1 = lireLSC();
+ l2 = lireLSC();
+ l3 = concatLSCCopie(l1,l2);
+ cout << "Concatenation des 2 listes (par recopie des listes) : "; afficherLSC(l3); cout << endl;
+ if ((l1 != NULL) && (l2 != NULL) )
+ cout << "Adresse derniere cellule de l1 : " << (void *) dernierLSC(l1) << " , de l2 : " << (void *) dernierLSC(l2) << ", de l3 : " << (void *) dernierLSC(l3) << endl;
+ cout << " Ajout de 55 en fin de la liste l1\n";
+ insererFinLSC(l1,55);
+ cout << "Nouvelle valeur de l1: "; afficherLSC(l1); cout << endl;
+ cout << "Nouvelle valeur de l2: "; afficherLSC(l2); cout << endl;
+ cout << "Nouvelle valeur de l3: "; afficherLSC(l3); cout << endl;
+ break;
+ }
+ return 0;
+}
diff --git a/sem_3/algo/tp2/prog b/sem_3/algo/tp2/prog
new file mode 100644
index 0000000..f4f6684
--- /dev/null
+++ b/sem_3/algo/tp2/prog
Binary files differ
diff --git a/sem_3/algo/tp2/progListeSC.cpp b/sem_3/algo/tp2/progListeSC.cpp
new file mode 100644
index 0000000..dd81a27
--- /dev/null
+++ b/sem_3/algo/tp2/progListeSC.cpp
@@ -0,0 +1,104 @@
+// progListeSC.c
+#include <iostream>
+#include <fstream>
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "progListeSC.h"
+
+using namespace std;
+
+
+int estVideLSC(ListeSC l)
+{ return (l==NULL);}
+
+ListeSC creerLSC(int val, ListeSC succ){
+ ListeSC l = new CelluleSC;
+ l->info=val;
+ l->succ=succ;
+ return l;}
+
+void insererDebutLSC(ListeSC &p, int val){
+ p=creerLSC(val,p);
+ return;}
+
+void insererApresLSC(ListeSC &l, ListeSC p, int val){
+ assert((l)!=NULL); assert(p!=NULL);
+ (p->succ)=creerLSC(val,(p->succ));
+ return;}
+
+void insererFinLSC(ListeSC &p, int val){
+ if (p==NULL)
+ p=creerLSC(val,NULL);
+ else
+ insererFinLSC(p->succ,val);
+ return;
+}
+
+ListeSC predecesseurLSC(ListeSC L, ListeSC P){
+ assert(L!=NULL);
+ assert(P!=NULL);
+
+ if (L->succ==P){return L;}
+ else {return predecesseurLSC(L->succ,P);}
+}
+
+void supprimerLSC(ListeSC &L, ListeSC P){
+ assert(L!=NULL);
+ assert(P!=NULL);
+
+ if (L==P){L = L->succ;}
+ else {
+ predecesseurLSC(L,P)->succ = P->succ;
+ }
+ delete P;
+ return;}
+
+void supprimerDebutLSC(ListeSC &L){
+ ListeSC P;
+ assert(L!=NULL);
+
+ P=L;
+ L=L->succ;
+ delete P;
+
+ return;}
+
+
+void supprimerFinLSC(ListeSC &L){
+ assert(L!=NULL);
+
+ if (L->succ==NULL){
+ delete L;
+ L=NULL;}
+ else {
+ ListeSC P=L,Q;
+ while ((P->succ)->succ!=NULL){
+ P=P->succ;}
+ Q=P->succ;
+ P->succ=NULL;
+ delete Q;}
+ return;}
+
+
+
+void afficherLSC(ListeSC l){
+ cout << "ListeSC : ";
+ while (! estVideLSC(l)){
+ cout << l->info << " ";
+ l=l->succ;}
+ cout << endl;
+ return;}
+
+ListeSC lireLSC(){
+ ListeSC l;
+ int i;
+ cout << "Entrez les éléments d'une liste d'entiers (0 pour finir)\n";
+ l=NULL;
+ cin >> i;
+ while (i!=0) {
+ insererFinLSC(l,i);
+ cin >> i;
+ }
+ return l;
+}
diff --git a/sem_3/algo/tp2/progListeSC.h b/sem_3/algo/tp2/progListeSC.h
new file mode 100644
index 0000000..c259352
--- /dev/null
+++ b/sem_3/algo/tp2/progListeSC.h
@@ -0,0 +1,56 @@
+
+//* ListeSC.h *
+// Implantation du type Liste d'entiers Simplement Chainée
+
+#ifndef LISTESC_H
+#define LISTESC_H
+
+typedef struct cellule {
+ int info;
+ struct cellule *succ;} CelluleSC;
+
+typedef CelluleSC *ListeSC;
+
+
+// Res : renvoie 1 si L est la liste vide, renvoie 1 sinon
+int estVideLSC(ListeSC L );
+
+// Res : renvoie une ListeSC dont le premier élément est e et la suite de la liste L
+ListeSC creerLSC(int e, ListeSC L);
+
+// Res : modifie la ListeSC L en y insérant en première place l'élément e
+void insererDebutLSC(ListeSC &L, int e);
+
+// Donnée : L est une ListeSC non vide, P l'adresse d'un élément de L, e un entier
+// Res : insère dans la liste L après l'élément d'adresse P 1 élément de valeur e
+void insererApresLSC(ListeSC &L, ListeSC P, int e);
+
+// Res : modifie la listeSC L en y insérant en dernière place l'élément e
+void insererFinLSC(ListeSC &L, int e);
+
+// Donnée : L est une ListeSC non Vide ;
+// P est un pointeur non vide vers une cellule de la liste L
+// L != P
+// Res : renvoie l'adresse de la cellule précédant dans L celle pointée pas P
+ListeSC predecesseurLSC(ListeSC L, ListeSC P);
+
+// Donnée : L est une ListeSC non Vide ;
+// P est un pointeur non vide vers une cellule de la liste L
+// Res : modifie L en supprimant de L la cellule pointée pas P
+void supprimerLSC(ListeSC &L, ListeSC P);
+
+// Donnée : L est une ListeSC non Vide ;
+// Res : modifie L en supprimant son dernier élément
+void supprimerFinLSC(ListeSC &L);
+
+// Donnée : L est une ListeSC non Vide ;
+// Res : modifie L en supprimant son premier élément
+void supprimerDebutLSC(ListeSC &L);
+
+// Res : affiche la liste L
+void afficherLSC(ListeSC L);
+
+// Res : renvoie la ListeSC des éléments saisis au clavier
+ListeSC lireLSC();
+
+#endif //LISTESC_H
diff --git a/sem_3/algo/tp2/énoncé TP2.pdf b/sem_3/algo/tp2/énoncé TP2.pdf
new file mode 100644
index 0000000..9d961dc
--- /dev/null
+++ b/sem_3/algo/tp2/énoncé TP2.pdf
Binary files differ