ATXFG 0 Newbie Poster

Here is the list of instructions on this assignment I am currently working on:

Implement a Base 7 or Base 21 InsertionSort algorithm

  • Input: File containing a list of Base 21 numbers
    • Name of this file is supplied on the command line
    • First element in file is number of entries
    • You may assume all numbers have at most 4 digits
  • Output File containing a sorted list of Base 21 numbers and the decimal equivalent
    • Name of this file is supplied on the command line
    • First element in file is number of entries
  • Implementation requirements
    • Validate input
      • Make sure input file exists & can be opened; make sure output file can be opened
      • Validate the date from the input file. That is, be sure each value really is appropriate for base 21.
    • Compare function named CompareB7 or CompareB21
      • Prototype: int CompareB721( Number1, Number 2)
      • Return value:
        • -1: Number1 < Number2
        • 0: Number1 == Number2
        • 1: Number1 > Number2
      • Number1 & Number2 data types
        • Base7: I recommend int
        • Base21: I recommend char *
      • Usage: use this file for all comparisons that form the basis of the logic in the InsertionSort algorithm
  • Implement InsertionSort function
  • In your submission, be sure to display the input/output file contents

here is the code I have so far, I have just having trouble with the instructions listed above. I am not sure how to write the insertion sort and Base 21 part of this program. Any help would be greatly apperciated. Thanks for your time.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* --------------------------------------------------------------------- */

struct NumNodeType
{
    int dat;
    struct NumNodeType *next;
};

/* Define new type names:  BaseElem   and   BasePtr   
 * to refer to the list nodes.  These new names can
 * be used in place of struct NumNodeType and
 * struct NumNodeType *  repsectively.
 */
typedef struct NumNodeType BaseElem;
typedef struct NumNodeType * BasePtr;


/* --------------------------------------------------------------------- */

BasePtr GetNode( int val )
{
    BasePtr node;
    node = malloc( sizeof(BaseElem) );
    node->dat = val;
    node->next = NULL;
    return node;    
}


int Length( BasePtr first )
{
    BasePtr move;
    int len=0;
    move = first;
    while (move != NULL)
    {
        len++;
        move = move->next;
    }
    return len;
}


void PrintNode( BasePtr node )
{
    printf("Val: %d\n", node->dat);
}

void PrintList( BasePtr first )
{
    BasePtr move;
    move = first;
    while (move != NULL)
    {
        PrintNode( move );
        move = move->next;
    }
}

void PrintNodeFile( FILE *ofp, BasePtr node )
{
    fprintf(ofp, "Val: %d\n", node->dat);
}

void PrintListFile( FILE *ofp, BasePtr first )
{
    BasePtr move;
    move = first;
    while (move != NULL)
    {
        PrintNodeFile( ofp,  move );
        move = move->next;
    }
}

int Compare( int x, int y)
{
    if (x < y) return -1;
    else if (x == y) return 0;
    else if (x > y) return 1;
}

BasePtr FindInsLoc( BasePtr first, BasePtr node )
{
    BasePtr move, prev;
    int val1, val2;
    int res = -1;
    val2 = node->dat;
    move = first;
    prev = move;

    val1 = move->dat;
    res = Compare( val1, val2 );

    while ( res < 0 && move != NULL)
    {
        prev = move;
        move = move->next;
        if (move != NULL)
        {
            val1 = move->dat;
            res = Compare( val1, val2 );
        }
    }    
    return prev;
}

BasePtr InsertNodeAfter( BasePtr first, BasePtr loc, BasePtr node)
{
    //printf("Insert %d after %d\n", node->dat, loc->dat);
    node->next = loc->next;
    loc->next = node;
    return first;
}


/* --------------------------------------------------------------------- */

int main( int argc, char *argv[] )
{
    BasePtr head, tail, tmp;
    int i;

    FILE *infile, *outfile;
    /* verify that 2 parameters were passed */    
    if ( argc != 3)
    {
        printf("Usage: a.out infile outfile\n");
        return 1;
    }
    /* open input file */
    infile = fopen( argv[1], "r");
    if (!infile)
    {
        printf("ERROR: file %s not available\n", argv[1]);
        return 1;    
    }
    /* open output file */
    outfile = fopen( argv[2], "w");
    if (!outfile)
    {
        printf("ERROR: file %s not available\n", argv[2]);
        return 1;    
    }

    tmp = GetNode(1);
    head=tmp;
    tail=tmp;

    for (i = 2; i <= 7; ++i)
    {
        tmp = GetNode(i);
        tail->next = tmp;
        tail = tmp;
    }

    PrintList( head );

    fprintf(outfile, "Starting --\n");
    PrintListFile(outfile, head );
    fprintf(outfile, "Stopping --\n");
    i = Length( head );
    printf("List size: %d\n", i); 


    /* now make it work some some random data; the above
     * code is a test case in a controlled situation to make
     * sure things appear to work
     */
  /* insertion sort */
    srand( time(0) );

    BasePtr start, p, add;
    int x;
    tmp = GetNode(0);
    start=tmp;

    for (i = 1; i < 10; ++i)
    {
        x = rand() % 100 + 1;
        //printf("Inserting %d\n", x);
        add = GetNode(x);
        p = FindInsLoc( start, add );
        start = InsertNodeAfter( start, p, add );
        //printf("Version %d: \n", i);
        //PrintList( start );
    }

    printf("Sorted list ----- \n");
    PrintList( start );

    return 0;
}
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.