复制待排序链表就是删除原来的链表
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;
是地址分配。 sortnode
和 q
现在指向同一个节点。这意味着
sortnode->next = NULL;
sortnode->prev = NULL;
更改此共享节点并将填充内容从源列表中删除,泄漏所有以下节点。
您将需要创建一个新节点,该节点是 *q
的副本,以便 sortnode
指向并使用源节点的副本构建排序列表。
sortnode = new EmployeeRecords(*q);
是一个可能的解决方案的开始。
我正在尝试根据薪水对我的链表进行排序,以便它在顶部显示最高薪水等等。它解析我的原始链表并将每个节点复制到一个新的排序链表中,在这种情况下 "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;
是地址分配。 sortnode
和 q
现在指向同一个节点。这意味着
sortnode->next = NULL;
sortnode->prev = NULL;
更改此共享节点并将填充内容从源列表中删除,泄漏所有以下节点。
您将需要创建一个新节点,该节点是 *q
的副本,以便 sortnode
指向并使用源节点的副本构建排序列表。
sortnode = new EmployeeRecords(*q);
是一个可能的解决方案的开始。