У меня проблемы с пониманием функции v_unshift, поскольку она проверяет v->ofs как 0 и создает подсписок, это означает, что подсписок заполнен, но в начальном случае создания vlist он имеет подсписок и ofs как 0, затем почему необходимо создать подсписок при первой вставке.
Также, пожалуйста, объясните значения of и buf, так как я хочу лучше это понять.
struct sublist
{
struct sublist* next;
int *buf;
};
/*
* Vlist Node Declaration
*/
typedef struct vlist_t
{
sublist* head;
int last_size, ofs;
}*vlist;
/*
* Vlist Class Declaration
*/
class v_list
{
public:
sublist *sublist_new(int);
vlist v_new();
void v_del(vlist);
int v_size(vlist);
int* v_addr(vlist, int);
int v_elem(vlist, int);
int* v_unshift(vlist, int);
int v_shift(vlist);
v_list()
{}
};
*
* Creating new sublist
*/
sublist *v_list::sublist_new(int s)
{
sublist* sub = (sublist *)malloc(sizeof(sublist) + sizeof(int) * s);
sub->buf = (int*)(sub + 1);
sub->next = 0;
return sub;
}
/*
* Creating Vlist from Sublist
*/
vlist v_list::v_new()
{
vlist v = new(vlist_t);
v->head = sublist_new(1);
v->last_size = 1;
v->ofs = 0;
return v;
}
/*
* Deleting Vlist
*/
void v_list::v_del(vlist v)
{
sublist *s;
while (v->head)
{
s = v->head->next;
free(v->head);
v->head = s;
}
free(v);
}
/*
* Compute Length of Vlist
*/
int v_list::v_size(vlist v)
{
return v->last_size * 2 - v->ofs - 2;
}
int *v_list::v_addr(vlist v, int idx)
{
sublist *s = v->head;
int top, i;
top = v->last_size;
i = idx + v->ofs;
if (i + 2 >= (top last_size == 1 && v->ofs == 1)
{
coutofs == v->last_size)
{
v->ofs = 0;
if (v->last_size > 1)
{
s = v->head;
v->head = s->next;
v->last_size >>= 1;
free(s);
}
}
return x;
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... m-attachin
Может ли кто-нибудь объяснить мне концепцию Vlist? если вы этого не знаете, я прилагаю код для этого, ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение