Некоторые люди предпочитают использовать структуру данных «веревка» для хранения строки символов неограниченной длины, а не непрерывной строки (строка C).
Упрощенная банка веревкибыть определено что-то вроде:
#include <stdio.h>
struct non_leaf_rope_node{
char zero;
union rope* left_substring;
union rope* right_substring;
// real rope implementations have a few more items here
};
#define rope_leaf_max ( sizeof( struct non_leaf_rope_node ) )
typedef union rope {
char rope_data[ rope_leaf_max ];
struct non_leaf_rope_node pointers;
} rope;
void print( union rope *node ){
if( node->rope_data[0] != '\0' ){
// short literal data
fputs( node->rope_data, stdout );
}else{
// non-root node
print( node->pointers.left_substring );
print( node->pointers.right_substring );
};
};
// other details involving malloc() and free() go here
int main(void){
rope left = { "Hello," };
rope right = { " World!" };
rope root = {0,0,0};
root.pointers.left_substring = &left;
root.pointers.right_substring = &right;
print( &root );
return 0;
};
Веревка, содержащая меньше символов Rope_leaf_max, хранится так же, как строка C с нулевым символом в конце.Веревка, содержащая более чем символ Rope_leaf_max, сохраняется как корневой non_leaf_rope_node, указывающий на левую и правую подстроки (которые могут, в свою очередь, указывать на левую и правую подстроки), в конечном итоге указывающие на конечные узлы и конечные узлыкаждый из них содержит хотя бы один символ полной строки.
В веревке всегда хранится хотя бы один символ, поэтому мы всегда можем сказать: если первый байт узла веревки не равен нулю, этот узел является листомузел хранения буквенных символов.Если первый байт узла веревки равен нулю, этот узел хранит указатели на левую и правую подстроки.(Реальные реализации веревки часто имеют третий тип узла веревки).
Часто использование веревок требует меньше общего пространства ОЗУ, чем использование строк С.(Узел, содержащий фразу, такую как «Нью-Йорк», может многократно использоваться в одной веревке или в некоторых реализациях, совместно используемых двумя веревками).Иногда использование веревок быстрее, чем использование строк С.