link list

coolbeans's Avatar
Newbie Member
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's Avatar, Join Date: Jul 2004
Go4Expert Founder
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's Avatar
Newbie Member
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.

Last edited by shabbir; 4Apr2007 at 10:55.. Reason: Code formatting.
coolbeans's Avatar
Newbie Member
sorry for all the smilies...didn't realize they posted at the bottom.
shabbir's Avatar, Join Date: Jul 2004
Go4Expert Founder
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.