无法打印二叉树中的所有元素

时间:2012-10-11 16:54:53

标签: c binary-tree structure

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

struct node *create_node(int );
struct node *add_node(struct node *,int );
void asce_order(struct node *);
void desc_order(struct node *);


struct node
{
    int data;
    int count;
    struct node *next,*previous;
};

struct node *create_node(int value)
{
    struct node *pnode=(struct node *)malloc(sizeof(node));
    pnode->data=value;
    pnode->count=1;
    pnode->next=pnode->previous=NULL;
return pnode;
}

struct node *add_node(struct node *pnode,int value)
{
    if(pnode==NULL)
    {
        pnode=create_node(value);
        return pnode;
    }

    else if(pnode->data == value)
    {
        (pnode->count)++;
        return pnode;
    }
    else
    {
        if(pnode->data>value)
        {
            return add_node(pnode->previous,value);
        }
        else 
        {
            return add_node(pnode->next,value);
        }
    }


}

void asce_order(struct node *pnode)
{
    int i;
    if(pnode->previous!=NULL)
    asce_order(pnode->previous);

    for(i=0;i<pnode->count;i++)
    printf("%d\n",pnode->data);

    if(pnode->next!=NULL)
    asce_order(pnode->next);
}

void desc_order(struct node *pnode)
{

    int i;
    if(pnode->next!=NULL)
    desc_order(pnode->next);

    for(i=0;i<pnode->count;i++)
    printf("%d\n",pnode->data);

    if(pnode->previous!=NULL)
    desc_order(pnode->previous);
}

void free_variables(struct node *pnode)
{
    if(pnode==NULL)
    return;
    if(pnode->next!=NULL)
    free_variables(pnode->next);
    if(pnode->previous!=NULL)
    free_variables(pnode->previous);

    free(pnode);
}

int main()
{
    int data;
    struct node *head=NULL;
    char option='y';
    int choice;

    while(tolower(option) == 'y')
    {
        printf("enter the data:");
        scanf("%d",&data);
        if(head==NULL)
        head=create_node(data);
        else
        add_node(head,data);
        fflush(stdin);
        printf("enter the option:");
        scanf("%c",&option);    
    }

    printf("enter the choice:\n1.ascending order\n2.Descending order");
    scanf("%d",&choice);
    switch(choice)
    {
        case 1:
        printf("the ascending order:\n");
        asce_order(head);
        break;

        case 2:
        printf("the descending order:\n");
        desc_order(head);
        break;

        default :
        printf("you have entered the wrong choice");
        break;
    }

    free_variables(head);

return 0;
}

**这是我用二进制树编写的代码。它只打印树的头节点。我知道问题在于add_node函数。当我用add_node替换

    if(value==pnode->data)
{
    (pnode->count)++;
    return pnode;
}
if(value<pnode->data)
{
    if(pnode->previous==NULL)
    {
        pnode->previous=create_node(value);
        return pnode->previous;
    }
    else
    {
        return add_node(pnode->previous,value);
    }
}
else
{
    if(pnode->next==NULL)
    {
        pnode->next=create_node(value);
        return pnode->next;
    }
    else
    return add_node(pnode->next,value);
}

第一个代码中出现了什么问题。有人请帮帮我。谢谢**

2 个答案:

答案 0 :(得分:1)

问题出在add_node()

else
{
    if(pnode->data>value)
    {
        return add_node(pnode->previous,value);
    }
    else 
    {
        return add_node(pnode->next,value);
    }
}

如果pnode->previouspnode->nextNULL,则add_node()创建的节点根本不会链接到pnode。您可以按如下方式修改它:

else
{
    if(pnode->data>value)
    {
        pnode->previous = add_node(pnode->previous,value);
    }
    else 
    {
        pnode->next = add_node(pnode->next,value);
    }
    return pnode;
}

答案 1 :(得分:1)

问题是,add_node()会递归树,但不会修改它。函数中没有一个位置可以更改某个节点的previousnext指针。怎么能修改树?它不能。

应该是这样的:

struct node *add_node(struct node *pnode, int value)
{
    if (pnode == NULL)
    {
        pnode = create_node(value);
        return pnode;
    }
    else if (pnode->data == value)
    {
        pnode->count++;
        return pnode;
    }

    if (pnode->data > value)
    {
        if (pnode->previous == NULL)
        {
            return pnode->previous = create_node(value);
        }
        return add_node(pnode->previous, value);
    }
    else 
    {
        if (pnode->next == NULL)
        {
            return pnode->next = create_node(value);
        }
        return add_node(pnode->next, value);
    }
}

整个程序包含少量修复,更改和改进的格式:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node *create_node(int);
struct node *add_node(struct node *, int);
void asce_order(struct node *);
void desc_order(struct node *);

struct node
{
    int data;
    int count;
    struct node *next, *previous;
};

struct node *create_node(int value)
{
    struct node *pnode = malloc(sizeof(struct node));
    pnode->data = value;
    pnode->count = 1;
    pnode->next = pnode->previous = NULL;
    return pnode;
}

struct node *add_node(struct node *pnode, int value)
{
    if (pnode == NULL)
    {
        pnode = create_node(value);
        return pnode;
    }
    else if (pnode->data == value)
    {
        pnode->count++;
        return pnode;
    }

    if (pnode->data > value)
    {
        if (pnode->previous == NULL)
        {
            return pnode->previous = create_node(value);
        }
        return add_node(pnode->previous, value);
    }
    else 
    {
        if (pnode->next == NULL)
        {
            return pnode->next = create_node(value);
        }
        return add_node(pnode->next, value);
    }
}

void asce_order(struct node *pnode)
{
    int i;

    if (pnode->previous != NULL)
    {
        asce_order(pnode->previous);
    }

    for(i = 0; i < pnode->count; i++)
    {
        printf("%d\n", pnode->data);
    }

    if(pnode->next != NULL)
    {
        asce_order(pnode->next);
    }
}

void desc_order(struct node *pnode)
{
    int i;

    if (pnode->next != NULL)
    {
        desc_order(pnode->next);
    }

    for (i = 0; i < pnode->count; i++)
    {
        printf("%d\n", pnode->data);
    }

    if (pnode->previous != NULL)
    {
        desc_order(pnode->previous);
    }
}

void free_variables(struct node *pnode)
{
    if (pnode == NULL)
    {
        return;
    }

    if (pnode->next != NULL)
    {
        free_variables(pnode->next);
    }

    if (pnode->previous != NULL)
    {
        free_variables(pnode->previous);
    }

    free(pnode);
}

int main(void)
{
    struct node *head=NULL;

    head = add_node(head, 2);
    add_node(head, 0);
    add_node(head, 6);
    add_node(head, 7);
    add_node(head, 4);
    add_node(head, 2);
    add_node(head, 8);
    add_node(head, 3);
    add_node(head, 7);
    add_node(head, 5);
    add_node(head, 0);
    add_node(head, 1);
    add_node(head, 6);
    add_node(head, 9);

    printf("ascending order:\n");
    asce_order(head);

    printf("descending order:\n");
    desc_order(head);

    return 0;
}

输出(ideone):

ascending order:
0
0
1
2
2
3
4
5
6
6
7
7
8
9
descending order:
9
8
7
7
6
6
5
4
3
2
2
1
0
0