Код:
int _print_t(tnode *tree, int is_left, int offset, int depth, char s[20][255])
{
char b[20];
int width = 5;
if (!tree) return 0;
sprintf(b, "(%03d)", tree->val);
int left = _print_t(tree->left, 1, offset, depth + 1, s);
int right = _print_t(tree->right, 0, offset + left + width, depth + 1, s);
#ifdef COMPACT
for (int i = 0; i < width; i++)
s[depth][offset + left + i] = b[i];
if (depth && is_left) {
for (int i = 0; i < width + right; i++)
s[depth - 1][offset + left + width/2 + i] = '-';
s[depth - 1][offset + left + width/2] = '.';
} else if (depth && !is_left) {
for (int i = 0; i < left + width; i++)
s[depth - 1][offset - width/2 + i] = '-';
s[depth - 1][offset + left + width/2] = '.';
}
#else
for (int i = 0; i < width; i++)
s[2 * depth][offset + left + i] = b[i];
if (depth && is_left) {
for (int i = 0; i < width + right; i++)
s[2 * depth - 1][offset + left + width/2 + i] = '-';
s[2 * depth - 1][offset + left + width/2] = '+';
s[2 * depth - 1][offset + left + width + right + width/2] = '+';
} else if (depth && !is_left) {
for (int i = 0; i < left + width; i++)
s[2 * depth - 1][offset - width/2 + i] = '-';
s[2 * depth - 1][offset + left + width/2] = '+';
s[2 * depth - 1][offset - width/2 - 1] = '+';
}
#endif
return left + width + right;
}
void print_t(tnode *tree)
{
char s[20][255];
for (int i = 0; i < 20; i++)
sprintf(s[i], "%80s", " ");
_print_t(tree, 0, 0, 0, s);
for (int i = 0; i < 20; i++)
printf("%s\n", s[i]);
}
Выход:
.----------------------(006)-------.
.--(001)-------. .--(008)--.
.--(-02) .--(003)-------. (007) (009)
.-------(-06) (002) .--(005)
.--(-08)--. (004)
(-09) (-07)
или
(006)
+------------------------+---------+
(001) (008)
+----+---------+ +----+----+
(-02) (003) (007) (009)
+----+ +----+---------+
(-06) (002) (005)
+---------+ +----+
(-08) (004)
+----+----+
(-09) (-07)
Самое легкое обходное решение (пока патч resetcycle не согласован и применялся), должен использовать встроенный фильтр "divisibleby" с forloop.counter:
{% for entry in blog.entries %}
<div class="{% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}" id="{{ entry.id }}">
{{ entry.text }}
</div>
{% endfor %}
Немного более подробный, но не трудно понять и это работает отлично.
Самый легкий ответ мог бы быть: "сдайтесь и используйте jQuery". Если это приемлемо, это, вероятно, легче, чем борьба с шаблонами Django по чему-то настолько простому.
Существует способ сделать это серверная сторона с итератором, который не сохраняет одновременную копию всех записей:
import itertools
return render_to_response('template.html',
{
"flattened_entries": itertools.chain(*(blog.entries for blog in blogs)),
})
Сдайтесь и используйте Шаблонная Система Jinja2
, я разочаровался в шаблонном языке django, она очень ограничивается в том, что можно сделать с нею. Jinja2 использует тот же синтаксис, что шаблонное использование django, но добавляет много улучшений по нему.
РЕДАКТИРОВАНИЕ/ПРИМЕЧАНИЕ (я знаю, это походит на большой переключатель для просто незначительной проблемы, но в действительности я держал пари, что Вы всегда боретесь с шаблонной системой по умолчанию в django, таким образом, это действительно стоит, и я полагаю, что это сделает Вас более продуктивными в конечном счете.)
можно читать эта статья, написанная ее автором , хотя это является техническим, он упоминает проблему {% цикла %} тег в django.
Джинджа не имеет тега цикла, она имеет метод цикла на цикле:
{% for user in users %}
<li class="{{ loop.cycle('odd', 'even') }}">{{ user }}</li>
{% endfor %}
А главное преимущество Jinja2 состоит в том, что это позволяет Вам использовать логику для представления, поэтому если у Вас есть список изображений, можно поместить их в таблицу, потому что можно запустить новую строку в таблице каждый элементы N, посмотрите, можно сделать, например:
{% if loop.index is divisibleby(5) %}
</tr>
{% if not loop.last %}
<tr>
{% endif %}
{% endif %}
можно также использовать математические выражения:
{% if x > 10 %}
и можно получить доступ функциям Python непосредственно (но некоторая установка требуется, чтобы определять, какие функции должны быть представлены для шаблона)
{% for item in normal_python_function_that_returns_a_query_or_a_list() %}
даже переменные набора..
{% set variable_name = function_that_returns_an_object_or_something() %}