#include <stdio.h>

#include "dlist.h"    /* This is in /blugreen/homes/plank/cs360/include, 
                         which we enable the compiler to find by using the
                         flag -I/blugreen/homes/plank/cs360/include in the 
                         makefile */

main()
{
  Dlist d, tmp;
  int i;

  /* Create the dlist */

  d = make_dl();

  printf("The list is empty.  The pointer d (0x%x) points to an empty\n", d);
  printf("list consisting of one sentinel node.  Note that the sentinel's\n");
  printf("flink (0x%x) and blink (0x%x) pointers both point to itself\n\n",
          d->flink, d->blink);

  /* Insert the strings "1" and "2" into the list */

  printf("Inserting strings 1 and 2 into the list:\n\n");

  dl_insert_b(d, "1");
  dl_insert_b(d, "2");

  printf("d: 0x%x\n", d);
  printf("d->flink: 0x%x, d->flink->val: %s\n", d->flink, d->flink->val);
  printf("d->flink->flink: 0x%x, d->flink->flink->val: %s\n", 
          d->flink->flink, d->flink->flink->val);
  printf("d->flink->flink->flink: 0x%x -- this is the sentinel\n",
          d->flink->flink->flink);

  printf("d->blink: 0x%x, d->blink->val: %s\n", d->blink, d->blink->val);
  printf("d->blink->blink: 0x%x, d->blink->blink->val: %s\n", 
          d->blink->blink, d->blink->blink->val);
  printf("d->blink->blink->blink: 0x%x -- this is the sentinel\n\n",
          d->blink->blink->blink);
 
  /* Insert the string "Jim" into the list */

  printf("Now we call dl_insert_a(d->flink, \"Jim\").  This puts \"Jim\"\n");
  printf("between the nodes conaining \"1\" and \"2\":\n\n");

  dl_insert_a(d->flink, "Jim");
  printf("d: 0x%x\n", d);
  printf("d->flink: 0x%x, d->flink->val: %s\n", d->flink, d->flink->val);
  printf("d->flink->flink: 0x%x, d->flink->flink->val: %s\n", 
          d->flink->flink, d->flink->flink->val);
  printf("d->flink->flink->flink: 0x%x, d->flink->flink->flink->val: %s\n", 
          d->flink->flink->flink, d->flink->flink->flink->val);
  printf("d->flink->flink->flink->flink: 0x%x -- this is the sentinel\n",
          d->flink->flink->flink->flink);

  printf("d->blink: 0x%x, d->blink->val: %s\n", d->blink, d->blink->val);
  printf("d->blink->blink: 0x%x, d->blink->blink->val: %s\n", 
          d->blink->blink, d->blink->blink->val);
  printf("d->blink->blink->blink: 0x%x, d->blink->blink->blink->val: %s\n", 
          d->blink->blink->blink, d->blink->blink->blink->val);
  printf("d->blink->blink->blink->blink: 0x%x -- this is the sentinel\n\n",
          d->blink->blink->blink->blink);

  /* Print out the list */

  printf("Printing out the list with the following loop:\n");
  printf("   for (tmp = d->flink; tmp != d; tmp = tmp->flink) {\n");
  printf("       printf(\"%%s\\n\", tmp->val);\n\n");

  for (tmp = d->flink; tmp != d; tmp = tmp->flink) {
    printf("%s\n", tmp->val);
  }
  printf("\n");

  printf("Printing out the list with the following loop:\n");
  printf("  i = 0;\n");
  printf("  dl_traverse(tmp, d) {\n");
  printf("    i++;\n");
  printf("    printf(\"List element %%d: %%s\\n\", i, tmp->val);\n");
  printf("  }\n");

  i = 0;
  dl_traverse(tmp, d) {
    i++;
    printf("List element %d: %s\n", i, tmp->val);
  }
  printf("\n");

  /* Delete the node "Jim" */

  printf("Calling dl_delete_node(d->flink->flink), and then reprinting:\n\n");

  dl_delete_node(d->flink->flink);
  i = 0;
  dl_traverse(tmp, d) {
    i++;
    printf("List element %d: %s\n", i, tmp->val);
  }
  printf("\n");


  

}
  
  


