- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在做一个模拟操作系统进程调度程序的计算机科学项目。我有多个单链表,需要在它们之间移动节点。我正在尝试编写一个通用的函数来完成此操作,但我认为我的使用指针的弱点阻碍了我。
如何实现所需的功能?到目前为止,我有以下内容:
typedef struct process_list_struct ProcessList;
struct process_list_struct
{
Process proc;
ProcessList* next;
};
void change_lists(ProcessList* node, ProcessList* newlist)
{
ProcessList* temp = NULL;
debug_printf("change_lists reached\n");
temp = node;
if(!node)
{
debug_printf("Error: change_lists failed!\n");
return;
}
node = node->next;
temp->next = newlist;
newlist = temp;
return;
}
结果很奇怪...我最终得到第一个列表,其中仅我想移动的节点,其他所有内容都丢失了(效果与我想要的),新列表(测试为开始为空)仍然是空的。
我在单个列表中查看了节点交换的实现,并且看到人们使用双指针,但这真的让我感到困惑。有人可以告诉我如何在这种情况下应用它们吗?我尝试使用它们,但它们与结构的引用指针元素结合起来真的很困惑。
非常感谢帮助!
最佳答案
将节点从一个列表转移到另一个列表的四个步骤是错误的:
temp = node
node = node->next;
temp->next = newlist;
newlist = temp;
见下图:
假设您在链接的 list-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 |--
+---+---+-----+ +---+----+---+
这就是您所做的。但这不是你想要的?
你将节点从一个列表转移到另一个列表的算法是错误的另外你犯了技术错误,你正在按值传递指针(你需要指针指向指针以反射(reflect)调用函数的变化)
因为你想将节点从一个列表转移到另一个列表,并传递一个列表中的 node
指针和另一个列表的头部,你需要传递指针的指针以反射(reflect)调用函数的变化,因此你的声明在我看来是错误的:
void change_lists(ProcessList* node, ProcessList* newlist)
我觉得应该是:
void change_lists(ProcessList** node, ProcessList** newlist)
使用此原型(prototype)编写代码以移动节点。
编辑:(建议)
代码中的基本问题是,要移动列表 1 中的节点(例如一个),您不会更改指向先前节点的指针(图中的零节点) , 你需要制作
[zero] ---> [two]
@CodeRat 在他的列表中犯了类似的错误:Swap nodes in a singly-linked list
我给了他一个我认为会帮助你实现代码的答案。
旧答案:
我能找到的一个错误:而不是
*temp = *node;
你应该写
temp = node;
地址不是值(value)观
做 *temp = *node;
是未定义的行为,因为你没有为 temp 分配内存,你需要在 temp 中分配地址。 (temp 指向 NULL)因为您想将节点从一个列表转移到另一个列表,这就是为什么您需要 temp = node;
关于C:从单链表1中删除一个节点并将其插入到单链表2的头部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15905502/
head 元素包含了所有的头部标签元素。在 head 元素中你可以插入脚本(scripts), 样式文件(CSS),及各种meta信息。 可以添加在头部区域的元素标签为: title , styl
这个问题只是为了澄清一些事情。以前有人问过类似的问题,现在把它们归为一个问题——JavaScript 应该放在 HTML 文档中的什么位置,或者更重要的是,它重要吗?所以,我要问的一件事是,确实
HTML 中的 <head> 标签是所有头部标签的容器,这些头部标签用来定义有关 HTML 文档的元数据(描述数据的数据)以及所需资源的引用(例如 CSS 样式文件、JavaScript
我想通过 yui3 注入(inject) iframe head。示例代码在 FF 中有效,但 IE9 显示错误“YUI is not define”。我不知道在 IE9 中会发生什么。
我想复制 Kickstarter 应用程序中的效果,当用户向上滚动且表格 View 已位于开头时,标题 View 的大小会增加。 要查看效果,只需打开一个随机项目并向上滚动即可。 你知道如何实现这样的
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
在 iframe 加载时,我将 google 分析片段插入 iframe 文档 HEAD 中。 然后代码片段将插入此脚本 在父文档 HEAD 中,我希望将其插入到 iframe 文档 HEAD 中.
在此demo , 如果我使用 (no wrap) 或 (onLoad),我会得到不同的输出。 我的问题是,在 html 文件中,要获得正确的警报:1,2,3,4 需要对代码进行哪些更改?通过简单的 d
我想知道是否可以在 javascript 弹出窗口中向用户显示完整的 html 页面。完整的 html 是指具有自己的编码、头部和主体的 html 代码。它有自己的字体、样式、脚本等... 另外,假设
我的第一个网页作业遇到了麻烦,我才第一年,之前没有任何经验。我的问题是,当我尝试将背景 img 应用于 body 时,它会在头部应用一个简单的样式集,但是当我在我的 css 中应用相同的代码时它会失败
我正在使用express-handlebars在我的项目中存在以下问题: 问题我希望能够添加从 View 内部调用的部分将此类标签添加到我的整体 View 头部。 示例: 景色 {{#layout/m
我想将脚本添加到站点的头部,以便目标 html 的头部看起来像这样 *some code...* . 有了这个脚本就完美了: var head = document.getElementsByTagN
我想使用链接标签将一些 CSS 注入(inject)头部。我可以使用 很容易地让它工作 var linkNode = document.createElement('link'); linkNode.
你如何能够使用 javascript 将页面中间的 css 链接注入(inject)到头部 ... styles here code 我需要某种 javascript 来将 goog
我想创建一个 HTML 网络组件,我需要导入 CSS 文件,但我想将它注入(inject)到我的影子 dom 中。我有一些代码如下: import introHTML from './Intro.ht
我是一名优秀的程序员,十分优秀!