井字

2017-10-21 89 views
-2

我在C.But使用二叉搜索树实现井字,可惜它不是running.I我遇到一个运行时错误像井字

.exe文件停止工作

另外的代码编译成功。 这将是非常感激,如果有人能指出错误。

下面是代码:

#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(); 
} 

任何帮助,将不胜感激。

+4

步骤1:打开你的调试器,并通过它一步。这是我们需要查看的一大堆代码,因此您需要缩小实际问题的范围。 – tadman

+0

它打破了什么代码?适当时插入打印以尝试查明。 – Neo

+0

一旦我运行它@Neo –

回答

2

代码打破对insert由于访问冲突的第一次运行 - 访问未分配的内存地址。
的问题是,在insert,您验证*srNULL,并在第一次运行它的确不是NULL - 它等于其在main声明t
它没有初始化,所以它的值是无效的 - 它是0xcccccccc,这可能不是一个有效的地址。

+0

并请参见[恰好在C中声明,未初始化的变量是什么?它有价值吗?](https://stackoverflow.com/questions/1597405/what-happens-to-a-declared-uninitialized-variable-in-c-does-it-have-a-value) –