69,368
社区成员
发帖
与我相关
我的任务
分享
#ifndef _struct_H
#define _struct_H
typedef struct Road_info {
unsigned short data_size; //数据大小 2byte
unsigned int LinkID; //道路编号 4byte
unsigned short road_size; //道路名称的尺寸 2byte
//以下是NODE中的数据 4byte
unsigned int linkid; //番号 3-0
unsigned int brunch; //分岔路 6-4
unsigned int roadnameflag; //路标 7
char *roadname; //道路名称
}Road_info;
typedef struct Road{
struct Road_info stRoadRec; //节点数据
struct Road* next; //下一节点
}Road;
#endif
#include<string.h>
#include "struct.h"
typedef struct Map_Tree{
struct Map_Tree *left;
struct Map_Tree *right;
unsigned int data;
}*Map_tree;
Map_tree CreatTree_byLinkId( Road *head, int position); //使用递归建立二叉树 Linkid部分
Map_tree HalfSearch_byLinkId(Map_tree point, int findnode); //二叉树二分查找方式
void show_byLinkd(Road *head);
#include"Map_Tree.h"
void show_byLinkd(Road *head)
{
Map_tree root=NULL;
Map_tree point=NULL;
time_t a,b;
char Run_time[80];
unsigned int findnode;
Road *temp;
root=CreatTree_byLinkId(head,1);
printf("请输入您所想要查询的LinkId:\n");
scanf("%d",&findnode);
a=time(NULL);
strftime(Run_time,79,"%H:%M:%S",localtime(&a));
point=HalfSearch_byLinkId(root,findnode);//用二分法查找二叉树
if(point!=NULL){
printf("#linkid=%d\n",head->stRoadRec.LinkID);
printf("roadnameflag=%d\n",head->stRoadRec.roadnameflag);
printf("brunch=%d\n",head->stRoadRec.brunch);
printf("dispclass=%d\n",head->stRoadRec.linkid);
printf("roadname=%s#\n",head->stRoadRec.roadname);
temp->stRoadRec.LinkID=head->stRoadRec.LinkID;
temp->stRoadRec.roadnameflag=head->stRoadRec.roadnameflag;
temp->stRoadRec.brunch=head->stRoadRec.brunch;
temp->stRoadRec.linkid=head->stRoadRec.linkid;
temp->stRoadRec.roadname = head->stRoadRec.roadname;
}
else
printf("error:未找到结果!!\n");
b=time(NULL);
strftime(Run_time,79,"%H:%M:%S",localtime(&b));
printf("本次查找用时%d 秒.\n",b-a);
}
Map_tree CreatTree_byLinkId(Road *head, int position)
{
Map_tree newnode; //声明新节点指针
if(head->next==NULL) //递归的终止条件
return NULL;
else{
//建立新节点的内存空间
newnode = (Map_tree) malloc(sizeof(Road));
//建立节点内容
newnode->data =head->stRoadRec.LinkID;
//递归建立左子树
newnode->left = CreatTree_byLinkId(head, 2*position);
//递归建立右子树
newnode->right = CreatTree_byLinkId(head, 2*position+1);
return newnode; //返回树的位置
}
}
Map_tree HalfSearch_byLinkId(Map_tree point, int findnode)
{
while(point!=NULL)
{
if(point->data==findnode)
return point;//找到了该结点
else
if(point->data>findnode)
point=point->left;
else
point=point->right;
}
return NULL;
}
if(head->next==NULL) //递归的终止条件
return NULL;
//将终止条件改一下,比如newnode->data == ""; return;
Map_tree CreatTree_byLinkId(Road *head){
Map_tree newnode; //声明新节点指针
if(head->next==NULL) //递归的终止条件
return NULL;
else{
//建立新节点的内存空间
newnode = (Map_tree) malloc(sizeof(Road));
//建立节点内容
newnode->data =head->stRoadRec.LinkID;
//递归建立左子树
//head=head->next;
newnode->left = CreatTree_byLinkId(head);//....
//递归建立右子树
//head=head->next;
newnode->right = CreatTree_byLinkId(head);//你这个递归传递的参数都是head, 也是死循环
return newnode; //返回树的位置
}
}
#include"Map_Tree.h"
void show_byLinkd(Road *head)
{
Map_tree root=NULL;
Map_tree point=NULL;
time_t a,b;
char Run_time[80];
int findnode;
root=CreatTree_byLinkId(head);
printf("请输入您所想要查询的LinkId:\n");
scanf("%d",&findnode);
a=time(NULL);
strftime(Run_time,79,"%H:%M:%S",localtime(&a));
point=HalfSearch_byLinkId(root,findnode);//用二分法查找二叉树
if(point!=NULL){
printf("#linkid=%d ",head->stRoadRec.LinkID);
printf("roadnameflag=%d ",head->stRoadRec.roadnameflag);
printf("brunch=%d ",head->stRoadRec.brunch);
printf("dispclass=%d ",head->stRoadRec.linkid);
printf("roadname=%s# \n",head->stRoadRec.roadname);
}
else
printf("error:未找到结果!!\n");
b=time(NULL);
strftime(Run_time,79,"%H:%M:%S",localtime(&b));
printf("本次查找用时%d 秒.\n",b-a);
}
Map_tree CreatTree_byLinkId(Road *head){
Map_tree newnode; //声明新节点指针
if(head->next==NULL) //递归的终止条件
return NULL;
else{
//建立新节点的内存空间
newnode = (Map_tree) malloc(sizeof(Road));
//建立节点内容
newnode->data =head->stRoadRec.LinkID;
//递归建立左子树
//head=head->next;
newnode->left = CreatTree_byLinkId(head);
//递归建立右子树
//head=head->next;
newnode->right = CreatTree_byLinkId(head);
return newnode; //返回树的位置
}
}
Map_tree HalfSearch_byLinkId(Map_tree point, int findnode)
{
while(point!=NULL)
{
if(point->data==findnode)
return point;//找到了该结点
else
if(point->data>findnode)
point=point->left;
else
point=point->right;
}
return NULL;
}
这个才是Map_Tree.c#include<stdio.h>
#include<malloc.h>
#define FALSE 1
#define ERROR 0
#define OK 1
#define ON 0
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
typedef int Status;
BiTree T;
Status CreateBiTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if (ch==' ')
*T = NULL;
else
{
if (!((*T) = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
(*T)->data = ch;
CreateBiTree(&((*T)->lchild)); // 构造左子树
CreateBiTree(&((*T)->rchild)); // 构造右子树
}
return OK;
} // CreateBiTree
int vi(char c)
{
printf("%c ",c);
return OK;
}
//先序遍历的递归
void PreOrder(BiTree T)
{
if(T)
{
vi(T->data); //访问结点
PreOrder(T->lchild); //遍历左子树
PreOrder(T->rchild); //遍历右子树
}
}
//中序遍历的递归
void InOrder(BiTree T)
{
// 采用二叉链表存储结构,Visit是对数据元素操作的应用函数。
// 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
if(T)
{
InOrder(T->lchild);
vi(T->data);
InOrder(T->rchild);
}
} // InOrderTraverse
//后序遍历的递归
void PostOrder(BiTree T)
{
// 采用二叉链表存储结构,Visit是对数据元素操作的应用函数。
// 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
vi(T->data);
}
} // InOrderTraverse
int main()
{
printf("先序输入二叉树(空格代表空节点):\n");
CreateBiTree(&T);
printf("先序输出二叉树:\n");
PreOrder(T);
printf("\n");
printf("中序输出二叉树:\n");
InOrder(T);
printf("\n");
printf("后序输出二叉树:\n");
PostOrder(T);
printf("\n");
return 0;
}
这是我写的,你可以看一下Map_tree AddTree(Map_tree node, int LinkID)
{
if (node == NULL)
{
node = (Map_tree) malloc(sizeof(Road));
node->data = LinkID;
node->left = node->right = NULL;
}
else if (node->data <= LinkID)
{
node->left = AddTree(node->left, LinkID);
}
else
{
node->right = AddTree(node->right, LinkID);
}
return node;
}
Map_tree CreatTree_byLinkId(Road *head)
{
Map_tree root = NULL;
Road *p = head;
while (p)
{
root = AddTree(root, p->stRoadRec.LinkID);
p = p->next;
}
return root;
}