C语言 数组数字更改为随机数



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

但是当我回想起制作新二叉树的 main 函数时,数组变成了这样的东西,但每次都不同:

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 treen");
printf("1-yesn");
printf("0-non");
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("treen");
printElements(root);    
islem=menu(1);
while(islem!=0){
tmp = search(&root, islem);
if (tmp)
{
printf("Searched node=%dn", 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 deletedn");
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.

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

此警告:untitled2.c:61:1:警告:控制达到非无效函数[-Wreturn类型]的末尾至关重要

关于:

number--;
printf( "Node found and deletedn" );
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 )

不使用过去 in 参数。 那么为什么会有呢? 建议:

int menu( void )

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

相关内容