summaryrefslogtreecommitdiff
path: root/sem_3/algo/TP3/fichierTP3.cpp
blob: 1b804ed99af7a00753c4c56022991e4873eef6bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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
  //   }
  // }
}