• C

bst crashes after compiling

I have an assignment that is suppose to be a spell checker using a BST. It compiles but it crashes after tthe dictionary file is entered. Any direction would be great.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
 
//CONSTANTS 
#define wrdlen 48 
#define linelen 1024
 
 
// A struct representing a node in a binary search tree
 
struct BSTnode
{  
char word[wrdlen];// The contents of the node	
struct BSTnode* left;// Links to the node's left and right children
struct BSTnode* right;
 
};
 
// Adds a new node to the tree. Duplicates are disallowed. Returns 1 if a
// new node was added, returns 0 if newdata was already in the tree
int insert(struct BSTnode** root, char newword[wrdlen])
{
    // If we've reached the right place to insert, create a new node and add it in
	if( (*root) == NULL)
	{
		(*root) = (struct BSTnode*)malloc(sizeof(struct BSTnode));
        strcpy((*root)->word,newword);
		(*root)->left = NULL;
		(*root)->right = NULL;
		return 1;
	}
    // Otherwise, search for the correct place to insert
 
	if(strcmp(newword,(*root)->word)<0)
	{
		return insert( &((*root)->left), newword);
	}
 
	else if(strcmp(newword,(*root)->word)>0)
	{
		return insert( &((*root)->right), newword);
	}
// If the new data is neither less than nor greater than the the data at
// the current node, it must be equal, and duplicates are not allowed
	else
	return 0;
}
 
// Returns 1 if target is in the tree and 0 otherwise
int search(struct BSTnode* root, char target[wrdlen])
{
    // An empty tree contains nothing, much less target
	if(root == NULL)
		return 0;
	// If the current node is what we're looking for, we've found it 
 
	if(strcmp(root->word,target) == 0)
		return 1;
    // If what we're looking for is smaller than this node, it must be in
    // the left subtree if it exists
	if(strcmp(target,root->word) < 0)
		return search(root->left, target);
	// Similarly, if the target is greater than this node, it can only be in
    // the right subtree
	else
	return search(root->right, target);
}
 
// An iterative version of the search algorithm
int searchiterative(struct BSTnode* root, char target[wrdlen])
{
	struct BSTnode* crnt = root; 
	// Keep descending through the tree until we reach the bottom or find what
	// we're looking for
	while(crnt != NULL && strcmp(crnt->word,target)!=0)
	{
		if(strcmp(target,crnt->word)>0)
		crnt = crnt->left;
 
		else
		crnt = crnt->right;
	}
	// If we reached the bottom of the tree, then the target isn't present,
	// otherwise we found what we're looking for
	if(crnt == NULL)
		return 0;
	
	else
		return 1;
}
 
void spellcheck(struct BSTnode* root, char *token, int line)
{
    //capital letters are from 65 -> 90
    //lowercase letters are from 97-122  
    if(search(root, token))//if you find it normally then 
      return;
 
     else if(token[0] >= 65 && token[0] <= 90)
     {
          token[0] = token[0] + 32;
          if(search(root, token))
             return;
 
          else
          {   
              token[0] = token[0] - 32;
              printf("Line %d: %s\n", line, token); 
              return;
          }
     }
 
     else
     {
         printf("Line %d: %s\n", line, token);
         return;
     }
}
 
 
int main(void)
{
    FILE *ifp; //dictionary file
    FILE *scfp; //file to be spellchecked
    char infile[wrdlen]; //"words.txt";
    char Tinfile[wrdlen]; //"test.txt"; //test file
    int valid = 0;
    struct BSTnode* root;
    char newword[wrdlen];
    int i = 0;
    char str[linelen];
	char delims[] = {"~!@#$%^&*()-_=+[]{}\\|;:\'\",.<>/?\n\r\t "};
	char *token;
	
     
 
    //ask the user for the dictionary file
    while(!valid)
    {
         printf("Please enter the name of the dictionary file you wish to access\n");
         scanf("%s", infile);
         ifp = fopen(infile, "r");         
 
         if(ifp == NULL)
           printf("sorry, could not find that file!\n");
         else
         {   
             valid = 1;
             printf("Reading file now.........\n");
         }
    }    
    valid = 0;
    //read in all the words and place them into a BST
    while(!feof(ifp))
    {
        fscanf(ifp, "%s ", newword);
        insert(&root, newword);
    }   
 
    //ask the user for the file to be spellchecked
    while(!valid)
    {
		printf("what is the name of the file you would like to spellcheck?\n");
		scanf("%s", Tinfile);
		scfp = fopen(Tinfile, "r");
		if(scfp == NULL)
           printf("sorry, could not find that file!\n");
		else
		{   
             valid = 1;
             printf("Reading file now.........\n");
		}
    }    
 
    printf("The following words were not recognized: \n");    
 
    for(i = 1; !feof(scfp); i++)
    {
     	fgets(str, linelen, scfp);
		
		token = strtok(str, delims);          
 
		while( token != NULL ) 
		{
			spellcheck(root, token, i);    
			token = strtok( NULL, delims );
	    }    
    }
	system("PAUSE");
    return 0; 
}

Open in new window

mikeregasAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

sunnycoderCommented:
run the code using a debugger. When it crashes, examine the stack trace. That would give you the exact location and (hopefully) reason for crash.

It would help if you would attach some sample input that you are using.
0
sunnycoderCommented:
struct BSTnode* root = NULL;

It is a good practice to initialize all variables at the time of declaration.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Infinity08Commented:
Yes, I pointed that out to mikeregas in his previous question about the same subject :

        http://www.experts-exchange.com/Programming/Languages/C/Q-23892281-spell-checker-with-BST.html

The insert function relies on the root being initialized to NULL.
0
KuppingerCole Reviews AlgoSec in Executive Report

Leading analyst firm, KuppingerCole reviews AlgoSec's Security Policy Management Solution, and the security challenges faced by companies today in their Executive View report.

Infinity08Commented:
May I ask why you gave a B grade (again) ? That usually means that something was missing in the answer and/or that something is still unclear. If that's the case, then don't hesitate to ask for clarification where needed. ie. you don't have to close a question if it hasn't been answered yet.
0
sunnycoderCommented:
A side effect of consistent bad grading is that experts stop participating in your questions.
0
mikeregasAuthor Commented:
is there a way to change it I was not even aware that it was monitered, I am sorry you were very helpful
0
Infinity08Commented:
If you want to change grades or do something else that you can't do yourself, you can use the "Request Attention" link, and someone will come and help you out :)

        http://www.experts-exchange.com/help.jsp#hi404
0
mikeregasAuthor Commented:
thank you again for your help and explinations
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.