您的位置:首页 > 理论基础 > 数据结构算法

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

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息