0

关键是打印一个二叉树,例如:

-------x--------
---x-------x----
-x---x---x---x--
x-x-x-x-x-x-x-x-
xxxxxxxxxxxxxxxx

我的代码是:

#include <stdio.h>
#include <math.h>

#define LENGTH 16

void makeBranches(int left, int right, char a[][LENGTH], int);
void display(char a[][LENGTH], int);

void main(){
  int i, lines;
  double a;

  a = log10(LENGTH*2)/log10(2);
  lines = (int)a; 
  char array[lines][LENGTH];

  makeBranches(0, LENGTH-1, array, 0);
  display(array, lines);
}

void makeBranches(int left, int right, char a[][LENGTH], int line){

  if(left >= right){
    a[line][left] = 'X';
    return;
  } else{
    a[line][(right+left)/2] = 'X';
    makeBranches(left, (right+left)/2, a, line+1);
    makeBranches((right+left)/2+1, right, a, line+1); 
  }
}

void display(char a[][LENGTH], int lines){
  int i, j;

  for(i = 0; i < lines; i++){
    for(j = 0; j < LENGTH; j++){
      if(a[i][j] == 'X')
    printf("%c", a[i][j]);
      else
    printf("-");      
    }
    printf("\n");
  }
}

这适用于 4、8、16 的 LENGTH 值,但是当您尝试 32、64 等时,它有一些杂散的 X。例如:

长度 32

---------------X----X-------X---
-------X---------------X--------
---X-------X-------X-------X----
-X---X---X---X---X---X---X---X--
X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

长度 64

-------------------------------X--------------------------------
---------------X-------------------------------X----------------
-------X---------------X---------------X---------------X--------
---X-------X-------X-------X-------X-------X-------X-------X----
-X---X---X---X---X--XX---X--XX---X---X---X---X---X---X---X---X--
X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这必须是某个地方的简单修复,但我只是看不到它。希望有人可以。

4

2 回答 2

3
char array[lines][LENGTH];

这将创建一个空数组,其中每个值都是当前内存中的任何值(有时为 0,但不保证为 0)。这意味着有时,内存会随机包含一个“X”字节。您可以通过将数组初始化为全 0(即空字符,而不是 '0')来解决此问题:

memset(array, 0, LENGTH * lines);

或者:

for(size_t i = 0; i < lines; i++){
    for(size_t j = 0; j < LENGTH; j++){
        a[i][j] = 0;
    }
}
于 2012-11-08T23:39:25.203 回答
2

array是 中的局部变量main,并且您从不初始化它的大部分值。未显式初始化的局部变量一开始就包含“随机垃圾”——这并不是真正的“随机”,但足够“垃圾”,您无法确定某些位置不会意外包含值“X”最初。

首先循环整个数组并将所有位置初始化为已知的值。

(吹毛求疵的语言律师会知道,“随机垃圾”在技术上并不是针对单元化本地人所发生的事情的正确术语,但它足以在实际编程中用作心理模型)。

于 2012-11-08T23:40:24.603 回答