用c语言写BFS的八数码时报错

没用队列,用数组,请大神告诉错哪了。
报错
Program received signal SIGSEGV, Segmentation fault

 #include<iostream>  
#include<cstdlib>  
#include<math.h>
#include<stack>
#define right 3
#define left 2
#define down 1
#define up 0
#define MAX 363000
using namespace std; 
typedef struct node{

    int a[9];
    int dir; 
    long long p;

    node *fu;

};
struct node sh[MAX],end;
long count=1;
long long res_end=0;

void init(){
    printf("输入初始节点矩阵\n");
    for(int i=0;i<9;i++){
        scanf("%d",&sh[0].a[i]);
    }
    printf("输入终止节点矩阵\n");

    for(int i=0;i<9;i++){
        scanf("%d",&end.a[i]);
        res_end+=end.a[i]*pow(10,8-i);
    }

} 
int loction(int num){
    int i;
    for(i=0;i<9;i++){
        if(sh[num].a[i]==0)
        return i;
    }
}
bool isequ(long num){
    long long sum=0;
    for(int i=0;i<9;i++){
        sum+=sh[num].a[i]*pow(10,8-i);
    }
    //return sum;
    if(sum==res_end) return true;
    else             return false;
}
bool haveresult(int num){
    int sum1=0,sum2=0;
    for(int i=8;i>=0;i--){
        for(int j=0;j<i;j++){
            if(sh[num].a[j]>sh[num].a[i]&&sh[num].a[i]!=0){
                sum1++;
            }
        }
    }
//  printf("%d ",sum1);
    for(int i=8;i>=0;i--){

        for(int j=0;j<i;j++){
            if(end.a[j]>end.a[i]&&end.a[i]!=0){
                sum2++;
            }
        }
    }
//  printf("%d ",sum2);
    //printf("%d",sum1%sum2);
    if(sum1%2==sum2%2)  return true;
    else               return false;
}
void exchange(long long num){
    int temp;
    int loc;
    loc=loction(num);
    //up
    if(loc<6&&sh[num].dir!=down){
        **sh[count]=sh[num]**;//调试在这一行报错
        temp=sh[count].a[loc];
        sh[count].a[loc]=sh[count].a[loc+3];
        sh[count].a[loc+3]=temp;
        sh[count].dir=up;
        sh[count].p=count;
        sh[count].fu=&sh[num];
        //sh[num].u=sh[count];

        count++;
    }
    //down
    if(loc>2&&sh[num].dir!=up){
        sh[count]=sh[num];
        temp=sh[count].a[loc];
        sh[count].a[loc]=sh[count].a[loc-3];
        sh[count].a[loc-3]=temp;
        sh[count].dir=down;
        sh[count].p=count;
        sh[count].fu=&sh[num];
        //sh[num].d=sh[count];
        count++;
    }
    //left
    if((loc+1)%3!=0&&sh[num].dir!=right){
        sh[count]=sh[num];
        temp=sh[count].a[loc];
        sh[count].a[loc]=sh[count].a[loc+1];
        sh[count].a[loc+1]=temp;
        sh[count].dir=left;
        sh[count].p=count;
        sh[count].fu=&sh[num];
        //sh[num].l=sh[count];
        count++;
    }
    //right
        if(loc%3!=0&&sh[num].dir!=left){
        sh[count]=sh[num];
        temp=sh[count].a[loc];
        sh[count].a[loc]=sh[count].a[loc-1];
        sh[count].a[loc-1]=temp;
        sh[count].dir=right;
        sh[count].p=count;
        sh[count].fu=&sh[num];
        //sh[num].r=sh[count];
        count++;
    }

}
int search(){
    long i=0;
    while(1){

        if(isequ(i)){
            printf("在第%d次找到\n",i);
            return i;
        }
        exchange(i);
        i++;
    }
}
int main(){
    init();
    sh[0].dir=-1;
    sh[0].p=0;

    //printf("%d\n",res_end);
    //printf("%d\n",isnum(0));
    if(!haveresult(0)){
        printf("无解\n");
    } 
    else{
        printf("有解\n");
        int i,k=0;
        stack<int> st;
        i=search();
        while(sh[i].fu!=NULL){
            st.push(sh[i].dir);
            i=sh[i].fu->p;
            k++;
        }
        while(!st.empty()){
            printf("%d ",st.top());
            st.pop();
        }

    }


}

http://blog.csdn.net/christech/article/details/5021948