问题签名:
问题事件名称: 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头文件来处理深搜.
然后再写链表.