首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

一个关于结构体数组指针的有关问题

2014-06-05 
一个关于结构体数组指针的问题下面的是森林转换为二叉树的,不过一直提示有错,请大家给看看C/C++ code#incl

一个关于结构体数组指针的问题
下面的是森林转换为二叉树的,不过一直提示有错,请大家给看看

C/C++ code
#include<stdio.h>#include<malloc.h>#define DEGREE 5 //树的高度#define NULL 0#define QUEUESIZE 10#define MAX_NODE_NUM 100#define MAX_TREE_NUM 5//森林中树的最大数目/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@结构体类型@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*///树节点的类型typedef struct st1{    char data;//数据域,采用char星    struct st1 *children[DEGREE];//指向孩子节点的指针域}CTreeNode;//森林的节点类型typedef struct ft{    CTreeNode *CTreesArray[MAX_TREE_NUM];//数组存放每棵树的根节点    int TreeNum;//树的数目}ForestNode;//二叉树树的结构体类型typedef struct st2{    char data;//数据域    struct st2 *lchild,*rchild;//左右孩子节点的指针}BTreeNode;//树队列结构体类型typedef struct nodeCTree{    CTreeNode *CTreeArray[MAX_NODE_NUM];//结构体指针数组,存放节点的地址    //struct nodeCTree *next;    int CTreeFront,CTreeRear;}QueueCTree;//二叉树队列结构类型typedef struct nodeBTree{    BTreeNode *BTreeArray[MAX_NODE_NUM];//结构体指针数组,存放节点的地址    //struct nodeBTree *next;        int BTreeFront,BTreeRear;}QueueBTree;/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@查找树的节点@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/CTreeNode *SearchCTree(CTreeNode *root ,char data){    int i;    CTreeNode *returnNode;    if(root->data==data)        return root;    else    {        for(i=0;i<DEGREE;i++)        {            if(root->children[i]==NULL)                return NULL;            else            {                returnNode=SearchCTree(root->children[i],data);//递归查找                if(returnNode!=NULL)                    return returnNode;            }        }    }}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@生成树@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/CTreeNode *CreateSTree(){    int i,j,k;    char data, parent;;        CTreeNode *root,*parentNode,*node;    printf("请输入树的节点的数量:");    scanf("%d",&j);    fflush(stdin);//清除键盘缓存    if(j==0)        return NULL;//空树,结束函数    printf("请输入根节点的数据:");    scanf("%c",&data);    fflush(stdin);    root=(CTreeNode *)malloc(sizeof(CTreeNode));    root->data=data;    for(i=0;i<DEGREE;i++)        root->children[i]=NULL;    for(i=2;i<=j;i++)//依次输入每个节点的信息    {        printf("请输入第%d个节点的数据及其父节点的数据:",i);        scanf("%c%c",&data,&parent);//切记当以%c号格式输入数据时候,不要输入空格        fflush(stdin);        node=(CTreeNode *)malloc(sizeof(CTreeNode));        node->data=data;        for(k=0;k<DEGREE;k++)            node->children[k]=NULL;        //printf("验证parent=%c\n",parent);        parentNode=SearchCTree(root,parent);//查找指定数据的节点        for(k=0;k<DEGREE;k++)        {            if(parentNode->children[k]==NULL)            {                parentNode->children[k]=node;                break;            }        }    }    return root;}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@树的遍历@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/void preorderTree(CTreeNode *ctroot)//遍历每个节点的操作就是输出该节点的data域{    CTreeNode *ctchild;    int i;    printf("%c",ctroot->data);//先遍历根节点    for(i=0;i<DEGREE;i++)//依次先序遍历孩子节点    {        ctchild=ctroot->children[i];        if(ctchild==NULL)            break;//孩子节点遍历结束,退出        else            preorderTree(ctchild);//递归先序遍历    }}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@初始化队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*///初始化树队列void initQueueCTree(QueueCTree *&q){    q=(QueueCTree *)malloc(sizeof(QueueCTree));    q->CTreeFront=q->CTreeRear=0;}//初始化二叉树队列void initQueueBTree(QueueBTree *&q){    q=(QueueBTree *)malloc(sizeof(QueueBTree));    q->BTreeFront=q->BTreeRear=0;}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@入队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*///树队列元素入队int addQueueCTree(QueueCTree *&q,CTreeNode *ctroot)//{    if((q->CTreeRear+1)%MAX_NODE_NUM==q->CTreeFront)//队满        return 0;    q->CTreeRear=(q->CTreeRear+1)%MAX_NODE_NUM;    q->CTreeArray[q->CTreeRear]=ctroot;    return 1;//入队列}//二叉树队列元素入队int addQueueBTree(QueueBTree *&q,BTreeNode *btroot){        if((q->BTreeRear+1)%MAX_NODE_NUM==q->BTreeFront)//队满        return 0;    q->BTreeRear=(q->BTreeRear+1)%MAX_NODE_NUM;    q->BTreeArray[q->BTreeRear]=btroot;    return 1;//入队列}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@队列判空@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*///树的队列判空int QueueCTreeEmpty(QueueCTree *q){    return(q->CTreeFront==q->CTreeRear);}//二叉树队列判空int QueueBTreeEmpty(QueueBTree *q){    return(q->BTreeFront==q->BTreeRear);}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@出队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*///树队列元素出队CTreeNode *delQueueCTree(QueueCTree *&q){    CTreeNode *ctroot;    if(q->CTreeFront==q->CTreeRear)//队空        return NULL;//返回空指针    q->CTreeFront=(q->CTreeFront+1)%MAX_NODE_NUM;    ctroot=q->CTreeArray[q->CTreeFront];    return ctroot;//返回节点}//二叉树队列元素出队BTreeNode *delQueueBTree(QueueBTree *&q){    BTreeNode *btroot;    if(q->BTreeFront==q->BTreeRear)//队空        return NULL;//返回空指针    q->BTreeFront=(q->BTreeFront+1)%MAX_NODE_NUM;    btroot=q->BTreeArray[q->BTreeFront];    return btroot;//返回节点}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@树转化为二叉树@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/void TreeToBTree(CTreeNode *ctroot,BTreeNode *&btroot)//树转化为二叉树ctroot指向树的根节点,btroot,指向二叉树的跟{    QueueCTree *VisitedCTreeNodes;    QueueBTree *VisitedBTreeNodes;//辅助队列    initQueueCTree(VisitedCTreeNodes);    initQueueBTree(VisitedBTreeNodes);//初始化队列    CTreeNode *ctnode;    BTreeNode *btnode,*p,*LastSibling;    int i;    btroot=(BTreeNode *)malloc(sizeof(BTreeNode));//添加开辟内存空间语句    btroot->data=ctroot->data;//树的根节点作为二叉树的根节点    btroot->lchild=btroot->rchild=NULL;            addQueueCTree(VisitedCTreeNodes,ctroot);//树的跟节点入队        addQueueBTree(VisitedBTreeNodes,btroot);//二叉树的跟节点入队            while(!QueueCTreeEmpty(VisitedCTreeNodes))    {        ctnode=delQueueCTree(VisitedCTreeNodes);//树节点出队            btnode=delQueueBTree(VisitedBTreeNodes);//二叉树节点出队            for(i=0;i<DEGREE;i++)//访问节点所有的孩子节点        {            if(ctnode->children[i]==NULL)//孩子节点访问完毕                break;            p=(BTreeNode *)malloc(sizeof(BTreeNode));//分配二叉树节点            p->data=ctnode->children[i]->data;                    p->lchild=p->rchild=NULL;            if(i==0)                btnode->lchild=p;//长子,作为父节点的做孩子            else                 LastSibling->rchild=p;//作为上一个兄弟节点的右孩子            LastSibling=p;                        addQueueCTree(VisitedCTreeNodes,ctnode->children[i]);//树节点进队列            addQueueBTree(VisitedBTreeNodes,p);//二叉树节点进门队列        }            }}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉树的遍历@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/void Preorder(BTreeNode *T){    if(T)    {        printf("%2c",T->data);        Preorder(T->lchild);        Preorder(T->rchild);    }}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@森林转化为二叉树的算法@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/void ForestToBTree(ForestNode *forest,BTreeNode *btroot)//f待转换的森林,btroot,指向转换后的二叉树的根节点指针{    int i;    BTreeNode *btrees[10];//对应森林中的每棵树的二叉树数组    for(i=0;i<forest->TreeNum;i++)//依次转换森林中的每棵树    {        btrees[i]=(BTreeNode *)malloc(sizeof(BTreeNode));        TreeToBTree(forest->CTreesArray[i],btrees[i]);//转换成二叉树    }    btroot=btrees[0];    for(i=1;i<forest->TreeNum;i++)    {        btrees[i-1]->rchild=btrees[i];//把每棵转换后的二叉树合并成为一棵树    }    printf("转换后的二叉树,先序遍历的结果为:");    Preorder(btroot);}/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@主函数@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/int main(){    int i;    ForestNode *forest;//森林的节点声明    BTreeNode *btree;    CTreeNode *Tree1,*Tree2,*Tree3;//假如有三棵树    forest->CTreesArray[10]={Tree1,Tree2,Tree3};    forest->TreeNum=sizeof(CTreesArray)/sizeof(CTreeNode);//树的数目    forest=(ForestNode *)malloc(sizeof(ForestNode));    scanf("%d",&forest->TreeNum);    for(i=0;i<forest->TreeNum;i++)    {        forest->CTreesArray[i]=CreateSTree();//创建每棵树    }    ForestToBTree(forest,btree);    return 0;} 



