I ran into a roadblock developing my code for an assignment to sort a linked list as it is entered (insertion sort). We've had sketchy classes lately so the idea of linked lists is really rough for me at the moment because it's a little hard to understand. This assignment was completed before without the sort, but now with the sort I am encountering a lot of problems. So far my program builds without error, but after the head is declared and values are entered, the next value causes a the program to crash. I assume it is because of the SortList and/or Swap functions I've inserted. Without these functions the program works just fine.

#include<iostream>
using namespace std;
// -------------------------------------------------------------
class Node {
public: Node* next;   // points to next node
        int identification; //data in node
        int length; //data in node
        int width; //data in node
        int height; //data in node
};
// -------------------------------------------------------------
void DisplayResults (Node* current) {
    if ( ! (current == NULL) ) { //loop output
        cout << current -> identification
             << "\t"
             << current -> length
             << "\t"
             << current -> width
             << "\t"
             << current -> height
             << endl;
        current = current -> next; //next node
        DisplayResults (current); } //loop output
return; }// DisplayResults
// -------------------------------------------------------------
void Swap(Node* current, Node* nextNode) {
    Node* swap; //temp storage for value
    Node* swapNext; //temp storage for link
    swapNext = current->next;
    current->next = nextNode->next;
    nextNode->next = swapNext;
    swap = current;
    current = nextNode;
    nextNode = swap;
return; }// Swap
// -------------------------------------------------------------
void SortList(int identification, int length, int width, int height, Node* current, Node* &head) {
   Node* nextNode = current->next;//for comparison of node after current
   current = head;
   while(current != NULL) { //loops through the list
       if(current->identification < nextNode->identification)//checks if current is less than next for ID
           Swap(current, nextNode);//executes swap function to switch nodes
       current = current->next; //next node
   }//loops through the list
return; }// SortList
// -------------------------------------------------------------
void BuildFirstNode (int &identification, int &length, int &width, int &height,
                     int &sumCars, Node* &head,  Node* &current,
                     Node* &pointer) {
   cout << "Please enter Box Car ID number (-1 to exit): ";
   cin >> identification;
   if( identification != -1){  // test if sentinel
       cout << "Please enter car " //input for length
            << identification
            << "'s length: ";
      cin >> length;
      cout << "Please enter car " //input for width
            << identification
            << "'s width: ";
      cin >> width;
      cout << "Please enter car " //input for height
            << identification
            << "'s height: ";
      cin >> height;
      pointer = new Node; //creates new node for data
      pointer -> identification = identification; //the following assigns data value
      pointer -> height = height;
      pointer -> width = width;
      pointer -> length = length;
      pointer -> next = NULL; //sets next node to NULL
      head = pointer;
      // set current to point to first node in list
      current = head;       // Sets first value to head
      sumCars = sumCars + 1;}//test if sentinel
   return; }// BuildFirstNode
// -------------------------------------------------------------
void Build (int identification, int length, int width, int height, int &sumCars,
            Node* current, Node* pointer, Node* &head) {
   cout << "Please enter Box Car ID number (-1 to exit): ";
   cin >> identification;
   if( identification != -1){  // test if sentinel
       cout << "Please enter car " //input for length
            << identification
            << "'s length: ";
      cin >> length;
      cout << "Please enter car " //input for width
            << identification
            << "'s width: ";
      cin >> width;
      cout << "Please enter car " //input for height
            << identification
            << "'s height: ";
      cin >> height;
      pointer = new Node; //creates new node for data
      pointer -> identification = identification; //the following assigns data value
      pointer -> height = height;
      pointer -> width = width;
      pointer -> length = length;
      pointer -> next = NULL; //sets next node to NULL
      sumCars = sumCars + 1;  //sum adds up per loop
      SortList(identification,length,width,height,current,head);
      Build (identification, length, width, height, sumCars, current, pointer,head);
      // recursive call to build another Node
   }  // test if sentinel
   return; }//Build
// -------------------------------------------------------------
void DisplayInformation( ) {
   cout << "Assignment Number: 8"
        << endl
    << "Name: Ryan Nystrom"
    << endl
    << "Student ID: M03054661"
    << endl
    << endl;
return; }// DisplayInformation
// -------------------------------------------------------------
void DisplayChartTitle( ) {
    cout << "CAR ID\t"
         << "LENGTH\t"
         << "WIDTH\t"
         << "HEIGHT"
         << endl
         << "------\t"
         << "------\t"
         << "-----\t"
         << "------"
         << endl;
return; }// DisplayChartTitle
// -------------------------------------------------------------
void SumValues(Node* current, int &sumLength, int &sumWidth, int &sumHeight) {
   if ( ! (current == NULL) ) { //loop output
      sumLength = sumLength + current -> length;
      sumWidth = sumWidth + current -> width;
      sumHeight = sumHeight + current -> height;
      current = current -> next; //next node
      SumValues(current,sumLength,sumWidth,sumHeight);
   }//loop output
return; }//SumValues
// -------------------------------------------------------------
void AverageValues(int sumLength,int sumWidth, int sumHeight, int averageLength,
                   int averageWidth, int averageHeight, int &sumCars) {
   averageLength = sumLength/sumCars;
   averageWidth = sumWidth/sumCars;
   averageHeight = sumHeight/sumCars;
return; }// AverageValues
// -------------------------------------------------------------
int main ( ) {
    Node* pointer;
    Node* current;
    Node* head;
    int sumCars,length,width,height,identification;
    int sumLength = 0;
    int sumWidth = 0;
    int sumHeight = 0;
    int averageLength = 0;
    int averageWidth = 0;
    int averageHeight = 0;
    BuildFirstNode(identification,length,width,height,sumCars,head,current,pointer);
    Build(identification,length,width,height,sumCars,current,pointer,head);
    DisplayChartTitle( );
    DisplayResults(current);
    SumValues(current,sumLength,sumWidth,sumHeight);
    AverageValues& #40;sumLength,sumWidth,sumHeight,averageLength,averageWidth,averageHeight,sumCar
s);
    cout << endl
         << "The average length is: "
         << averageLength
         << endl
         << "The average width is: "
         << averageWidth
         << endl
         << "The average height is: "
         << averageHeight
         << endl;
return 0; }// main

First, you appear to be trying to accomplish this task as though a list is
an array, but they aren't the same thing. Swapping (multiple) nodes in a
list is very inefficient. Don't do it, even if you could figure out how. To
insert a new node at any desired location in a singly linked list you should
never need to change more than 2 pointers.

Second, you don't pass the node with the new information to SortList() so
how can it determine where to insert it, or determine if nodes needed
swapping if you insist on treating your list like an array?

This article has been dead for over six months. Start a new discussion instead.