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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив указателей, Задача на графах 
V
    Опции темы
SNAKE89
Дата 25.12.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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


Это сообщение отредактировал(а) SNAKE89 - 25.12.2007, 22:01
PM MAIL   Вверх
DigitSphinx
Дата 26.12.2007, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

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 = ...;


Это сообщение отредактировал(а) DigitSphinx - 26.12.2007, 08:33


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
SNAKE89
Дата 26.12.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извиняюсь, не совсем корректно задал вопрос. Ма ссив указателей не на структуры, а на списки.Т.е. у нас есть одномоерный массив размерности 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 = ...;

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

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  mass.jpg 104,35 Kb
PM MAIL   Вверх
baldina
Дата 26.12.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

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);
    }
  }
}


Это сообщение отредактировал(а) baldina - 26.12.2007, 17:31
PM MAIL   Вверх
SNAKE89
Дата 26.12.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вроде бы то что надо. smile  Спасибо!

Добавлено через 2 минуты и 22 секунды
Вопрос закрыт
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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