Dev-cpp运行停止,代码为C语言实现树的深度优先搜索

问题签名:
问题事件名称: APPCRASH
应用程序名: Demo.exe
应用程序版本: 0.0.0.0
应用程序时间戳: 60f6a088
故障模块名称: Demo.exe
故障模块版本: 0.0.0.0
故障模块时间戳: 60f6a088
异常代码: c0000005
异常偏移: 000014ba
OS 版本: 6.1.7601.2.1.0.256.48
区域设置 ID: 2052
其他信息 1: 0a9e
其他信息 2: 0a9e372d3b4ad19135b953a78882e789
其他信息 3: 0a9e
其他信息 4: 0a9e372d3b4ad19135b953a78882e789


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define EqualFun strcmp
#define SetValue strcpy
#define NAMESIZE 50
#define TRUE 1
#define FALSE 0
typedef int STATUS;
typedef char Node[NAMESIZE];
struct BrotherNode{
    Node node;
    struct BrotherNode *next;
};
typedef struct BrotherNode *Brother;
struct ParentNode{
    Node node;
    Brother children;
};
typedef struct ParentNode Parent;
struct TreeNode{
    Parent node;
    struct TreeNode *next;
};
typedef struct TreeNode *Tree;
typedef struct BrotherNode *Stack;
int equal(Node n1,Node n2,int fun()){
    return (int)fun(n1,n2);
}
void Set(Node n1,Node n2,char *fun()){
    fun(n1,n2);
}
Brother AddaBrother(Brother br,Node node){
    Brother b,pb;
    b=(Brother)malloc(sizeof(struct BrotherNode));
    Set(b->node,node,SetValue);
    if(br==NULL){
        br=b;
    }else{
        pb=br;
        while(pb->next){
            pb=pb->next;
        }
        pb->next=b;
    }
    return br;
}
Tree From(Node p,Brother b){
    Tree parent;
    parent=(Tree)malloc(sizeof(struct TreeNode));
    Set(parent->node.node,p,SetValue);
    parent->node.children=b;
    parent->next=NULL;
    return parent;
}
Tree AddasubTree(Tree tree,Tree subtree){
    Tree t=tree;
    if(tree==NULL){
        tree=subtree;
    } else{
        while(t->next){
            t=t->next;
        }
        t->next=subtree;
    }
    return tree;
}
Brother ClearBrothers(Brother br){
    Brother b=br;
    while(br){
        b=br;
        br=br->next;
        free(b);
    }
    return br;
}
Tree ClearTree(Tree tree){
    Tree t=tree;
    while(tree){
        t=tree;
        tree=tree->next;
        free(t);
    }
    return tree;
}
void CreatStr(char *brotherset){
    char *c=brotherset;
    while(*c){
        if(*c=='/'){
            *c='\0';
        }
        c++;
    }
    c++;
    *c='\0';
}
Brother CreateBrothers(Brother brothers,char *brotherset){
    char *p=brotherset;
    Node node;
    CreatStr(brotherset);
    while(*p){
        Set(node,p,SetValue);
        brothers=AddaBrother(brothers,node);
        p+=strlen(node)+1;
    }
    return brothers;
}
Tree CreateTree(Tree T,char *file){
    Tree subtree;
    Brother brothers;
    FILE *fp;
    char parent[200],brotherset[5000];
    fp=fopen(file,"r");
    while(!feof(fp)){
        fscanf(fp,"%s",parent);
        fscanf(fp,"%s",brotherset);
        brothers=NULL;
        brothers=CreateBrothers(brothers,brotherset);
        subtree=From(parent,brothers);
        T=AddasubTree(T,subtree);
    }
    fclose(fp);
    return T;                              
}
Brother CopyBrothers(Brother children){
    Brother copynode,lastnode,head=NULL;
    while(children){
        copynode=(Brother)malloc(sizeof(struct BrotherNode));
        Set(copynode->node,children->node,SetValue);
        copynode->next=NULL;
        if(head==NULL){
            head=copynode;
        }else{
            lastnode->next=copynode;
        }
        lastnode=copynode;
        children=children->next;
    }
    return head;
}
Brother ExpandNodes(Tree T,Node n){
    Brother children=NULL;
    Tree t=T;
    while(t){
        if(equal(t->node.node,n,EqualFun)==0){
            children=CopyBrothers(t->node.children);
            break;
        }
        t=t->next;
    }
    return children;
}
Stack PushChildren(Stack stack,Brother children){
    Brother p,head;
    head=CopyBrothers(children);
    p=head;
    if(p!=NULL){
        while(p->next){
            p=p->next;
        }
        p->next=stack;
        stack=head;
    }
    return stack;
}
Stack PopaChild(Stack stack,Node child){
    Stack p=stack;
    if(p!=NULL){
        Set(child,p->node,SetValue);
        stack=p->next;
        free(p);
    }
    return stack;
}
Stack ClearStack(Stack stack){
    stack=ClearBrothers((Brother)stack);
    return stack;
}
STATUS Search(Tree tree,Node start,Node end){
    Tree pnode;
    Node node;
    Brother children;
    Stack stack;
    STATUS flag=FALSE;
    if(tree==NULL){
        return flag;
    }
    stack=(Stack)malloc(sizeof(struct BrotherNode));
    stack->next=NULL;
    Set(stack->node,start,SetValue);
    while(stack){
        stack=PopaChild(stack,node);
        if(equal(end,node,EqualFun)==0){
            flag=TRUE;
            break;
        }children=ExpandNodes(tree,node);
        stack=PushChildren(stack,children);
    }
    ClearStack(stack);
    return flag;
}
int main(){
    Node start,end;
    Tree tree;
    STATUS flag;
    char *file="C:\\Users\\Lenovo\\Desktop\\file.txt";
    tree=CreateTree(tree,file);
    printf("The Start Node:");
    scanf("%s",start);
    printf("The End Node:");
    scanf("%s",end);
    flag=Search(tree,start,end);
    printf("Search %s from %s,Status=%d\n",end,start,flag);
    printf("==================\n");
    ClearTree(tree);
}

说明深搜没有正常运行结束,建议 先用c++stack头文件来处理深搜.
然后再写链表.