回 帖 发 新 帖 刷新版面

主题:通过树的线性表示生成一棵树

#include<stdio.h>
#include<malloc.h>
#define MAXM 10
#define MAXN 100
struct node {
    int lev;
    char data;
    struct node *child[MAXM];
    struct node * parent;
};

typedef struct node NODE;//为什么要用typedef 定义 上下两行

typedef struct dnode{
    int lev;
    char data;
}DNODE;
DNODE a[MAXN];
int m,n;

                 //前序遍历

void r_preorder(NODE *t,int m)      //注意定义数组和指针的变量前的星号
{
    int i;
    if(t!=NULL)
    {
        printf("%c ",t->data);
        for(i=0;i<m;i++)
            r_preorder(t->child[i],m);
    }
}



NODE *lev_tree(DNODE a[],int m,int n)
{
    int i,j;
    NODE *root,*p,*q;
    if(n<1) return (NULL);
    root=(NODE *)malloc(sizeof(NODE));
    root->lev=a[0].lev;
    root->data=a[0].data;
    for(i=0;i<m;i++)
        root->child[i]=NULL;
    root->parent=NULL;
    p=root;
    for(i=0;i<n;i++)
    {
    
        q=(NODE *)malloc(sizeof(NODE));
        q->lev=a[i].lev;
        q->data=a[i].data;
        for(j=0;j<m;j++)
            q->child[j]=NULL;
        while(q->lev<=p->lev)
            p=p->parent;
            q->parent=p;
            j=-1;
            while(p->child[++j]!=NULL);
            p->child[j]=q;
            p=q;
        }
        return (root);
}




int main()
{
    int s;
    char c;
    NODE * root;
    printf("输入层号和字符\n");
    for(int k=0;k<MAXN;k++)
    {
        scanf("%d%c",&s,&c);
        if(s==-1) break;
        a[k].lev=s;           
        a[k].data=c;
    }
    root=lev_tree(a,3,k);
    r_preorder(root,3);
    return (1);
}

题目是:
通过树的线性表示生成一棵树

请大家帮忙调试一下,我在输入完毕后就会报错,不再输出。谢谢。







        


回复列表 (共4个回复)

沙发

for(i=0;i<n;i++)
    {
    
        q=(NODE *)malloc(sizeof(NODE));
        q->lev=a[i].lev;
        q->data=a[i].data;
        for(j=0;j<m;j++)
            q->child[j]=NULL;
        while(q->lev<=p->lev)
            p=p->parent;
            q->parent=p;
            j=-1;
            while(p->child[++j]!=NULL);
            p->child[j]=q;
            p=q;
        }


后来我看了一下,n应该从1循环起,就对了。

板凳

void CEX_Draw1_0104View::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    p0=p1=point;
    

    CView::OnLButtonDown(nFlags, point);
    
}

void CEX_Draw1_0104View::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default

    if(nFlags==MK_LBUTTON)
    {
        CClientDC dc(this);
        pDefPen=dc.SelectObject(pPreviewPen);
        dc.SetROP2(R2_XORPEN);
        dc.MoveTo(p0);
        dc.LineTo(p1);
        p1=point;
        dc.MoveTo(p0);
        dc.LineTo(p1);
        dc.SelectObject(pDefPen);


    
    CView::OnMouseMove(nFlags, point);
}


void CEX_Draw1_0104View::OnLButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
    p1=point;
    pMyPen=new CPen(0,0,RGB(0,0,255));
    pDefPen=dc.SelectObject(pMyPen);
    dc.MoveTo(p0);
    dc.LineTo(p1);
    dc.SelectObject(pDefPen);
    pMyPen->DeleteObject();

    CView::OnLButtonUp(nFlags, point);
}

为什么OnMouseMove函数中画直线的dc.MoveTo(p0);  dc.LineTo(p1);会出现两次??有什么区别??

3 楼

不知道画出来的效果是什么样子。是感觉那里有些多余

不会是画一棵树吧,:)

4 楼

因为它调用了
            dc.SetROP2(R2_XORPEN);
        dc.MoveTo(p0);
        dc.LineTo(p1);
        p1=point;
        dc.MoveTo(p0);
        dc.LineTo(p1);
中的SetROP2()函数。 使得进行了一次抑或。在下次画直线之前先抑或一次使得上次画的直线消失了。然后才把新的点赋给p1。画出直线。

我来回复

您尚未登录,请登录后再回复。点此登录或注册