Overloading Constructor Not Working for Singly Linked List

254 views Asked by At

I have a program where I have tried to make a singly linked list and its copy constructor. The program compiles successfully; however, upon running, it prints half of the output it is supposed to, and then it crashes (sorry for the poor technical vocab) without printing the remaining output.

I have a feeling that something is wrong with my copy constructor in the List class, because the program crashes as it reaches that point.

Here is my code:

# include<iostream>
using namespace std;


class Node
{
    public:
        int value;
        Node* next;
};

class List
{
    public:

        List();
        List(const List &other){
            head = new Node;
            head = NULL;
            Node* temp7;
            temp7 = head;
            Node* temp6 = other.head;
            while (temp6 != NULL)
            {
                temp7 = new Node;
                temp7->value = temp6->value;
                temp7 = temp6;
                temp6 = temp6->next;
            }
        }


        void push_front(int value){
            temporary = new Node;
            temporary->value = value;
            temporary->next = NULL;
            temporary->next = head;
            head = temporary;
        }

        void insert_at(int index, int value){
            Node* temp4 = new Node;
            temp4->value = value;
            temp4->next = NULL;
            if (index == 1)
            {
                temp4->next = head;
                head = temp4;
                return;
            }
            Node* temp5 = head;
            for (int k = 0; k < index - 2; k++)
                temp5 = temp5->next;
            temp4->next = temp5->next;
            temp5->next = temp4;
        }
        void remove_at(int index){
            Node* temp2 = head;
            if (index == 1)
            {
                head = temp2->next;
                delete temp2;
                return;
            }
            for (int j = 0; j < index - 2; j++)
                temp2 = temp2->next;
            Node* temp3 = temp2->next;
            temp2->next = temp3->next;
            delete temp3;
        }

        string printList(void);
    private:
        Node* head; 
        Node* temporary;
};

List::List(){
    head = NULL;
}


string List::printList(void)
{
    Node* temp1 = head;
    int counting = 0;
    while (temp1 != NULL)
    {
        cout << "list[" << counting << "] == " << temp1->value << endl;
        temp1 = temp1->next;
        counting++;
    }
}


int main()
{
    List list1;

    list1.push_front(4);
    list1.push_front(3);
    list1.push_front(2);
    list1.push_front(1);


    cout << "list1" << endl;
    list1.printList();
    cout << endl;

    List list2(list1);

    cout << "list2" << endl;
    list2.printList();
    cout << endl;

    list1.insert_at(1, 6);

    list2.remove_at(2);

    cout << "list1" << endl;
    list1.printList();
    cout << endl;

    cout << "list2" << endl;
    list2.printList();
    cout << endl;


    return 0;
}

I cannot pinpoint the source of error in the program. Can anyone please suggest a solution?

Just for reference, the output should be something like: (The program only outputs the first 5 lines before crashing).

>list1
>
>list[0] == 1
>
>list[1] == 2
>
>list[2] == 3
>
>list[3] == 4
>
>list2
>
>list[0] == 1
>
>list[1] == 2
>
>list[2] == 3
>
>list[3] == 4
>
>list1
>
>list[0] == 1
>
>list[1] == 6
>
>list[2] == 2
>
>list[3] == 3
>
>list[4] == 4
>
>list2
>
>list[0] == 1
>
>list[1] == 2
>
>list[2] == 4

By the way, this is my first question on stack overflow, so if there's anything wrong or something I should be doing, please don't hesitate to correct me.

Thanks a lot for your help everybody :)

*** I fixed the problem. Apparently, I wasn't implementing the copy constructor properly enough. Thanks anyways for all your input and advice :-)

