## stevo356

Hi guys, I'm both new here, and new to c++ so be gentle!

Over the past short time we've been looking at c++ on our course, but I don't believe it has been taught too well, and I'm struggling to understand what should really be basic concepts? An assignment we've been issued with asks us to enter the details of 40 hills randomly in the form of a linked list (so the details would automatically be inserted randomly). Then further to that, the linked list trasnferred into an array then sorted. (displayed in the cout)

The problem I'm having is I don't know where to start - I've used and modified code from an earlier lab session, but I'm at my wits end trying to understand it and work out how to do what I want.

Here is the code from my header file to show the struct I've setup, but I've no idea how to take it to the level that's expected of me.

If anyone can help or provide any pointers I'd be very greatful - as I'm really hoping to do well in learning c++ beyond this assisgnemt.

``````#include <iostream>
using namespace std;

//define a node as a structure
struct Hills{       //a structure that can be
int hillsize;
int gridref;
int distanceFromHome;
bool climbed;   //thought of as a simple class
Hills *link;    //All fields are public
};

class LinkedList{   //now declare the class
private:
Hills *head;        //pointer to the first node
Hills *last;        //pointer to the last node
int count;      //number of nodes
public:

void insertNodeAtStart(int newinfo);    // inserts a node at start of list
void insertNodeAtEnd(int newinfo);      // inserts a node at end of list
int getNodeCount();  //returns the number of nodes
Hills* getFirst();   //returns the pointer to the
//the first node - the value of "head"
void deleteFirstNode(); //deletes the first node in the list

bool findNumber(int number);  //Q6 see if "number" is in the list
void deleteNode(int number);  //Q7 delete a node with "number" as its data

};  //end of class declarations. REMEMBER THE SEMICOLON
``````

## stevo356

Just to add, I can get the thing to output one of the variables from the struct, but no more, thats the particular point where i'm sturggling a bit.

## Ancient Dragon 5,243

The next step is to write the implementation c++ code for each of the methods you have in that class. Here's a start:

``````#include "hills.h" // or whatever you named the file you posted

// constructor
{
// initialize the class variables
tail = 0;
count = 0;
}``````

## stevo356

Yeah, I've made some of the file as follows, the problem is though, I can't work out how to pass all the values from the struct in the header file. I've tried various things, to no avail.

So at the moment, all I can seem to pass is hillsize.

``````#include "LinkedList1.h"

last = NULL;
count = 0;
}

Hills *nextNode;
nextNode = new Hills;
Hills->hillsize = newInfo;

count++;

if(last == NULL){
last = nextNode;
}
}

Hills *endNode;
endNode = new Hills;
endNode->hillsize = newInfo;

count++;
last = endNode;
}
else{
last = endNode;
}
}

if(count > 0){

delete temp;
count--;
}
else{
cout<<"There are no nodes to delete."<<endl;
}

}

Hills *current;

for (int i=1; i<=count; i++){
if(current->hillsize == number){
return true;
}
}
return false;
}
``````

## Ancient Dragon 5,243

Just pass the entire struct

``void LinkedList:: insertNodeAtStart(struct Hills& info){``

Or you could pass the items individually

``void LinkedList:: insertNodeAtStart(int hillsize, int gridref, int stance, bool climbed){``

## stevo356

Thats cleared up much of my problems. However I now get this error (better than the 30 I was getting before, mind)

``````"c:\documents and settings\stephen mcginley\desktop\cwk\cwk\main1.cpp(17) : error C2664: 'LinkedList::insertNodeAtStart' : cannot convert parameter 1 from 'int' to 'Hills'
No constructor could take the source type, or constructor overload resolution was ambiguous"
``````

Here's what my main file looks like so far (well the bit that matters just now)

``````#include <ctime>
#include <cstdlib>

int main(){
//
int hillsize;
int gridref;
int distanceFromHome;
bool climbed;
srand( (unsigned int) time( NULL ));
hillsize = (rand() % 1400) + 3000;
//distanceFromHome = (rand() % 280) + 20;

gridref = (rand() % 100000) +400000;

for (int i=0; i<40; i++){
list.insertNodeAtStart();
//list.insertNodeAtStart (distanceFromHome);
//list.insertNodeAtStart (climbed);

}
``````

## Ancient Dragon 5,243

you have to make the same change(s) in the class definition of the header file.

## stevo356

Ok, i've changed the setup as suggested, when it comes to the output, it shows me 40 lines of the same thing "-84215041"

Any ideas?

## Ancient Dragon 5,243

post current code.

## stevo356

``````#include <iostream>
using namespace std;

//define a node as a structure
struct Hills{       //a structure that can be
int hillsize;
int gridref;
int distanceFromHome;
bool climbed;   //thought of as a simple class
Hills *link;    //All fields are public
};

class LinkedList{   //now declare the class
private:
Hills *head;        //pointer to the first node
Hills *last;        //pointer to the last node
int count;      //number of nodes
public:

void insertNodeAtStart(int hillsize, int gridref, int distanceFromHome, bool climbed);  // inserts a node at start of list
void insertNodeAtEnd(int hillsize, int gridref, int distanceFromHome, bool climbed);    // inserts a node at end of list
int getNodeCount();  //returns the number of nodes
Hills* getFirst();   //returns the pointer to the
//the first node - the value of "head"
void deleteFirstNode(); //deletes the first node in the list

bool findNumber(int number);  //Q6 see if "number" is in the list
void deleteNode(int number);  //Q7 delete a node with "number" as its data

};  //end of class declarations. REMEMBER THE SEMICOLON
``````

Class file

``````#include "LinkedList1.h"

last = NULL;
count = 0;
}

void LinkedList:: insertNodeAtStart(int hillsize, int gridref, int distanceFromHome, bool climbed){
Hills *nextNode;
nextNode = new Hills;
//nextNode = newInfo;

count++;

if(last == NULL){
last = nextNode;
}
}

void LinkedList:: insertNodeAtEnd(int hillsize, int gridref, int distanceFromHome, bool climbed){
Hills *endNode;
endNode = new Hills;
//endNode = newInfo;

count++;
last = endNode;
}
else{
last = endNode;
}
}

if(count > 0){

delete temp;
count--;
}
else{
cout<<"There are no nodes to delete."<<endl;
}

}

