您按照四个步骤将节点从一个列表转移到另一个列表是错误的:
temp = node
node = node->next;
temp->next = newlist;
newlist = temp;
见下面我用图表显示:
假设您在链表 1 中有节点:
+---+----+----+ +----+----+----+ +---+----+----+
->| zero |----->| one |----->| two |--
+---+----+----+ +----+----+----+ +---+---+-----+
^ ^
| |
| node
after temp=node temp
之后:node = node->next;
事情变成:
+---+----+----+ +----+----+----+ +---+----+----+
->| zero |----->| one |----->| two |--
+---+----+----+ +----+----+----+ +---+---+-----+
^ ^
| |
temp node
在temp->next = newlist;
这之后?
+---+----+----+ +----+----+----+ +---+----+----+
->| zero |----->| one | | two |--
+---+----+----+ +----+----+----+ +---+---+-----+
^ | ^
| | |
temp | node
|
|
| "head node"
| +---+----+----+ +---+----+---+
"This is your list-2" |-->| FIVE |-->| SIX |--
+---+---+-----+ +---+----+---+
newlist
你的背阔肌步骤newlist = temp;
?
newlist
|
▼ "head node"
+---+----+----+ +----+----+----+ +---+----+----+
->| zero |----->| one | | two |--
+---+----+----+ +----+----+----+ +---+---+-----+
^ | ^
| | |
temp | node
|
|
| +---+----+----+ +---+----+---+
"This is your list-2" |-->| FIVE |-->| SIX |--
+---+---+-----+ +---+----+---+
这是你做的。但这不是你想要的?
您将节点从一个列表转移到另一个列表的算法是错误的另外您犯了技术错误,您正在按值传递指针(您需要指向指针的指针以反映调用函数时的更改)
因为你想将节点从一个列表转移到另一个,并传递一个列表中的指针和node
另一个列表的头,你需要传递指针的指针来反映调用函数的变化,因此你的声明在我看来是错误的:
void change_lists(ProcessList* node, ProcessList* newlist)
我认为应该是:
void change_lists(ProcessList** node, ProcessList** newlist)
使用此原型编写代码以转移节点。
编辑:(建议)
您的代码中的基本问题是,要在列表一中移动一个节点(例如一个),您不会更改指向先前节点(图中的零节点)的指针,您需要使
[zero] ---> [two]
@CodeRat 在他的列表中犯了类似的错误:在单链表中交换节点
我给了他一个我认为会帮助你实现代码的答案。
旧答案:
我能找到的一个错误:而不是
*temp = *node;
你应该写
temp = node;
地址不是值
这样做*temp = *node;
是未定义的行为,因为您没有为 temp 分配内存,您需要在 temp 中分配地址。(temp 指向 NULL)因为您想将节点从一个列表转移到另一个列表,这就是您需要的原因temp = node;