Проблемы с DisjointSet - PullRequest
       3

Проблемы с DisjointSet

0 голосов
/ 09 ноября 2010

Я работаю над заданием DisjointSet в C уже пару дней.Я понимаю, что функции find (без сжатия путей) используют ранжирование в ссылке на функцию при объединении набора.Но у меня проблемы с синтаксисом C.

Мы должны создать массив записей, содержащих ранг и ключ для набора.поэтому моя структура выглядит так:

typedef struct DisjointSet_t {
  int data;
  int key;
} DisjointSet;

Моя проблема заключается в объявлении массива для манипулирования множеством.Что-то не так со мной, инициализируя массив для набора.Вот фрагмент кода CreateSet:

static DisjointSet *S;

void CreateSet(int numElements){  
  DisjointSet *t;

  if (numElements > 0){
    t = (DisjointSet *)malloc(sizeof(DisjointSet));
    }

  if(S != NULL){
    S = t[numElements+1];
  }  
}

Если бы я реализовал это в Java, я думаю, это было бы немного проще.Как я могу улучшить это?Я что-то упускаю из понимания того, как инициализировать массивы классов в C?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

Если вы пытаетесь выделить массив, вам необходимо выделить место для всех элементов массива: malloc(sizeof(DisjointSet) * numElements).

Также вы можете назначить S, как описывает Джереми Саймон.

2 голосов
/ 09 ноября 2010

Хммм ... с

malloc(sizeof(DisjointSet))

вы резервируете место для одного объекта типа DisjointSet.Чтобы выделить пространство для 20 объектов, вам нужно умножить ...

malloc(20 * sizeof(DisjointSet))

, и, если у вас есть 20 объектов, в массиве массив изменяется от 0 до 19.

1 голос
/ 09 ноября 2010

Переменные S и t имеют тип DisjointSet *, поэтому вы должны иметь возможность просто назначить t для S.

if (S != NULL)
{
    S = t;
}

Также вам нужно инициализировать статический S в NULL

static DisjointSet *S = NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...