Угу. Ну это не в книге по языку, а в книге по программированию могло и должно было быть. В частности - динамические массивы. В еще большей частности - очереди, стеки, двунаправленные списки и т.п.
Как вариант, структуры меняются на следующее:
typedef struct {
float charge;
char atom_type[MAX_ATOM_TYPE_LEN+1];
} t_one_atom;
typedef struct {
t_one_atom atom;
t_one_residue *next;
} t_one_residue;
typedef struct {
t_one_residue* residue;
} t_protein_data;
При этом имеется возможность использовать оба подхода, которые я описывал. В любом случае у тебя получается следующее:
t_protein_data Г
| t_one_residue -> Г
L | t_one_atom
| t_one_residue -> t_one_residue -> ... -> NULL
L
Количество элементов можно посчитать пройдя от первого до NULL:
t_one_residue *current=protein->residue;
int n=0;
while (current) {
n++;
current=current->next;
};
Таким образом можно попасть к любому элементу списка. Для добавления элемента делается следующее:
t_one_residue *new=(t_one_residue *)malloc(sizeof(t_one_residue));
new->next=NULL;
// заполнение новой структуры
...
// структура заполнена, добавляем ее к списку
t_one_residue *current=protein->residue;
if (current) {
while (current->next) current=current->next;
current->next=new;
} else {
// первый элемент
protein->residue=new;
};
Желательно так же добавить ссылку назад (... *next,*prev), которая будет ссылаться на предыдущий элемент. Проще при навигации будет. Например, при освобождении памяти одного элемента тебе нужно будет сделать следующее:
// считаем, что current - элемент, который нужно удалить
if (current->prev) current->prev->next=current->next;
else
// первый элемент
protein->residue=current->next;
// освобождаем память, занятую содержимым структуры.
// в данном случае структура t_one_atom не является динамической
// и можно просто освободить память, занятую самой структурой current
free(current);
Короче, что-то в этом духе :)
PS. Я незнаю что ты пишешь, но если структуры такими и останутся, то проще сделать вот так:
typedef struct {
float charge;
char atom_type[MAX_ATOM_TYPE_LEN+1];
t_one_atom *next, *prev;
} t_one_atom;
typedef struct {
t_one_atom* residue;
} t_protein_data;
При этом у тебя выбрасывается по большому счету лишняя структура :)