报错为:
C/C++ code
--------------------Configuration: ForestToBTree - Win32 Debug--------------------Compiling...ForestToBTree.cppF:\编程\C语言程序\数据结构\二叉树\ForestToBTree.cpp(282) : error C2059: syntax error : '{'F:\编程\C语言程序\数据结构\二叉树\ForestToBTree.cpp(282) : error C2143: syntax error : missing ';' before '{'F:\编程\C语言程序\数据结构\二叉树\ForestToBTree.cpp(282) : error C2143: syntax error : missing ';' before '}'F:\编程\C语言程序\数据结构\二叉树\ForestToBTree.cpp(283) : error C2065: 'CTreesArray' : undeclared identifier执行 cl.exe 时出错.ForestToBTree.obj - 1 error(s), 0 warning(s)

改了很久了,把错误范围缩小到这个,不知道怎么改了,请大家给看看

[解决办法]
forest->CTreesArray[10]={Tree1,Tree2,Tree3};
forest->TreeNum=sizeof(CTreesArray)/sizeof(CTreeNode);//树的数目

CTreesArray[10]这个不是100么??

CTreesArray这个没声明,不能这么写,forest->CTreesArray
[解决办法]
我改的能通过编译 至于逻辑错误 我不负责。
int main()
{
int i;
ForestNode *forest;//森林的节点声明
BTreeNode *btree;
CTreeNode *Tree1,*Tree2,*Tree3;//假如有三棵树
//forest->CTreesArray[10]={Tree1,Tree2,Tree3};

forest->CTreesArray[0]=Tree1;
forest->CTreesArray[1]=Tree2;
forest->CTreesArray[2]=Tree3;

forest->TreeNum=sizeof(forest->CTreesArray)/sizeof(CTreeNode);//树的数目
forest=(ForestNode *)malloc(sizeof(ForestNode));
scanf("%d",&forest->TreeNum);
for(i=0;i<forest->TreeNum;i++)
{
forest->CTreesArray[i]=CreateSTree();//创建每棵树
}
ForestToBTree(forest,btree);
return 0;
}

[解决办法]
C/C++ code
forest->CTreesArray[10]={Tree1,Tree2,Tree3}; 

热点排行