c - 数组编号更改为随机数
问题描述
我是 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);
}
}
}
解决方案
编译时,始终启用警告。然后修复这些警告。
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()
为不传入参数
推荐阅读
- javascript - 在构建时执行 NormalModule,加载器构建完成后,保存到 json 文件
- c# - 如何检测表中哪一列的值已更新
- javascript - 如何在reactjs中的map函数中设置选定元素的样式
- javascript - 如何将 azure 广告集成到在 azure 中也使用 REST API 的 React Web 应用程序
- javascript - 如何在模板标签上条件渲染 vue.js?
- python - 删除重复的列表元素-python
- keras - Keras seq2seq 填充
- php - 数据库中字符串的本地和生产解码之间的区别
- swift - AVPlayer 需要很多时间才能从 url 开始播放歌曲
- javascript - 使用 paste.image.js 保存 Img