2013-04-05 4 views
0

У меня есть массив, представляющий граф. Я хотел бы преобразовать его в список смежности типа (i,j) с i<j (поэтому нет двойных данных). У меня есть одна проблема, до сих пор:Как преобразовать матрицу в список смежности в C++

  1. Я не знаю, как получить доступ к массиву и изменить его, я не компилируется код, приведенный ниже, но пока я уверен, что list[node]->.. не правильно ..

Это мой код до сих пор, без массива:

struct node { 
    public: 
     int number; 
     node* next; 
}; 

class AdjList { 
    public: 
     void initialize (node* list); 
     void convert (bool** array, node* list); 
     void make (node*list, int number, int node); 
    private: 
}; 

void AdjList::initialize (node* list) { 
    for (int i=0; i<10; i++) { 
     list[i]->next = NULL; 
    } 
} 

void AdjList::make(node* list, int num, int node) { 
    if (list[node]->next == NULL) { 
     node* New = new node*; 
     list->[node]->next = New; 
     New->next = NULL; 
     New->number = num; 
    } 
    else { 
     node* New = list[node]; 
     while (New->next != NULL) 
      New = New->next; 
     node* New2 = new node*; 
     New->next = New2; 
     New2->number = num; 
    } 
} 

void AdjList::convert(bool** array, node* list) { 
    for (int i=0; i<10; i++) { 
     for (int j=i+1; j<10; j++) { 
      if (array[i][j] == true) 
       make(list, j, i); 
     } 
    } 
} 

int main() { 
    node* list[10]; 
} 
+0

Стандартные контейнеры сделают вашу жизнь намного проще. Посмотрите на 'std :: list'. – Yuushi

+0

Я бы использовал 'std :: list' с' std :: pair' 'typedef std :: list > AdjList;' Теперь 'AdjList' представляет собой список пар. – andre

+2

Do ** not ** использовать 'std :: list', это совершенно неправильный контейнер здесь и будет очень неэффективным. Используйте 'std :: vector'. Кроме того, список смежности на самом деле представляет собой список списков - т. Е. Вектор std :: vector >. –

ответ

0

Я помещу это здесь, может быть, это будет полезно для кого-то:

for (int i=0;i<bound;i++) { 
    for (int j=i+1;j<bound;j++) { 
     help = list[i]; 
     if (Array[i][j] == true) { 
      help2 = new node; 
      if (help->next == NULL) { 
       help->next = help2; 
       help2->number = j; 
       help2->next = NULL; 
      } 
      else { 
       while (help->next != NULL) 
        help = help->next; 
       help->next = help2; 
       help2->next = NULL; 
       help2->number = j; 
      } 
     } 
    } 
} 

Вот как я это сделал.

Смежные вопросы