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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
| #include <stdio.h>
#include <stdlib.h>
//NB ce que nous appelons ici listes sont en fait des tableaux dynamiques
/***** Le type liste de caractères (par exemple) *********/
typedef struct
{
unsigned int nc; // nombre de charactères
char* lc; // pointeur sur tête de liste
} listchar;
char CAR (listchar L)
{
return L.lc[0];
}
listchar CDR (listchar L)
{
unsigned int i;
listchar cdr;
cdr.nc=L.nc-1;
cdr.lc = (char *) malloc(L.nc);
for (i=1;i<L.nc;i++)
cdr.lc[i-1]=L.lc[i];
if (cdr.nc==0)
cdr.lc=NULL;
return cdr;
}
listchar CONS(char C, listchar L)
{
unsigned int i;
listchar cons;
cons.nc=L.nc+1;
cons.lc= (char *) malloc(cons.nc);
cons.lc[0]=C;
for (i=1;i<=L.nc;i++)
cons.lc[i]=L.lc[i-1];
return cons;
}
void initlc (listchar * pL,unsigned int n, char* LC)
{
unsigned int i;
pL->nc=n;
if (n==0)
pL->lc=NULL;
else
{
pL->lc=(char *) malloc(n);
for (i=0;i<n;i++)
pL->lc[i]=LC[i];
pL->lc=LC;
}
}
void affichelc(listchar L)
{
unsigned int i;
printf("{");
if (L.nc>=2)
for (i=0;i<L.nc-1;i++)
printf("%c,",L.lc[i]);
if (L.nc>=1)
printf("%c",L.lc[L.nc-1]);
printf("}");
}
/*************** fin de liste de caractères*************/
/************le type liste de listes *******************/
typedef struct
{
unsigned int nl; // nmbre de listes
listchar * ll; // pointeur sur première liste
} listlistchar;
void initllc(listlistchar *pLL, unsigned int n, listchar * LLC)
{
unsigned int i;
pLL->nl=n;
if (n==0) pLL->ll=NULL;
else
{
pLL->ll=(listchar *)malloc(n*sizeof(listchar));
for (i=0;i<n;i++)
initlc(&(pLL->ll[i]),LLC[i].nc,LLC[i].lc);
}
}
listlistchar APPEND (listlistchar L1, listlistchar L2)
{
unsigned int i,j,h;
listlistchar append;
append.nl=L1.nl+L2.nl;
append.ll=malloc(append.nl*sizeof(listchar));
h=0;
for (i=0;i<L1.nl;i++)
initlc(append.ll+h++,L1.ll[i].nc,L1.ll[i].lc);
for (j=0;j<L2.nl;j++)
initlc(append.ll+h++,L2.ll[j].nc,L2.ll[j].lc);
return append;
}
void affichellc(listlistchar LLC)
{
unsigned int i;
printf("{");
if (LLC.nl>=2)
for (i=0;i<LLC.nl-1;i++)
affichelc(LLC.ll[i]);
if (LLC.nl>=1)
affichelc(LLC.ll[LLC.nl-1]);
printf("}\n");
}
/***************fin du type liste de listes********************/
listlistchar Parties (listchar E)
{
listlistchar P;
listlistchar Q;
listchar V;
unsigned int i;
unsigned char c;
initlc(&V,0,NULL);
initllc(&P,1,&V);
listchar * TL;
listchar * SL;
while (E.nc>=1)
{
c=CAR(E);
E=CDR(E);
for (i=0;i<P.nl;i++)
initlc(TL+i,P.ll[i].nc,P.ll[i].lc);
for (i=0;i<P.nl;i++)
SL[i]=CONS(c,TL[i]);
initllc(&Q,P.nl,SL);
P=APPEND(Q,P);
}
return P;
}
int main()
{
listchar L0;
listlistchar P;
char T[]={'1','2','3'};
initlc(&L0,3,T);
P=Parties(L0);
affichellc(P);
return 0;
} |
Partager