数据结构(怎样将树的双亲表示法转化为孩子兄弟法)

zengfanzone 2013-01-02 05:33:56
下面是我的代码,结点输入多了,就会报错,不知道是哪里出错了?请高手帮我看看,谢谢。。。
建立树时可以参照输入以下树 :R -1 ,A 0,B 0, C 0, D 1,E 1, F 3 ,G 6,H 6,K 6;
当输入小于7个,程序不会出错,但输入7个以上,程序就报错了。

#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef char ElemType;
//--树的双亲表示结点定义---
typedef struct {
ElemType data;
int parent;
}PTNode;
//--树的双亲表示储存结构定义---
typedef struct {
PTNode node[MAXSIZE];
int count;//根的位置和节点个数---
}PTree;
//--树的二叉链表(孩子-兄弟)储存表示---
typedef struct CSNode{
int ip;
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;
//--功能函数声明--------------------------------
PTree CreateTree(PTree T);//用双亲表示法创建树---
void InitTree(PTree *Tree);//初始化树结点---
CSNode GetTreeNode(ElemType x,int ip);//得到树的结点---
void Pre_Order(CSNode *T);//树的前序遍历(递归)----
void Pre_Order2(PTree T);//树的前序遍历(非递归)----
void PrintTree(PTree T);//输出树----
CSNode *change(PTree T);//将树转换为二叉树----
//----------------------------------------------------
PTree CreatTree(PTree T){
int i=1,pa;
char ch='0';
PTNode p;
for(i=1;ch!='#';i++){

cout<<"请输入第"<<i<<"个结点<data parent>,注:输入 # 1 结束"<<endl;
cin>>ch>>pa;
//if(ch!='#'){
p.data=ch;
p.parent=pa;
T.count++;
T.node[T.count].data=p.data;
T.node[T.count].parent=p.parent;
//}
//else break;
}

PrintTree(T);
return T;
}


void InitTree(PTree *Tree){
Tree->count=-1;
}

CSNode GetTreeNode(ElemType x,int ip){
CSNode C;
C.ip=ip;
C.data=x;
C.firstchild=C.nextsibling=NULL;
return C;
}

void Pre_Order(CSNode *T){

if(T!=NULL){
cout<<T->data;
Pre_Order(T->firstchild);
Pre_Order(T->nextsibling);
}
}

void Pre_Order2(PTree T){
int i;
for(i=0;i<T.count;i++)
{
cout<<T.node[i].data;
}
}

void PrintTree(PTree T){
int i;
for(i=0;i<=T.count;i++){
cout<<i<<" "<<T.node[i].data<<" "<<T.node[i].parent<<endl;
}
}

/*CSNode *ToBiTree(PTree T)
{
int i,j=0;
CSNode p[MAXSIZE];
CSNode *x,*y,*temp,*Tree;
x=(CSNode *)malloc(sizeof(CSNode));
y=(CSNode *)malloc(sizeof(CSNode));
temp=(CSNode *)malloc(sizeof(CSNode));
Tree=(CSNode *)malloc(sizeof(CSNode));
for(i=0;i<T.count;i++)
{ p[i]=GetTreeNode(T.node[i].data,i);
}
for(i=1;i<T.count;i++)
{
x=&p[i];
y=&p[j];
while(T.node[i].parent!=y->ip)
{j++;
y=&p[j];
}
if(!(y->firstchild))//如果孩子为空;
{ y->firstchild=x;//将p[i]地址给孩子;
temp=x;
}
else//如果孩子域不为空,将p[i]给兄弟域;
{ temp->nextsibling=x;
temp=x;
}

}
Tree=&p[0];
return Tree;
}
*/
CSNode *change(PTree T)
{
int i,j=0;
CSNode p[MAXSIZE];
CSNode *ip,*is,*ir,*Tree;
ip=(CSNode *)malloc(sizeof(CSNode));
is=(CSNode *)malloc(sizeof(CSNode));
ir=(CSNode *)malloc(sizeof(CSNode));
Tree=(CSNode *)malloc(sizeof(CSNode));
for(i=0;i<T.count;i++)
{
p[i]=GetTreeNode(T.node[i].data,i); //p[0]=GetTreeNode(T.node[0].data);
}
for(i=1;i<T.count;i++)
{
ip=&p[i];
is=&p[j];
while(T.node[i].parent!=is->ip)
{
j++;
is=&p[j];

}
if(!(is->firstchild))//如果第一个孩子为空
{
is->firstchild=ip;
ir=ip;
}
else
{
ir->nextsibling=ip;
ir=ip;
}
}
Tree=&p[0];
return Tree;

}
void main()
{ /*PTree *T;
CSNode *Tree;
T=new PTree;
InitTree(T);
CreatTree(*T);

Tree=change(*T);

Pre_Order(Tree);
*/
PTree T;
CSNode *Tree;
InitTree(&T);
cout<<"建立一般树,依次输入各个结点情况:\n";
cout<<"输入结点方式: data(字符) parent(整形) 如:R -1 ,A 0 ,B 0 ,C 0\n";
T=CreatTree(T);
Tree=change(T);

cout<<"树的前序遍历(递归):\n";
Pre_Order(Tree);
printf("\n");


}
...全文
594 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumn29 2013-01-03
  • 打赏
  • 举报
回复
作业题?
数据结构是计算机科学的基础,其中作为一种重要的非线性数据结构,在软件开发与系统设计中扮演着关键角色。是一种层次化的数据结构,能够高效地表示具有层级关系的数据。在C语言实现中,孩子兄弟表示以其能够将任意转换为二叉的特性和统一的存储结构被广泛应用于各种场景。本章节将深入探讨孩子兄弟表示在C语言中的具体实现方,以及相关的操作技术。 在C语言中实现孩子兄弟表示,首先需要定义的节点结构,通常包含数据域、指向第一个孩子的指针(firstchild)和指向右兄弟的指针(rightsib)。孩子兄弟表示的实现依赖于这两个关键的节点指针,通过"左孩子兄弟"的链接方式,将任意度数的转换为二叉的形式。利用这种存储结构,可以对进行基本操作,如初始化、插入孩子节点、删除子、查找双亲节点、查找兄弟节点以及的遍历等。 对于孩子兄弟表示的优势在于其统一的二叉链表存储结构,使得任意都可以用相同的方式表示和处理。通过第一个孩子指针可以访问节点的所有孩子,通过右兄弟指针可以访问同一层次的其他节点。这种表示方特别适合与二叉之间的转换操作。需要注意的是,在删除节点操作中,当删除某个子时,应该递归地释放该子中所有节点占用的内存资源,以避免内存泄漏。 孩子兄弟表示的实现具有存储结构统一和便于转二叉的优势,每个节点只需两个指针域,空间利用率较高。可以灵活地处理任意度数的,将复杂的多叉问题转化为相对简单的二叉问题来处理。这样的特性使得孩子兄弟表示在处理需要与二叉相互转换的场景中尤为有用,如森林的表示、的存储优化等。 C语言实现孩子兄弟表示的代码一般分为几个部分,首先是节点结构的定义,然后是本身的定义,包括的初始化、创建节点、插入孩子、删除子、查找双亲、查找兄弟等函数的实现。实现这些操作时,需要对指针的操作有深入理解,尤其是在处理

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