#include "stdio.h"
#include "malloc.h"

/*************/
/* Exercice2 */
/*************/

/*
 *  Question1 
 */

/* Type Anneau Doublement Chaîné */

typedef struct elt {
  int info;
  struct elt *pred, *suiv;
} ELT, *ADC;


/* Construction d'un anneau doublement chaîné */

ADC construire() {
  int x;
  ADC p, A = NULL;
  scanf("%d", &x);
  while (x != 0) {
    p = (ADC) malloc(sizeof(ELT));
    p->info = x;
    if (A == NULL) {
      p->suiv = p;
      p->pred = p;
      A = p;
    }
    else { /* A non vide */
      p->suiv = A->suiv;
      A->suiv = p;
      p->suiv->pred = p;
      p->pred = A;
    }
    scanf("%d", &x);
  }
  return A;
}

/*
 *  Question2 :
 */

/* Affichage en va-et-vient d'un anneau doublemnt chaîné :
 * On affiche l'info I courante (l'arrêt est obtenu si I = 0). 
 *  - Si I > 0 alors on avance de I cases.
 *  - Si I < 0 alors on recule de |I| cases.
 *  Avant le déplacement, l'info est décrémentée ou incrémentée selon son
 *  signe (pour converger vers 0).
 */

void va_et_vient(ADC A) {
  int n;
  if (A) {
    while (A->info != 0) {
      printf("%d ", A->info);
      if (A->info > 0) { /* avancer dans l'anneau */
	n = A->info; A->info--;
	while (n--) A = A->suiv;
      }
      else { /* L'info est négative => reculer */
	n = - A->info; A->info++;
	while (n--) A = A->pred;
      }
    }
    putchar('\n');
  }
}

/*
 *  Fonctions non demandées. Données ici pour tester la construction.
 */

/* Affichage simple d'un anneau doublemnt chaîné */

void afficher(ADC A) {
  ADC p = A;
  if (A) {
    printf("%d ", A->info);
    p = A->suiv;
    while (p != A) {
      printf("%d ", p->info);
      p = p->suiv;
    }
    putchar('\n');
  }
}

int main() {
  ADC A=construire();
  afficher(A);
  va_et_vient(A);
}

