Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Массив указателей


Автор: SNAKE89 25.12.2007, 21:58
Нужно по заданию сделать так чтобы пользователь мог вводить граф с клавиатуры, количество ребер и вершин также вводятся с клавиатуры, и он хранился в памяти в виде списка инцидентности. Соответственно массив должен быть динамическим. Собственно вопрос, как динамически создать массив указателей на структуры, допустим следующего вида
Код

struct Elem
{
    int rebro;
    struct Elem *next;
};

И как потом  записывать в него данные, соблюдая порядок в списке, т.е. вершина 2 должна быть в списке ближе к началу, чем вершина 7. smile 

Работа выполняется на Borland C 3.1

Автор: DigitSphinx 26.12.2007, 07:32
Код

Elem ** Mass = new Elem *[N];
for (int i = 0; i < N; i++)
    Mass[i] = new Elem[M];
Mass[l][k].rebro = …;
Mass[l][k].next->rebro = ...;
//или
Elem *  Mass = new Elem [N * M];
Mass[l * N + k].rebro = …;
Mass[l * N + k].next->rebro = ...;

Автор: SNAKE89 26.12.2007, 16:54
Извиняюсь, не совсем корректно задал вопрос. Ма ссив указателей не на структуры, а на списки.Т.е. у нас есть одномоерный массив размерности N(N-число вершин).В каждой ячейке массива храниться указатель на начало списка. В списке по возрастанию расположены вершины инцидентные вершине совпадающей с номером ячейки.
Таким образом у нас есть только один массив размерности N. И колчиство реберможно постоянно менять.Пример кинул в прикрепленном файле. Проблема в том что никак не могу сопоставить указатели находящиеся в массиве со списками, ругается на не совметсимость типов данных.
А судя по
Код

Elem ** Mass = new Elem *[N];
for (int i = 0; i < N; i++)
    Mass[i] = new Elem[M];
Mass[l][k].rebro = …;
Mass[l][k].next->rebro = ...;

вы предлагаете сделать двумерный массив, что не совсем корректно будет отвечать поставленной задаче.

Автор: baldina 26.12.2007, 17:26
Код

void addEdge (struct Elem **head, int rebro)
{
  Elem *e = new Elem;
  e->rebro = rebro;

  if (*head == NULL || (*head)->rebro > e->rebro)
  {
    e->next = *head;
    *head = e;
    return;
  }

  for (Elem *p = *head; p->next != NULL; p = p->next)
    if (e->rebro < p->next->rebro)
    {
      e->next = p->next;
      p->next = e;
    }
}

int main ()
{
   // ввести N - число вершин
   ...
   Elem **array = new Elem*[N];
   for (int i=0; i < N; ++i)
     array[i] = NULL;

  for (int i = 0; i < N; ++i)
  {
    // ввести M - число ребер, инцидентных i-й вершине
    ...
    for (int j=0; j < M; ++j)
    {
       // ввести rebro - номер ребра
       ...
       addEdge (&array[i], rebro);
    }
  }
}

Автор: SNAKE89 26.12.2007, 20:16
Вроде бы то что надо. smile  Спасибо!

Добавлено через 2 минуты и 22 секунды
Вопрос закрыт

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)