Когда мой вклад выглядит так:
11
Гарри Кейт Фред Кэрол
Моя матрица смежности должна поставить Гарри на [7] [7], Кейт на [7] [10], Фред на [7] [5] и Кэрол на [7] [2]. Тем не менее, Кэрол & Кейт вставляют в других местах в прил. матрица также. Я предполагаю, что это как-то связано со стеком и кучей памяти, но я не уверен, как найти ошибку. При использовании инструкций cout проблем не возникает.
Код ниже
#include <iostream>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <sstream>
using namespace std;
class Element {
public:
string name;
int weight;
string color;
//default constructor
Element(void) {
name = "";
weight = 0;
color = "white";
}
//parameterized constructor
Element(string first) {
name = first;
weight = 0;
color = "white";
}
void setBlack() {
color = "black";
}
};
class AdjMatrix {
public:
int size;
Element ***adj_matrix;
AdjMatrix(void) {
size = 0;
adj_matrix = NULL;
}
AdjMatrix(int n) {
size = n; //sets the size to n
adj_matrix = new Element **[size];
for (int i = 0; i < size; i++) {
adj_matrix[i] = new Element *[i];
}
}
//Destructor class
~AdjMatrix(void) {
delete adj_matrix;
adj_matrix = NULL;
}
//initialize the array with empty elements
void initialize_matrix() {
Element *add_element = new Element("");
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
adj_matrix[i][j] = add_element;
}
}
};int convertToASCII(string letter)
{
int x = letter.at(0);
int index = x - 65;
return index;
};
int main(int argc, char *argv[]) {
string table_size;
cout<<"";
getline(cin,table_size);
int size = atoi(table_size.c_str());
AdjMatrix *myGraph = new AdjMatrix(size);
myGraph->initialize_matrix();
string line;
getline(cin, line);
while (getline(cin,line))
{
if (line.empty())
break;
else {
int x = convertToASCII(line);
stringstream linestream(line);
string temp;
while (linestream >> temp) {
int z = convertToASCII(temp);
myGraph->adj_matrix[x][z] = new Element(temp);
}
}
}
//Print graph
for (int i = 0; i < myGraph->size; i++) {
for (int j = 0; j < myGraph->size; j++)
cout<<"["<<i<<"]["<<j<<"]: "<<myGraph->adj_matrix[i][j]->name<<endl;
}
return 0;
}
Ваша программа имеет следующую проблему, которая должна быть исправлена.
//default constructor
Element(void)
Конструктор должен быть определен как
//default constructor
Element()
В вашем AdjMatrix(int)
ctor, вы неправильно строите свою треугольную матрицу (если это то, к чему вы стремитесь). Попробуй это:
AdjMatrix(int n) {
size = n; //sets the size to n
adj_matrix = new Element **[size];
for (int i = 0; i < size; i++) {
adj_matrix[i] = new Element *[i + 1]; // Or size for a square matrix
}
}