数据结构之用子树表示法实现树的操作




#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值