为什么链表的重新排序会失败?
Why does reordering of linked list fail?
在此代码中,我尝试使用 evenOdd(( 函数修改列表,使偶数出现在列表中,奇数出现在列表中的最后。
但是没有获得预期的输出,请帮助我。
预期输出 :
订购前 :
1 --> 2 --> 3 --> 4 --> 5 --> 6 --> 7 --> 空
订购后 :
2
--> 4 --> 6 --> 1 --> 3 --> 5 --> 7 --> 空实际输出:
1 --> 2 --> 3 --> 4 --> 5 --> 6 --> 7 --> 空
#include<iostream>
using namespace std;
class Node
{
public:
int data;
Node* next;
};
void addEnd(Node **head, int val)
{
Node *temp=*head;
Node *newnode=new Node();
newnode->data=val;
newnode->next=NULL;
if(*head == NULL) {*head = newnode; return;}
while(temp->next!=NULL) {temp=temp->next;}
temp->next=newnode;
}
void deleteKey(Node **head,int val)
{
Node *temp=*head;
Node* prev;
if(temp!=NULL and temp->data == val)
{
*head = temp->next;
delete temp;
return;
}
while(temp->next!=NULL)
{
if(temp->data == val) {prev = temp; break;}
prev=temp;
temp=temp->next;
}
if(temp->data != val) {cout<<"NO SUCH VAlUES"; return;}
prev->next=temp->next;
}
void evenOdd(Node **head)
{
Node *temp = *head;
while(temp != NULL)
{
if(temp->data%2 == 1)
{addEnd(*(&head),temp->data); deleteKey(*(&head),temp->data);}
temp = temp->next;
}
}
void printList(Node *node)
{
while(node!=NULL)
{
cout<<" "<<node->data<<" --> ";
node=node->next;
}
cout<<"NULL";
}
int main()
{
Node *head = NULL;
addEnd(&head,1);
addEnd(&head,2);
addEnd(&head,3);
addEnd(&head,4);
addEnd(&head,5);
addEnd(&head,6);
addEnd(&head,7);
cout<<"Before Ordering :n";
printList(head);
evenOdd(&head);
cout<<"After Ordering :n";
printList(head);
return 0;
}
有了这个组合
if(temp->data%2 == 1)
和
deleteKey(*(&head),temp->data);
您正在删除当前正在查看的节点。包括实际的
delete temp;
里面deleteKey
.
但是然后你访问了你刚刚删除的内存,在这里
temp = temp->next;
里面evenOdd
.
在那之后,所有的赌注都关闭了。
但是观察到的问题是由deleteKey
内部引起的:
prev->next=temp->next;
它使用的值与temp
相同的prev
。即它不会改变 temp,尤其是不会改变指向 temp 的指针。要
实现这一点,您需要跟踪指向要删除的节点的指针,并更改它。
变量的命名表明您知道这个概念并尝试在此处执行此操作
{prev = temp; break;}
但显然这无法检索指针。
您需要一直更新该prev
,然后删除代码中需要包含这样的东西
{prev->next = temp->next; break;} /* prev->next currently points to temp, but prev!= temp */
/* update the "next" pointing to current node so that it points to the next one */
你可能会发现我的其他答案对于分析这种普伊特纳问题很有用:
在 C 语言中分析指针和指针到指针结构的技巧?
在 evenOdd 函数中,temp
指向插入在后面的节点,而它应该根据迭代指向第 2,3,4 个节点。 所以当你做 temp = temp->next 时,它是溢出的。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 视图中的参数推导失败:take_while
- C++选择排序算法中的逻辑错误
- 链接到自行创建的dll失败
- 使用C++程序合并排序没有得到正确的输出
- 为什么链表的重新排序会失败?
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- C++ 链表合并排序的实现在连接 1 个以上节点的子列表时失败
- 在某些情况下,我的快速排序实现失败
- 合并排序逻辑分配内存失败
- c++向量排序方法编译失败,返回预期表达式
- 气泡排序后BinSearch失败
- 将元素追加到向量会导致后续排序失败
- 为什么我的简单快速排序实现失败时,等效的元素在数组中
- 向量数组排序失败
- 数组排序失败