复制待排序链表就是删除原来的链表

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

我正在尝试根据薪水对我的链表进行排序,以便它在顶部显示最高薪水等等。它解析我的原始链表并将每个节点复制到一个新的排序链表中,在这种情况下 "head" 是我的原始链表的头部,而 "sorthead" 是副本的头部。

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);

}

在测试了不同的方法试图找出问题的确切位置之后,我确定排序算法工作正常,但在它执行完毕并调用我的显示函数后它只显示我的头部原始列表。执行此函数后,对我的显示函数的所有其他调用也只显示我的原始列表的头部,而以前它正确显示整个列表。

我不确定为什么我的主要 "head" 在执行过程中会受到影响,而在开始时我已经使用临时值 "q" 来复制头部。

我最直接的错误是

sortnode = q;

是地址分配。 sortnodeq 现在指向同一个节点。这意味着

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

更改此共享节点并将填充内容从源列表中删除,泄漏所有以下节点。

您将需要创建一个新节点,该节点是 *q 的副本,以便 sortnode 指向并使用源节点的副本构建排序列表。

sortnode = new EmployeeRecords(*q);

是一个可能的解决方案的开始。