#include <stdio.h>
#include <stdlib.h>
typedef enum { FALSE, TRUE} bool;
typedef struct Bloc
{
int number;
struct Bloc *next;
} Bloc;
typedef Bloc *Liste ;
void initEmpty(Liste *L);
bool isEmpty(Liste l);
int value(Liste l);
Liste add(int x, Liste l);
void stack(int x, Liste* L);
void print_iter(Liste l);
void initEmpty( Liste *L)
{
*L = NULL ;
}
bool isEmpty(Liste l)
{
return l == NULL ;
}
int value(Liste l)
{
return l->number ;
}
Liste add(int x, Liste l)
{
Liste tmp
= (Liste
) malloc(sizeof(Bloc
)) ; tmp->number = x ;
tmp->next = l ;
return tmp ;
}
void stack(int x, Liste *L)
{
*L = add(x,*L) ;
}
Liste next(Liste l)
{
return l->next ;
}
void print_iter(Liste l)
{
Liste L2 = l;
while(!isEmpty(L2))
{
L2 = next(L2);
}
}
void BisAddBeforeLastZero(Liste *l, int x, Liste *lastOcc) {
if (isEmpty(*l)) {
if (*lastOcc != NULL) {
stack(x, lastOcc);
} else{
// No zero, add to tail
stack(x, l);
}
} else {
if (value(*l) == 0) {
*lastOcc = *l; // Zero has been found, get address
}
BisAddBeforeLastZero(&(*l)->next, x, lastOcc); // go through the end
}
}
void AddBeforeLastZero(Liste *L, int x) {
Liste lastOcc = NULL;
BisAddBeforeLastZero(L, x, &lastOcc);
}
int main(void) {
Liste l;
initEmpty(&l);
stack(0, &l);
stack(9, &l);
stack(0, &l);
stack(12, &l);
print_iter(l);
AddBeforeLastZero(&l, 50);
print_iter(l);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KdHlwZWRlZiBlbnVtIHsgRkFMU0UsIFRSVUV9IGJvb2w7Cgp0eXBlZGVmIHN0cnVjdCBCbG9jCnsKICAgIGludCBudW1iZXI7CiAgICBzdHJ1Y3QgQmxvYyAqbmV4dDsKfSBCbG9jOwoKdHlwZWRlZiBCbG9jICpMaXN0ZSA7Cgp2b2lkIGluaXRFbXB0eShMaXN0ZSAqTCk7Cgpib29sIGlzRW1wdHkoTGlzdGUgbCk7CgppbnQgdmFsdWUoTGlzdGUgbCk7CgpMaXN0ZSBhZGQoaW50IHgsIExpc3RlIGwpOwoKdm9pZCBzdGFjayhpbnQgeCwgTGlzdGUqIEwpOwp2b2lkIHByaW50X2l0ZXIoTGlzdGUgbCk7CgoKdm9pZCBpbml0RW1wdHkoIExpc3RlICpMKQp7CiAgICAqTCA9IE5VTEwgOwp9Cgpib29sIGlzRW1wdHkoTGlzdGUgbCkKewogICAgcmV0dXJuIGwgPT0gTlVMTCA7Cn0KCmludCB2YWx1ZShMaXN0ZSBsKQp7CiAgICByZXR1cm4gbC0+bnVtYmVyIDsgCn0KCkxpc3RlIGFkZChpbnQgeCwgTGlzdGUgbCkKewogICAgTGlzdGUgdG1wID0gKExpc3RlKSBtYWxsb2Moc2l6ZW9mKEJsb2MpKSA7CiAgICB0bXAtPm51bWJlciA9IHggOwogICAgdG1wLT5uZXh0ID0gbCA7CiAgICByZXR1cm4gdG1wIDsKfQoKdm9pZCBzdGFjayhpbnQgeCwgTGlzdGUgKkwpCnsKICAgICAgKkwgPSBhZGQoeCwqTCkgOyAKfQoKTGlzdGUgbmV4dChMaXN0ZSBsKQp7CiAgICByZXR1cm4gbC0+bmV4dCA7Cn0KCnZvaWQgcHJpbnRfaXRlcihMaXN0ZSBsKQp7CiAgICBMaXN0ZSBMMiA9IGw7CiAgICB3aGlsZSghaXNFbXB0eShMMikpCiAgICB7CiAgICAgICAgcHJpbnRmKCIlZCAiLCB2YWx1ZShMMikpOwogICAgICAgIEwyID0gbmV4dChMMik7CiAgICB9CiAgICBwcmludGYoIlxuIik7Cn0KCnZvaWQgQmlzQWRkQmVmb3JlTGFzdFplcm8oTGlzdGUgKmwsIGludCB4LCBMaXN0ZSAqbGFzdE9jYykgewogICAgaWYgKGlzRW1wdHkoKmwpKSB7CiAgICAgICAgaWYgKCpsYXN0T2NjICE9IE5VTEwpIHsKICAgICAgICAgICAgc3RhY2soeCwgbGFzdE9jYyk7CiAgICAgICAgfSBlbHNlewogICAgICAgICAgICAvLyBObyB6ZXJvLCBhZGQgdG8gdGFpbAogICAgICAgICAgICBzdGFjayh4LCBsKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICh2YWx1ZSgqbCkgPT0gMCkgewogICAgICAgICAgICAqbGFzdE9jYyA9ICpsOyAgLy8gWmVybyBoYXMgYmVlbiBmb3VuZCwgZ2V0IGFkZHJlc3MKICAgICAgICB9CiAgICAgICAgQmlzQWRkQmVmb3JlTGFzdFplcm8oJigqbCktPm5leHQsIHgsIGxhc3RPY2MpOyAvLyBnbyB0aHJvdWdoIHRoZSBlbmQKICAgIH0KfQoKdm9pZCBBZGRCZWZvcmVMYXN0WmVybyhMaXN0ZSAqTCwgaW50IHgpIHsKICAgIExpc3RlIGxhc3RPY2MgPSBOVUxMOwogICAgQmlzQWRkQmVmb3JlTGFzdFplcm8oTCwgeCwgJmxhc3RPY2MpOwp9CgppbnQgbWFpbih2b2lkKSB7CglMaXN0ZSBsOwoJaW5pdEVtcHR5KCZsKTsKCQogICAgc3RhY2soMCwgJmwpOwogICAgc3RhY2soOSwgJmwpOwogICAgc3RhY2soMCwgJmwpOwogICAgc3RhY2soMTIsICZsKTsKICAgIHByaW50ZigiW3dpdGggemVyb106XG4iKTsKICAgIHByaW50X2l0ZXIobCk7CiAgICBBZGRCZWZvcmVMYXN0WmVybygmbCwgNTApOwogICAgcHJpbnRfaXRlcihsKTsKICAgIHByaW50ZigiXG4iKTsJcmV0dXJuIDA7Cn0K