数据结构之用子树表示法实现树的操作
2015-09-30 09:56
471 查看
#include "stdio.h"
#include "stdlib.h"
#define max_num 10
/*
实现功能:用子树表示法实现树的各种操作
编译环境:win7 64b,vc6.0
日期 :2015/8/6
作者 :wtt561111
*/
/*
遇到的问题:
字表结点的nodeposition输出的是乱码
*/
struct EdgeNode{ //字表中结点的结构
int nodeposition;
//子结点在节点表中的位置
struct EdgeNode *link;
//指向下一个孩子
};
typedef struct EdgeNode *paEdgeNode;
struct ChiTreeNode{ //结点表中结点的结构
char info;
//树中结点本身的信息
struct EdgeNode *chidren;
//本节点字表的头指针
};
typedef struct ChiTreeNode *PNodelist;
struct ChiTree{ //树的结构
int MAXNUM;
//树中最大结点个数
int root;
//根节点的下标
int n;
//实际结点个数
struct ChiTreeNode *nodelist;
//节点表
};
typedef struct ChiTree *PChiTree;
/*
创建并初始化一个子结点。成功返回在结点指针,否则返回NULL
*/
paEdgeNode createEdgeNode_chitree(int nodeposition, paEdgeNode link){
paEdgeNode node=(paEdgeNode)malloc(sizeof(struct EdgeNode));
if(node==NULL){
printf("out of space\n");
return NULL;
}
node->nodeposition=nodeposition;
node->link=link;
return node;
}
/**************************************************************************/
/*
创建一个树。成功返回树指针,否则返回NULL
*/
PChiTree createTree_chitree(int MAXNUM,int root,int n,PNodelist nodelist){
PChiTree patree=(PChiTree)malloc(sizeof(struct ChiTree));
if(patree==NULL){
printf("out of space\n");
return NULL;
}
patree->MAXNUM=MAXNUM;
patree->n=n;
patree->nodelist=nodelist;
patree->root=root;
return patree;
}
/**************************************************************************/
/*
求某个结点的最左子结点。成功返回在结点表中的位置,否则返回-1
*/
int leftChild_chitree(PChiTree t,int p){
return t->nodelist[p].chidren->nodeposition;
}
/**************************************************************************/
/*
求右兄弟结点的位置。成功返回在结点表中的位置,否则返回-1
*/
int rightSibling_chitree(PChiTree t,int p){
int i;
struct EdgeNode *v;
for(i=0;i<t->n;i++){
v=t->nodelist[i].chidren;
while(v!=NULL){
if(v->nodeposition==p)
if(v->link==NULL)
return -1;
else
return v->link->nodeposition;
else
v=v->link;
}
}
return -1;
}
/**************************************************************************/
/*
求父结点的位置。成功返回在结点表中的位置,否则返回-1
*/
int parent_chitree(PChiTree t,int p){
int i;
struct EdgeNode *v;
for(i=0;i<t->n;i++){
v=t->nodelist[i].chidren;
while(v!=NULL)
if(v->nodeposition==p)
return 1;
else
v=v->link;
}
return -1;
}
/**************************************************************************/
/*************************************主函数*******************************/
int main(){
//创建节点表
PNodelist nodelist=(PNodelist)malloc( ( sizeof(struct EdgeNode) ) * max_num );
if(nodelist==NULL){
printf("out of space\n");
return -1;
}
//初始化节点表的信息
paEdgeNode node_7=createEdgeNode_chitree(7,NULL);
paEdgeNode node_1=createEdgeNode_chitree(1,node_7);
nodelist[0].info='a';
nodelist[0].chidren=node_1;
paEdgeNode node_3=createEdgeNode_chitree(3,NULL);
paEdgeNode node_2=createEdgeNode_chitree(2,node_3);
nodelist[1].info='b';
nodelist[1].chidren=node_2;
nodelist[2].info='d';
nodelist[2].chidren=NULL;
paEdgeNode node_6=createEdgeNode_chitree(6,NULL);
paEdgeNode node_5=createEdgeNode_chitree(5,node_6);
paEdgeNode node_4=createEdgeNode_chitree(4,node_5);
nodelist[3].info='e';
nodelist[3].chidren=node_4;
nodelist[4].info='h';
nodelist[4].chidren=NULL;
nodelist[5].info='i';
nodelist[5].chidren=NULL;
nodelist[6].info='j';
nodelist[6].chidren=NULL;
paEdgeNode node_9=createEdgeNode_chitree(9,NULL);
paEdgeNode node_8=createEdgeNode_chitree(8,node_9);
nodelist[7].info='c';
nodelist[7].chidren=node_8;
nodelist[8].info='f';
nodelist[8].chidren=NULL;
nodelist[9].info='g';
nodelist[9].chidren=NULL;
//创建一个树
PChiTree tree_get=createTree_chitree(10,0,10,nodelist);
printf("%c\n",tree_get->nodelist[0].chidren->nodeposition);
return 0;
}
相关文章推荐
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- 肯特·贝克:改变人生的代码整理魔法
- Linux C函数参考手册(PDF版)
- 网页恶意代码的预防
- 用PS实现纹理浮雕效果代码
- 用vbs实现cmd功能的代码
- 高手写的Tracer-Flash代码调试类代码下载
- 用双网卡实现三机互联
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- Lua教程(十七):C API简介
- Lua中编译执行代码相关的函数详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#中实现判断某个类是否实现了某个接口
- C#数据结构揭秘一
- DL.DT.DD实现左右的布局简单例子第1/2页