Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив указателей переменной длины, Массив пополняется, длина увеличивается 
:(
    Опции темы
Cybernetic10
Дата 12.5.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Требуется создать массив указателей неизвестной длины. Причем пустых элементов в массиве ради экономии памяти быть не должно. То есть сначала я иду по массиву(размер текущего массива есть, nChilds), когда дохожу до конца, нужно в конец приписать еще один указатель.
Речь идет о деревьях. Суть - в каждой вершине должно быть не более N указаьелей на другие вершины. Но может быть и существенно меньще N. Поэтому нужно пополнять массив поэлментно. Использую realloc. Но запутался с указателями. Помогите пожалуйста поправить строку с realloc учитывая, что нужно писать в j-ый элемент массива До этого был j-1 элемент..

Код

struct Node
{
    char letter;
    unsigned int frequency;
    BYTE nChilds;
    Node **pNode;
    Node *parent;
};
...
Node* currentTreeElement;
...
if ( j == currentTreeElement->nChilds)
{
    currentTreeElement->nChilds++;
    currentTreeElement->pNode = (Node**) realloc( currentTreeElement->pNode, currentTreeElement->nChilds*sizeof(Node*) );
    currentTreeElement->pNode[j] = CreateElement(chSymbol, currentTreeElement);
}
...
Node* CreateElement(char inputLetter, Node* parent)
{
    Node* newElement = new Node;
    newElement->letter = inputLetter;
    newElement->frequency = 1;
    newElement->nChilds = 0;
    newElement->parent = parent;
    return newElement;
}

PM MAIL   Вверх
bsa
Дата 12.5.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



у тебя в той строке все в порядке.
Вот только ты уверен, что j будет не больше nChilds?
PM   Вверх
math64
Дата 13.5.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Возможно, лучше будет такая структура:
Код

struct Node
{
    char letter;
    unsigned int frequency;
    struct Node* parent;
    struct Node* firstChild;
    struct Node* lastChild;
    struct Node* nextBrother;
    struct Node* prevBrother;
};

Если не нужен поиск дочернего узла по идексу, а производится перебор только по порядку. realloc() не нужен.
Если не нужен перебор в обратном порядке, можно обойтись без  Node* prevBrother;

PM   Вверх
math64
Дата 13.5.2009, 09:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



В текущей реализации:
В createElement нужно добавить:
Код

newElement->pNode = NULL;

Перед realloc:
Код

    if (j == 0)
      currentTreeElement->pNode = (Node**) alloc(sizeof(Node*));
    else
      currentTreeElement->pNode = (Node**) realloc( currentTreeElement->pNode, currentTreeElement->nChilds*sizeof(Node*) );

Удалять:
Код

   free(currentTreeElement->pNode);

PM   Вверх
bsa
Дата 13.5.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



math64, realloc может выступать и в качестве malloc (если передать NULL), и в качестве free (если передать нулевой размер области).
PM   Вверх
Cybernetic10
Дата 15.5.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



math64, спасибо! Предложенный тобой альтернативный вариант структуры очень подходит для моей задачи. И не буду заморачиваться с указателями на указатели smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.