Hills *current;

for (int i=1; i<=count; i++){
if(current->hillsize == number){
return true;
}
}
return false;
}

bool nodeFound = false; //need this to check at the end if number node found
if(head->hillsize == number){//special case - if it's in the first node
deleteFirstNode();
nodeFound = true;
}
else{
if(count > 1){
Hills *current;     //use these 2 node pointer variables to go through
Hills *trailCurrent; //the lust checking for one with the required data
current=head->link; //To start, set them to point to the first & second nodes
while(current != NULL){  //while not end of list

if(current->hillsize == number){
//be deleted will now point to the
//node after the one being deleted
delete current;
count--;      //reduce count by 1
cout<< " The number has been deleted "<<endl;
nodeFound = true;
break;  //current is deleted so it can't be used in "while"
//condition. Use "break" to end loop immediately.
//Execution continues with the statement following
//the loop.
}
else{
current=current->link; //move our two node pointers up to
trailCurrent=trailCurrent->link; //the next set of nodes
}
}
}
}
if(!nodeFound){
cout<<"no node with that data was found."<<endl;
}

}
``````

Main Output file

``````#include <ctime>
#include <cstdlib>

int main(){
//
int hillsize;
int gridref;
srand( (unsigned int) time( NULL ));
hillsize = (rand() % 1400) + 3000;
//distanceFromHome = (rand() % 280) + 20;
//climbed = (rand() % 1) + 1;
gridref = (rand() % 100000) +400000;

for (int i=0; i<40; i++){
list.insertNodeAtStart(hillsize, gridref, 0, true);
//list.insertNodeAtStart (distanceFromHome);
//list.insertNodeAtStart (climbed);

}

int noOfNodes = list.getNodeCount();
cout <<"There are "<< noOfNodes <<" nodes in the list."<< endl;

Hills *current;
current = list.getFirst();
cout <<current<< endl;
//cout <<current->gridref<< endl;
for (int i=2; i<=noOfNodes; i++){
cout <<current->hillsize<< endl;
cout <<current->gridref<<endl;
}

//now test the findNumber function (Q6)
//ask the user to enter a number and see if it's in the list
int number;
cout<<"Enter a number you're looking for: ";
cin>>number;
if (list.findNumber(number)){
cout<<number<<" is in the list."<<endl;
}
else{
cout<<number<<" is not in the list."<<endl;
}
}
``````

## mitrmkar 1,056

You need to randomize the hillsize and gridref values within the loop in which you initialize the list.

## stevo356

still does the same for whatever reason. Its the only bit I've got left to fix as well:(

## Ancient Dragon 5,243

In LinkedList:: insertNodeAtStart() you set the pointers but never set the values of the Hills structure to the value of the parameters to that function. And do the same thing with the other insert function.

``````void LinkedList:: insertNodeAtStart(int hillsize, int gridref, int distanceFromHome, bool climbed){
Hills *nextNode;
nextNode = new Hills;
//nextNode = newInfo;
nextNode->hillsize = hillsize;
nextNode->gridref = gridref;
nextNode->distanceFromHome = distanceFromHome;
nextNode->climbed = climbed;

count++;

if(last == NULL){
last = nextNode;
}

}``````

Now, the numbers in all the nodes are the same because that's the way they are initialized in main(). If you want them to be different, and I suspect you do, then you have to re-randomize them on each loop iteration

``````for (int i=0; i<40; i++){
hillsize = (rand() % 1400) + 3000;
gridref = (rand() % 100000) +400000;
list.insertNodeAtStart(hillsize, gridref, 0, true);
}``````