kerk
kerk

Reputation: 5

Duplicating linked list to be sorted is deleting the original linked list

I am trying to sort my linked list based on salary so that it displays the highest salary at the top and so on. It parses through my original linked list and duplicates each node to be inserted into a new sorted linked list, in this case "head" is the head of my original and "sorthead" is the head of the duplicate.

static void sortingRecords2() {

EmployeeRecords * q = head;

while (q != NULL) {
    EmployeeRecords * sortnode = NULL;
    sortnode = q;
    sortnode->next = NULL;
    sortnode->prev = NULL;

    if (sorthead == NULL) {
        sorthead = sorttail = sortnode;
    }
    else if (sortnode->Salary >= sorthead->Salary) {
        sortnode->next = sorthead;
        sorthead->prev = sortnode;
        sorthead = sortnode;
    }
    else {
        temp2 = sorthead;
        EmployeeRecords * previous = NULL;

        while (temp2 != NULL) {
            if (sortnode->Salary <= temp2->Salary) {
                previous = temp2;
            }
            temp2 = temp2->next;
        }

        if (previous->next == NULL) {
            sortnode->prev = sorttail;
            sorttail->next = sortnode;
            sorttail = sortnode;
        }
        else {
            sortnode->next = previous->next;
            sortnode->prev = previous;
            previous->next = sortnode;
            sortnode->next->prev = sortnode;
        }
    }
    q = q->next;
}
displayRecords(head);

}

After testing out different methods to try and figure out where exactly is the problem, I've determined that the sorting algorithm works fine but after it is done executing and I call my display function it only displays the head of my original list. After executing this function, all other calls to my display function also only displays the head of my original list where previously it properly displays the whole list.

enter image description here

enter image description here

I'm not sure why exactly my main "head" is affected during execution when at the start I already used a temp value "q" to copy the head.

Upvotes: 0

Views: 61

Answers (1)

user4581301
user4581301

Reputation: 33932

The immediate bug that jumps out at me is

sortnode = q;

is an assignment of addresses. sortnode and q now point at the same node. That means

sortnode->next = NULL;
sortnode->prev = NULL;

changes this shared node and blows the stuffing out of the source list, leaking all of the following nodes.

You will need to create a new node that is a copy of *q for sortnode to point at and build the sorted list with copies of the source nodes.

sortnode = new EmployeeRecords(*q);

is the start of a possible solution.

Upvotes: 3

Related Questions