-2

I have implemented Tic Tac Toe using binary search tree in C.But,unfortunately it is not running.I am encountering a run time error like the

.exe file stopped working.

On the other hand the code successfully compiled. It would be very grateful if somebody could point out the mistake.

Here is the code:

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

int x,win=0,gcursor=1,count=0,j=10;
char ch;

struct node
{
    struct node *left;
    int cell;
    char data;
    struct node *right;
};

void insert(struct node **sr, int num)
{
    if(*sr==NULL)
    {
        *sr = (struct node*)calloc(1,sizeof(struct node));
        (*sr)->left = NULL;
        (*sr)->cell = num;
        (*sr)->data = ' ';
        (*sr)->right = NULL;
    }

    else
    {
        if(num<(*sr)->cell)
        insert(&((*sr)->left),num);
        else
        insert(&((*sr)->right),num);
    }
}

void inorder(struct node *t,int pos)
{
    if(t!=NULL)
    {
        inorder(t->left,pos);
        if(t->cell==pos)
        {
        ch = t->data;
        return; 
        }
            inorder(t->right,pos);
    }
}

void display(struct node *t,int cursor)
{
    char arr[10],i;
    system("cls");
    for(i=1;i<=9;i++)
    {
        inorder(t,i);
        arr[i] = ch;
    }
    printf("\n\nTIC TAC TOE");
    if(cursor==1)
    printf("\n-------------\n| %c.| %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else if(cursor==2)
    printf("\n-------------\n| %c | %c.| %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else if(cursor==3)
    printf("\n-------------\n| %c | %c | %c.|\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else if(cursor==4)
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c.| %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else if(cursor==5)
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c.| %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else if(cursor==6)
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c.|\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else if(cursor==7)
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c.| %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else if(cursor==8)
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c.| %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else if(cursor==9)
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c.|\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
    else
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]);
}


void winner(struct node *t)
{
    int arr[][3] = {{1,2,3},{4,5,6},{7,8,9},{1,5,9},{3,5,7},{1,4,7},{2,5,8},{3,6,9}};
    int i;
    char x1,y1,z1;
    win = 0;
    for(i=0;i<=7;i++)
    {
        inorder(t,arr[i][0]); x1 = ch;
        inorder(t,arr[i][1]); y1 = ch;
        inorder(t,arr[i][2]); z1 = ch;
        if(x1==y1 && y1==z1 && x1!=' ' && y1!=' ' && z1!=' ')
        { win = 1;break;}
    }
}

void check(struct node *t,int pos,char c,char c2)
{   

        if(t!=NULL)
    {
        check(t->left,pos,c,c2);
        if(t->cell==pos && t->data==' ' && c==c2)
        {
        t->data = c;
        count = 1;
        return; 
        }
        check(t->right,pos,c,c2);
    }
}


void human_being(struct node *t, char human)
{
    char c;
    count = 0;
    while(count<1)
    {
        if(gcursor==10)
        gcursor = 1;

        display(t,gcursor);
        scanf("%c",&c);

        if(c=='\n')
        gcursor++;

        else
        check(t,gcursor,c,human);
        j++;
    }
}

void computer(struct node *t, char comp)
{
    int random,k;
    char c;
    count = 0;
    while(count<1)
    {
        k = rand()%j++;
        if(k!=0)
        {
        random = rand()%k;
        gcursor = random;
        }
        check(t,gcursor,comp,comp); 
    }
}


void main()
{
    char human,comp;
    struct node *t;
    int i,arr[] = {5,3,4,2,1,7,6,8,9};
    for(i=0;i<9;i++)
    insert(&t,arr[i]);
    printf("\n\n------------------------------RULES-----------------------------\n1. Press ENTER to move the cursor '.' around the squares.\n2. Press X or O as per your choice and then again press enter.\n3. X or O should be in capital.");
    printf("\n\n\n------------------------CONFIGURATION-------------------------\n1. Enter O and press enter if you want to start first.\n2. Enter X and press enter if you want computer to start first.\nEnter your choice :- ");
    scanf("%c",&human);
    if(human=='O')
    comp = 'X';
    else if(human=='X')
    comp = 'O';



                if(human=='O')
                for(i=1;i<=9;i++)
                {
                    if(i%2!=0)
                    {
                    human_being(t,human);
                    winner(t);
                    if(win==1)
                    {display(t,0); printf("\nGame Over....Winner Is Human Being."); break; }
                    }
                    else
                    {
                    computer(t,comp);
                    winner(t);
                    if(win==1)
                    { display(t,0); printf("\nGame Over....Winner Is Computer."); break; }
                    }
                }

                else if(human=='X')
                for(i=1;i<=9;i++)
                {
                    if(i%2==0)
                    {
                    human_being(t,human);
                    winner(t);
                    if(win==1)
                    { display(t,0); printf("\nGame Over....Winner Is Human Being."); break; }
                    }
                    else
                    {
                    computer(t,comp);
                    winner(t);
                    if(win==1)
                    { display(t,0); printf("\nGame Over....Winner Is Computer."); break; }
                    }
                }

                if(win==0)
                {display(t,0); printf("\nGame Over....Match Draw.");
    }
getch();
}

Any help would be appreciated.

StoryTeller - Unslander Monica
  • 165,132
  • 21
  • 377
  • 458
ambi das
  • 1
  • 2
  • 4
    Step 1: Open your debugger and step through it. That is a mountain of code for us to look through so you need to narrow down to the part with the actual problem. – tadman Oct 21 '17 at 18:44
  • At what point of the code it breaks? Insert printings when appropriate in order to try to find out. – Neo Oct 21 '17 at 18:45
  • As soon as I run it @Neo – ambi das Oct 21 '17 at 18:47
  • Note: you are using `scanf("%c", ...);` more than once: subsequent usage will read the newline left in the input buffer from the previous. If you are relying on the user typing a valid input, that will misfire. You need to add a space, example `scanf(" %c", ...);` Please see [scanf() leaves the new line char in buffer?](https://stackoverflow.com/questions/5240789/scanf-leaves-the-new-line-char-in-buffer) Always check user input rigorously. – Weather Vane Oct 21 '17 at 18:49

1 Answers1

2

The code breaks on the first run of insert because of access violation - accessing an unallocated memory address.
The problem is that in insert, you verify that *sr isn't NULL, and on the first run it's indeed not NULL - it's equal to t which is declared at main.
It's not initialized, so it's value isn't valid - it's 0xcccccccc, which is probably not a valid address.

Neo
  • 3,534
  • 2
  • 20
  • 32
  • And please see [What happens to a declared, uninitialized variable in C? Does it have a value?](https://stackoverflow.com/questions/1597405/what-happens-to-a-declared-uninitialized-variable-in-c-does-it-have-a-value) – Weather Vane Oct 21 '17 at 19:04