// Include standard files #include

    // Use standard namespace
    using namespace std;

    // Declare node class
    class Node
    {
        // All values are public; value of node, and next node pointer
    public:
        int value;
        Node* next;
    };

    // Declare singly linked list class
    class List
    {
    public:

        // Declare main constructor
        // Declare copy constructor
        List();
        List(const List &copying) : head(NULL)
        {
            // Use a node to move through the source linked list
            // Set the size of the new linked list
            // For every node in old list, copy it to a new node and link it to the new singly linked list
            Node* cur = copying.head;
            int size = copying.size();
            Node* end = NULL;
            for(int q = 0; q < size; q++)
            {
                Node* n = new Node;
                n->value = cur->value;
                if (head == NULL)
                {
                    head = n;
                    end = head;
                }
                else
                {
                    end->next = n;
                    end = n;
                }
                cur = cur->next;
            }
            end->next = NULL;
        }

        // Push front a new node
        // Add its value and set its next pointer to NULL
        void push_front(int value){
            temporary = new Node;
            temporary->value = value;
            temporary->next = NULL;
            temporary->next = head;
            head = temporary;
        }

        // Insert node between x and x+1
        // Get the new node's value
        // Create the new node by moving from the head->next method
        // Add the value and set up the node
        void insert_at(int index, int value){
            Node* temp4 = new Node;
            temp4->value = value;
            temp4->next = NULL;
            if (index == 1)
            {
                Node* temp9 = head->next;
                temp4->next = temp9;
                head->next = temp4;
                return;
            }
            Node* temp5 = head;
            for (int k = 0; k < index - 2; k++)
                temp5 = temp5->next;
            temp4->next = temp5->next;
            temp5->next = temp4;
        }

        // Remove node number [index]
        // Get the head
        // Iterate through the linked list
        // When at the node before the one that has to be deleted, set its value to the node after the next one
        // Delete the node that should be deleted
        void remove_at(int index){
            Node* temp2 = head;
            if (index == 1)
            {
                head = temp2->next;
                delete temp2;
                return;
            }
            for (int j = 0; j < index - 1; j++)
                temp2 = temp2->next;
            Node* temp3 = temp2->next;
            temp2->next = temp3->next;
            delete temp3;
        }

        // Simple function to pass the head of a singly linked list
        // Simple function to get the size of a function
        Node * PassHead(void);
        int size()const;
    private:
        Node* head;
        Node* temporary;
    };

    // Returns head
    Node * List::PassHead()
    {
        return head;
    }

    //  Constructor sets head to NULL
    List::List(){
        head = NULL;
    }

    // Gets the size of the singly linked list.
    // While the node_>next is not NULL, add 1 to counter
    // return counter
    int List::size()const {
        Node* temp1 = head;
        int counting = 0;
        while (temp1 != NULL)
        {
            counting++;
            temp1 = temp1->next;
        }
        return counting;
    }

    // Same function as the size() function, excetp this time, print the node value while iterating through list
    // Nothing returned
    void printList(List object)
    {
        Node* temp1 = object.PassHead();
        int counting = 0;
        while (temp1 != NULL)
        {
            cout << "list[" << counting << "] == " << temp1->value << endl;
            temp1 = temp1->next;
            counting++;
        }
    }

    // Declare main function here
    int main()
    {
        // Object of List
        List list1;

        // Push some values
        list1.push_front(4);
        list1.push_front(3);
        list1.push_front(2);
        list1.push_front(1);

        // Print the first list
        cout << "list1" << endl;
        printList(list1);
        cout << endl;

        // Copy constructor for second list
        List list2(list1);

        // Print second list
        cout << "list2" << endl;
        printList(list2);
        cout << endl;

        // Insert node in first list
        list1.insert_at(1, 6);

        // Remove node in second list
        list2.remove_at(2);

        // Print first list
        cout << "list1" << endl;
        printList(list1);
        cout << endl;

        // Print second list
        cout << "list2" << endl;
        printList(list2);
        cout << endl;


        // Program ran successfully
        return 1;
    }
1

There are 1 answers

2
DotBlack On BEST ANSWER

I just can't answer normal due not enough points on this page. But I found something.

 List(const List &other){
            head = new Node;
            head = NULL;
            Node* temp7;
            temp7 = head;
            Node* temp6 = other.head;
            while (temp6 != NULL)
            {
                temp7 = new Node;
                temp7->value = temp6->value;
                temp7 = temp6;
                temp6 = temp6->next;
        }

Where is the closing bracket? The next function will be created in the function called List(const List &other) { .... Add a bracket and try again. Hope that helps ;)