Реализация массива связанных списков - PullRequest
0 голосов
/ 12 февраля 2020

Работая с графиками прямо сейчас, и довольно застрял при создании массива связанных списков (список смежности), пробовал несколько вариантов, но получил эту ошибку:

[Ошибка] нет соответствия для оператора ' >> '(типы операндов:' std :: istream {aka std :: basic_istream} 'и' node * ')

class node {
    int data;
    node* next;
    node(int x){
        data = x;
        next = NULL;
    }   
};

void SS_in(){
    int nver;
    node **listik;
    cout << "vvedite kolvo vershin";
    cin >> nver;
    for (int i=0; i<nver;i++){
        cout << "V" << i << ": ";
        cin >> listik[i];
    }
}

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Я буду вмешиваться только при наличии ошибки компиляции, а не о необходимости создания связанного списка, поскольку ваш запрос неясен.
Вы должны перегрузить оператор >> для вашего класса, прежде чем использовать его. :

#include <iostream> 
using namespace std; 

class node {
public :
    int data;
    node* next;

    node(int x){
        data = x;
        next = NULL;
    }   

    friend istream & operator >> (istream &in,  node &myNode); 
};

istream & operator >> (istream &in,  node &myNode) 
{ 
    cout << "Enter node data :"<< endl;
    in >> myNode.data; 

    return in; 
} 

int main()
{
    node myNode(2);
    cin >> myNode;

    return 0;
}
0 голосов
/ 12 февраля 2020

Этот код:

node **listik;
...
...
    cin >> listik[i];

неверен в двух отношениях.

1) listik неинициализирован и, следовательно, listik[i]. Другими словами - вы пытаетесь прочитать в память, которой ваша программа (скорее всего) не принадлежит.

2) Поскольку listik является «указателем на указатель на узел», listik[i] является "указатель на узел". Просить пользователя ввести значение указателя не имеет смысла, и, к счастью, вы получили сообщение об ошибке компиляции.

Теперь ваш реальный вопрос:

... создание массив связанных списков ...

Помните, что связанный список начинается с элемента head, который является "указателем на узел". Таким образом, чтобы получить массив связанных списков, вам нужен массив «указатель на узел».

Например:

node* arr_of_lists[20];

будет массивом с 20 «указателем на узел». И, следовательно, что-то, что вы можете использовать в качестве массива из 20 связанных списков.

Или в стиле, более похожем на c ++:

std::array<node*, 20> arr_of_lists;

Или с динамическим распределением c, чтобы вы могли контролировать размер массива во время выполнения:

node** arr_of_lists = new node*[desired_size];

При чтении данных от пользователя вам потребуется две информации:

1) Значение данных для добавляемого узла

2) В какой из (например, 20) связанных списков добавить узел.

Как:

cin >> data;
cin >> list_index;

// Skipping error checks here... but must be added to the real code

// You need a function like this to creat an new node holding
// data and insert the new node to the linked list at index "list_index"
list_insert(arr_of_lists, list_index, data);
0 голосов
/ 12 февраля 2020

Определены только узел и граф (listik).

На этом этапе ошибка может быть исправлена:

#include <iostream>
using namespace std;

class node {
public:
  int data;
  node* next;
  node (int x) {
    data = x;
    next = NULL;
  }
};

void SS_in () {
  int nver;
  std::cout << "vvedite kolvo vershin";
  std::cin >> nver;

  node** listik = new node * [nver];

  int tempData;
  for (int i = 0; i < nver; i++) {
    cout << "V" << i << ": ";
    cin >> tempData;
    listik[i] = new node(tempData);
  }
}

void main () {
  SS_in ();
}

Должен быть добавлен класс adjacencyList (связанный список).

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