Hello everyone,

Can anyone please help me figure out what I miss or did wrong to my code for not to compile?

below are the code I did and I just couldn't figure it out what I missed. Thanks.

#include <iostream>


typedef struct NodeType {
	char name;		// the node's name
	int weight;		// the node's current weight
	int pi;			// the node's parent
} Node;

int graph[6][6] = {
	{0,1,2,0,0,0},
	{1,0,5,9,0,10},
	{2,5,0,3,0,0},
	{0,9,3,0,3,0},
	{0,0,0,3,0,2},
	{0,10,0,0,2,0}
};

Node node[6];
bool visited[6];

int getMinNode() 
{
	int index = -1;
	for (int i=0; i<6; i++) 
	{
		if (!visited[i]) 
		{
			index = i;
			break;
		}
	}
	for (int j=i+1; j<6; j++) 
	{
		if (node[j].weight < node[index].weight) index = j;
	}
	return index;
}

void printResult(char *message) {
	printf("%s\n", message);
	for (int i=0; i<6; i++) {
		if (node[i].pi >= 0) {
			int parent = node[i].pi;
			printf("%c -- %c \n", node[i].name, node[parent].name);
		}
	}
}

void main() {	// Prim's algorithm
	
	// Initialize the 6 nodes
	for (int i=0; i<6; i++) {
		node[i].name = 'A'+i;
		node[i].pi = -1;		// no parent
		node[i].weight = 10000;	// 10000 as infinity
		visited[i] = false;
	}
	// Start from node 'A'
	node[0].weight = 0;
	int index = getMinNode();

	// Prim's algorithm
	while (index >= 0) {
		visited[index] = true;
		for (int j=0; j<6; j++) {
			if (j==index) continue;
			if (graph[j][index] == 0) continue;
			int weight = node[index].weight + graph[j][index];
			if (weight < node[j].weight) {
				node[j].weight = weight;
				node[j].pi = index;
			}
		}
		index = getMinNode();
	}
	
	// Print out the result
	printResult("Final Minimum Spanning Tree:");
}

Edited 5 Years Ago by Nick Evan: Added CODE-tags

So how can I define it?? Thanks. Please give me examples

Think about what you're doing.

You want to start j at i + 1, is there any orther variable that you could use for this, that IS defined at for( int j=... ) ?

If you declare a variable inside the for statement like this, it is ONLY visible inside the for block, after that you can not use it any more (unless you re-define it).

Comments
This thread is not marked as answered. My post is a suggestion. And how is int i = 0; messy? And the negative counter for being an arrogant self rightous person. Just pm me dude. Or reply in the thread.
for (int i=0; i<6; i++) // i is defined for this block
	{
		if (!visited[i]) 
		{
			index = i;
			break;
		}
	} // i definition ends here
	for (int j=i+1; j<6; j++) // i is not defined
	{
		if (node[j].weight < node[index].weight) index = j;
	}

If you want to use i then do the following:

int i = 0; // i is now defined for the main program
for (; i<6; i++) // i is used in this block
	{
		if (!visited[i]) 
		{
			index = i;
			break;
		}
	} 
	for (int j=i+1; j<6; j++) // i is still defined since it is still in the main block
	{
		if (node[j].weight < node[index].weight) index = j;
	}

Edited 5 Years Ago by MasterGberry: n/a

Comments
Just because I don't like lamb.
Don't give people exact code solutions for their question, let them think so that they will actually learn.

To fix your problem

Just put this before line 53. (I think)

int i = 0;

Edited 5 Years Ago by FutureWebDev: n/a

Comments
Thread has already been answered 3 times, beside that - your suggestion is messy (the second int i will mask the one you wish to add)
This article has been dead for over six months. Start a new discussion instead.