home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 347_01 / example5.c < prev    next >
C/C++ Source or Header  |  1991-10-20  |  7KB  |  253 lines

  1. /*
  2.  *  program Example5
  3.  *  purpose: Test shell for threaded AVL-tree. Demonstrates alternate
  4.  *           identifier functions, alternate compare functions.
  5.  *
  6.  *  Usage:  EXAMPLE5 <filename>
  7.  *
  8.  *  Copyright (c) 1991  Bert C. Hughes
  9.  *                      200 N. Saratoga
  10.  *                      St.Paul, MN 55104
  11.  *                      Compuserve 71211,577
  12.  */
  13.  
  14. #if defined NDEBUG
  15.      !*&^%$!!@@@()^H??||~:~:;:=+
  16.      File "Example5.c" MUST be compiled with NDEBUG undefined,
  17.      so that the "assert()" macro/function will be included.
  18. #endif
  19.  
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <stdlib.h>
  23. #include <assert.h>
  24. #include "tavltree.h"
  25.  
  26. #if defined __TURBOC__
  27. #include <conio.h>
  28. #else
  29.  
  30. #define cprintf printf
  31.  
  32. int getche(void)
  33. {
  34.     char s[128];
  35.     gets(s);
  36.     return (*s ? *s : '\n');
  37. }
  38.  
  39. #endif
  40.  
  41. typedef struct {
  42.           long  EmpID;
  43.           long  salary;
  44.           char  *Name;
  45.         } DataRecord, *PDataRecord;
  46. /*
  47. typedef struct {
  48.           long  EmpID;
  49.           long  salary;
  50.           char  Name[128];
  51.         } TempDatarecord;
  52. */
  53.  
  54. void *NameID(void *x)
  55. {
  56.     PDataRecord rec = x;
  57.     return(rec->Name);
  58. }
  59.  
  60. void *make_rec(const void *x)
  61. {
  62.     PDataRecord q = x;
  63.     PDataRecord p = malloc(sizeof(DataRecord));
  64.     if (p) {
  65.         p->Name = malloc(1+strlen(q->Name));
  66.         if (p->Name) {
  67.            strcpy(p->Name,q->Name);
  68.            p->salary = q->salary;
  69.            p->EmpID  = q->EmpID;
  70.         }
  71.         else {
  72.            free(p);
  73.            p = NULL;
  74.         }
  75.     }
  76.     return(p);
  77. }
  78.  
  79. void *copy_rec(void *buffer, const void *x)
  80. {
  81.     PDataRecord dest = buffer;
  82.     PDataRecord src  = x;
  83.  
  84.     dest->EmpID = src->EmpID;
  85.     dest->salary= src->salary;
  86.     strcpy(dest->Name,src->Name);
  87.     return(dest);
  88. }
  89.  
  90. void free_rec(void *rec)
  91. {
  92.     free(((PDataRecord)rec)->Name);
  93.     free(rec);
  94. }
  95.  
  96. void putrec(PDataRecord rec)
  97. {
  98.     cprintf("%-23.20s %ld %12.ld\r\n",rec->Name,rec->EmpID,rec->salary);
  99. }
  100.  
  101. void list(TAVL_treeptr , TAVL_nodeptr (*)(TAVL_nodeptr));
  102.  
  103. main (int argc, char *argv[])
  104. {
  105.     TAVL_treeptr tree;
  106.     TAVL_nodeptr p;
  107.     char s[128];
  108.     TAVL_nodeptr (*dirfunc)(TAVL_nodeptr);
  109.     int (*cmp)() = strcmp;  /* use C library function "strcmp" to compare */
  110.                             /* DataRecord.Name identifiers */
  111.     FILE *fp;
  112.  
  113.     DataRecord TempRec;
  114.     if ((TempRec.Name = malloc(128)) == NULL) {
  115.         cprintf("Out of memory.\r\n");
  116.         exit(1);
  117.     }
  118.  
  119.  
  120. #if defined __TURBOC__
  121.     directvideo = 0;   /* change to 1 if there is "snow" on your monitor */
  122. #endif
  123.  
  124.     if (argc < 2)
  125.         assert(fp = fopen("EMPLDATA","r"));
  126.     else
  127.         assert(fp = fopen(argv[1],"r"));
  128.  
  129.     assert((tree = tavl_init(cmp,NameID,make_rec,free_rec,copy_rec,malloc,free)));
  130.  
  131.     cprintf("Input will be echoed...\r\n");
  132.  
  133.     while (fscanf(fp,"%ld %ld %s",&TempRec.EmpID,&TempRec.salary,TempRec.Name) != EOF) {
  134.     /* echo input */
  135.     putrec(&TempRec);
  136.     /* insert into trees */
  137.     if ((p = tavl_insert(tree,&TempRec,NO_REPLACE)) == NULL) {
  138.         cprintf("\r\nOut of memory!");
  139.         exit(1);
  140.     }
  141.     } /* end while - input loop */
  142.  
  143.     fclose(fp);
  144.  
  145.     do {
  146. #if !defined __TURBOC__
  147.     printf("\n ...press selection key, then <ENTER> ...");
  148. #endif
  149.     cprintf("\r\n\:Select:   <I>nsert   <F>ind   <D>elete   <L>ist   <S>ucc   <P>red   <Q>uit  ");
  150.     switch (getche()) {
  151.         case 'I': case 'i':
  152.             cprintf("\r\nInsert: Name: ");
  153.                         gets(TempRec.Name);
  154.                         cprintf("  Employee ID: ");
  155.                         gets(s);
  156.                         TempRec.EmpID = atol(s);
  157.                         cprintf("       Salary: ");
  158.                         gets(s);
  159.                         TempRec.salary = atol(s);
  160.                         tavl_insert(tree,&TempRec,1);
  161.                         break;
  162.  
  163.             case 'F': case 'f':
  164.                         cprintf("\r\nFind: ");
  165.                         if (p = tavl_find(tree,gets(s))) {
  166.                             cprintf("\r\n ... OK:  ");
  167.                             putrec(tavl_getdata(tree,p,&TempRec));
  168.                         }
  169.                         else
  170.                             cprintf("\r\nNot found.\r\n");
  171.                         break;
  172.  
  173.             case 'D': case 'd':
  174.                         cprintf("\r\nDelete: ");
  175.                         gets(s);
  176.                         tavl_delete(tree,s);
  177.                         break;
  178.  
  179.             case 'L': case 'l':
  180.                         cprintf("\r\n<F>orward or <R>everse?  ");
  181.                         if (getche() != 'r')
  182.                             dirfunc = tavl_succ;
  183.                         else
  184.                             dirfunc = tavl_pred;
  185.                         cprintf("\r\n");
  186.                         list(tree,dirfunc);
  187.                         break;
  188.  
  189.             case 'S': case 's':
  190.                         if ((p = tavl_succ(p)) != NULL) {
  191.                             cprintf("\r\n\nSuccessor:\r\n");
  192.                             putrec(tavl_getdata(tree,p,&TempRec));
  193.                         }
  194.                         else
  195.                             cprintf("\r\n\nNo more.\r\n");
  196.                         break;
  197.  
  198.             case 'P': case 'p':
  199.                         if ((p = tavl_pred(p)) != NULL) {
  200.                             cprintf("\r\n\nPredecessor:\r\n");
  201.                             putrec(tavl_getdata(tree,p,&TempRec));
  202.                         }
  203.                         else
  204.                             cprintf("\r\n\nNo more.\r\n");
  205.                         break;
  206.  
  207.             case 'Q': case 'q':
  208.                         tavl_destroy(tree);
  209.                         exit(0);
  210.  
  211.             default:
  212.                         cprintf("\r\n");
  213.         }
  214.     } while (1);
  215. }
  216.  
  217.  
  218. void list(TAVL_treeptr tree, TAVL_nodeptr (*f)(TAVL_nodeptr))
  219. {
  220.     TAVL_nodeptr p = tavl_reset(tree);
  221.     long i = 0;
  222.     DataRecord TempRec;
  223.     TempRec.Name = malloc(128);
  224.     if (TempRec.Name == NULL) {
  225.         cprintf("Out of memory.\r\n");
  226.         return;
  227.     }
  228.  
  229.     cprintf("    Name            Employee ID       Salary     \r\n");
  230.     cprintf("-------------------------------------------------\r\n");
  231.  
  232.     while ((p = (*f)(p)) != NULL) {
  233. #if defined __TURBOC__
  234.        /* TurboC users can stop the output */
  235.         if (kbhit()) {
  236.             while (kbhit())
  237.                 getch(); /* remove it */
  238.             cprintf("\r\n\nHalt?  <y/n> ");
  239.             if (getche() == 'y') {
  240.                 cprintf("\r\n\n");
  241.                 i = -1;
  242.                 break;
  243.             }
  244.             cprintf("\r\n\n");
  245.         }
  246. #endif
  247.         putrec(tavl_getdata(tree,p,&TempRec));
  248.         i++;
  249.     }
  250.     if (i >= 0) cprintf("\r\n         >> %ld items in TAVLtree <<\r\n",i);
  251.     free(TempRec.Name);
  252. }
  253.