首页 > 解决方案 > 数组编号更改为随机数

问题描述

我是 C 编程的初学者,无法解决问题。我正在尝试打印一个随机生成的二叉树到输出控制台并删除一些叶子(如果需要)。删除后,我需要调整没有那个数字的二叉树所以我我是否从数组中删除了数字并尝试调用主函数来创建一个带有新数组的二叉树。

但是当我回想起创建新二叉树的主要功能时,数组变成了这样,但每次都不同:

223412224   1195327832   4200751   0   -1921113323   30818502   -276547975   32767   0

但它应该是这样的:

7 1 9 4 5 3 8 12 34  

可能是什么问题?我想不通。(当我在再次调用主函数之前尝试打印新数组时,它打印正确)

代码 :

#include<stdlib.h>
#include<stdio.h>
int count=4;
int kat=20;
int number=10;
int onetime=1;
struct bin_tree {
int data;
struct bin_tree * right, * left;
};
typedef struct bin_tree node;

void insert(node ** tree, int val)
{
    node *temp = NULL;
    if(!(*tree))
    {
        temp = (node *)malloc(sizeof(node));
        temp->right = temp->left = NULL;
        temp->data = val;
        *tree = temp;
        return;
    }

    if(val < (*tree)->data)
    {
        insert(&(*tree)->right, val);
    }
    else if(val > (*tree)->data)
    {
        insert(&(*tree)->left, val);
    }

}

node* search(node ** tree, int val)
{
    if(!(*tree))
    {
        return NULL;
    }

    if(val > (*tree)->data)
    {
        search(&((*tree)->left), val);
    }
    else if(val < (*tree)->data)
    {
        search(&((*tree)->right), val);
    }
    else if(val == (*tree)->data)
    {
        return *tree;
    }
}

int getLevelCount(node *tree)
{
    if (tree == NULL)
    {
        return 0;
    }
    int leftMaxLevel = 1 + getLevelCount(tree->left);
    int rightMaxLevel = 1 + getLevelCount(tree->right);
    if (leftMaxLevel > rightMaxLevel)
    {
        return leftMaxLevel;
    }
    else
    {
        return rightMaxLevel;
    }
}

void printLevel(node *tree, int level)
{
    int space;
    space=kat*count;
    int i;
    if (tree != NULL && level == 0)
    {
    for (i=kat; i < space; i++) {
        printf(" ");
    }
    printf("%d", tree->data);
    kat=kat-2;
    }   
    else if (tree != NULL)
    {
        printLevel(tree->left, level - 1);
        printLevel(tree->right, level - 1);
    }

}

void printElements(node *tree)
{
    int i;
    int levelCount = getLevelCount(tree);
    for (i = 0; i < levelCount; i++)
    {
        printLevel(tree, i);
        printf("\n");
    }
}

void deltree(node * tree)
{
    if (tree)
    {
        deltree(tree->left);
        deltree(tree->right);
        free(tree);
    }
}

int RandomNumberGenerator(int value)
{
    int i,out;
    out=rand() % 101;
    return out; 
}

int menu(int islem){
    int secim,sil;
    printf("do you wish to delete a number from tree\n");
    printf("1-yes\n");
    printf("0-no\n");
    scanf("%d",&secim);
    if (secim==1){
        printf("Enter the number you want to delete: \n");
        scanf("%d",&sil);
        return sil;
    }
    else{
        return 0;
    }
}

void main()
{
    srand(time(NULL));
    int random_numbers[number];
    int i,islem,pos;
    node *root;
    node *tmp;
    root = NULL;
    while (onetime==1){
        for(i = 0; i < number; i++){
            random_numbers[i] = RandomNumberGenerator(i);
        }
    onetime=0;
    }

    printf("\n");
    printf("Array : ");
    for(i = 0; i < number; i++){
        printf("  %d ",random_numbers[i]);
    }

    for(i=0;i<number;i++){
        insert(&root, random_numbers[i]);
    }

    printf("tree\n");
    printElements(root);    
    islem=menu(1);
    while(islem!=0){
        tmp = search(&root, islem);
        if (tmp)
        {
        printf("Searched node=%d\n", tmp->data);
        for(i = 0; i < number; i++){
            if(random_numbers[i]==islem){
                pos=i+1;
                for(i=pos-1; i<number-1; i++)
                {
                    random_numbers[i] = random_numbers[i + 1];
                }
                number--;
                printf("Node found and deleted\n");
                islem=0;
                main();
            }
        }
}
        else
        {
            printf("Couldnt find node.\n");
            islem=menu(1);
        }
    }
}   

标签: cbinary-tree

解决方案


编译时,始终启用警告。然后修复这些警告。

OP 发布的代码导致编译器输出:

gcc   -O1  -ggdb -Wall -Wextra -Wconversion -pedantic   -c "untitled2.c"  -I. (in directory: /home/richard/Documents/forum)
untitled2.c: In function ‘RandomNumberGenerator’:
untitled2.c:119:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i,out;
         ^
untitled2.c:117:31: warning: unused parameter ‘value’ [-Wunused-parameter]
 int RandomNumberGenerator(int value)
                               ^~~~~
untitled2.c: In function ‘menu’:
untitled2.c:124:14: warning: unused parameter ‘islem’ [-Wunused-parameter]
 int menu(int islem){
              ^~~~~
untitled2.c: At top level:
untitled2.c:140:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
 void main()
      ^~~~
untitled2.c: In function ‘main’:
untitled2.c:142:11: warning: implicit declaration of function ‘time’ [-Wimplicit-function-declaration]
     srand(time(NULL));
           ^~~~
untitled2.c:142:11: warning: conversion to ‘unsigned int’ from ‘int’ may change the sign of the result [-Wsign-conversion]
untitled2.c: In function ‘search’:
untitled2.c:55:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
untitled2.c: In function ‘menu’:
untitled2.c:129:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&secim);
     ^~~~~~~~~~~~~~~~~~
untitled2.c:132:9: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&sil);
         ^~~~~~~~~~~~~~~~
Compilation finished successfully.

注意:编译成功完成。只是意味着编译器对代码中的问题使用了一些“解决方法”,而不是生成了正确的代码。

此警告:untitled2.c:61:1:警告:控制到达非无效函数 [-Wreturn-type]的结尾 是关键

关于:

            number--;
            printf( "Node found and deleted\n" );
            islem = 0;
            main(  );
        }
    }
}

最后一个右大括号'}'结束函数,所有以下代码main()将永远不会执行

关于:

while ( onetime  ==  1 )
{
    for( i  =  0; i < number; i++ )
    {
        random_numbers[i]  =  RandomNumberGenerator( i );
    }
    onetime = 0;
}

循环while()只会执行一次,那么为什么要有循环呢?建议:

if ( onetime  ==  1 )
{
    for( i  =  0; i < number; i++ )
    {
        random_numbers[i]  =  RandomNumberGenerator( i );
    }
    onetime = 0;
}

关于功能:

int menu( int islem )

不使用参数中的过去。那为什么要有呢?建议:

int menu( void )

并将所有调用更改menu()为不传入参数


推荐阅读