Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   link list (http://www.go4expert.com/forums/link-list-t3741/)

coolbeans 4Apr2007 05:58

link list
 
Hey guys my assignment is to use link list and take numbers from a infile and print out and sort the numbers. My code is below. I have done everything except I am not sure why Its printing out a zero before my numbers...well I might know but I don't know how not to print it out. Any advice?



-----------------------------------------whole code-----------------------------------------------

Code:

#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 */

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

        for (i = 0; i < 10; ++i)
        {
                if(fscanf(infile," %d", &x) !=1)
                {
                  break;
                  }
                printf("Adding node with data value %d\n", x); /* for debugging purpose */
                add = GetNode(x);
                p = FindInsLoc( start, add );
            start = InsertNodeAfter( start, p, add );
         
        }
    printf("\n Total number of nodes added = %d\n", i);
        printf("Sorted list ----- \n");
        PrintList( start );

        return 0;
}


shabbir 4Apr2007 09:07

Re: link list
 
Do you expect a helpful reply with not much info provided apart from the lines and lines of code.

Refer to my post here

coolbeans 4Apr2007 10:01

Re: link list
 
Sorry thought I gave enough there. Alright I will explain more what I am trying to do and what I have done. :)

Alright, first my goal was to take some numbers from an infile or inputfile (any numbers). They happend to be 8,0,4,9...in the input file. Then I scanf the infile for numbers below with a fscanf and then they are passed up to some helper function which I will explain If I need to. Below is the scanning part.

Code:

/* insertion sort */

        BasePtr start, p, add;
        int x;
        int length;
       
        tmp = GetNode(0);      ----->This line I believe might be my downfall, I believe it      only works if the first number is the smallest. 
       
        start=tmp;

        for (i = 0; i < 10; ++i)
        {
                if(fscanf(infile," %d", &x) !=1)
                {
                  break;
                  }
                printf("Adding node with data value %d\n", x); /* for debugging purpose */
                add = GetNode(x);
                p = FindInsLoc( start, add );
            start = InsertNodeAfter( start, p, add );
         
        }
    printf("\n Total number of nodes added = %d\n", i);
        printf("Sorted list ----- \n");
        PrintList( start );

        return 0;
}

---------My output below-----------

nuke@nuke:~$ ./a.out infile outfile
Adding node with data value 8
Adding node with data value 4
Adding node with data value 0
Adding node with data value 9

Total number of nodes added = 4
Sorted list -----
Val: 0
Val: 0
Val: 4
Val: 8
Val: 9
nuke@nuke:~$

So I am not sure how I would get rid of that zero...the first one because there is a zero in my infile.
:) :) :) :) :) :)

coolbeans 4Apr2007 10:03

Re: link list
 
sorry for all the smilies...didn't realize they posted at the bottom.

shabbir 4Apr2007 11:05

Re: link list
 
You list contains a blank node at the start. Check the InsertNodeAfter

Also you are not upadting the start in the function but just passing and returning.


All times are GMT +5.5. The time now is 21:45.