Вот мой код для генерации GLL для строкового ввода: a, (b, c), d, где (b, c) будет связан как дочерний элемент при следующей ссылке a.
GLL* generateList(char poly[])
{
GLL* newNode = NULL, *first = NULL, *ptr = NULL;
while (poly[i] != '\0')
{
if (poly[i] == ')')
{
return first;
}
else
{
if (poly[i] != ',')
{
if (poly[i] != '(')
{
newNode = createNode(poly[i], 0);
}
else
{
++i;
newNode = createNode('#', 1);
newNode->dlink = generateList(poly);
}
}
}
if (first != NULL)
{
ptr = first;
while (ptr->next != NULL)
{
ptr = ptr->next;
}
ptr->next = newNode;
}
else
{
first = newNode;
}
i++;
}
return first;
}
А вот структура, которую я использовал для каждого узла.
typedef struct gll
{
int tag;
struct gll* next;
char data;
struct gll* dlink;
} GLL;
Я не нахожу способ добавить эту дочернюю ссылку в родительскую ссылку всякий раз, когда открывается скобка.Программа работает в цикле.
Примечание: я объявил i = 0 как глобальную переменную для хранения позиции символа.
Редактировать: вот функция createNode
GLL* createNode(char value, int flag)
{
GLL* newNode;
newNode = (GLL *) malloc(sizeof(GLL)*1);
newNode->data = value;
newNode->dlink = NULL;
newNode->tag = flag;
newNode->next = NULL;
return newNode;
}