数组数字变为随机数

Array numbers changes to random numbers

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

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

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);
        }
    }
}   

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

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.

注意:编译成功完成。 只是意味着编译器使用了一些 'workaround' 代码中的问题,而不是生成了正确的代码。

此警告: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()的调用更改为不传递参数