- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我真的很困惑。我正在尝试编写一个 c 方法,允许我将一个新的“节点”添加到链表的前面。我以前用 C++ 做过这个,没问题。我感到很沮丧,因为在编写代码后我很确定我是对的,我四处看看,基本上我发现的所有地方都告诉我做同样的事情,我都准备好了......我将提供代码和逐步地址和变量的值。这是代码:
真正的函数是:
void addToBeginning(int value, struct node* root){
struct node* newNode;
newNode = malloc( sizeof(struct node));
newNode->value = value;
newNode->next = root;
root = newNode;
}
但这是完整的代码。我删除了一些内容以使其更简洁(回答此问题不需要的内容,例如 getLength(...) 和 addToPos(...))
#include <stdio.h>
#include <stdlib.h>
struct node {
int value;
struct node* next;
};
void printLinkedList(struct node* root);
void addToEnd(int value, struct node* root);
void addToBeginning(int value, struct node* root);
void addToPos(int pos, int value, struct node* root);
int getLength(struct node* root);
int main(){
/**
TESTING addToBeginning (I know addToEnd works)
**/
struct node *root2;
root2 = malloc( sizeof(struct node));
root2->value = 4;
root2->next = NULL;
/*
root2 = 4 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0
*/
i = 0;
while (i < 5){
addToEnd(0,root2);
i++;
}
printLinkedList(root2);
//printf("Length : %d\n",getLength(root2));
/*
expected root2 = 2 -> 4 -> 0 -> 0 -> 0 -> 0 -> 0
*/
addToBeginning(2, root2);
printLinkedList(root2);
/*
obtained root2 = 4 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0
*/
//printf("Length : %d\n",getLength(root2));
return(0);
}
void printLinkedList(struct node* root){
while(root != NULL){
if (root->next != NULL){
printf("%d, ",root->value);
root=root->next;
} else {
printf("%d\n",root->value);
root=root->next;
}
}
}
void addToEnd(int value, struct node* root){
/*
Set up new node
*/
struct node* newNode = malloc( sizeof(struct node));
newNode->value = value;
newNode->next = NULL;
/*
Check if empty linked list first
*/
if (root->next == NULL){
root->next = newNode;
} else {
/*
Find the last node
*/
struct node* current = root;
while(current->next != NULL){
current = current->next;
}
current->next = newNode;
}
}
void addToBeginning(int value, struct node* root){
struct node* newNode;
newNode = malloc( sizeof(struct node));
newNode->value = value;
newNode->next = root;
root = newNode;
}
令人困惑的是我觉得别名有问题
newNode->next = root;
root = newNode;
行...所以我包括在我的调试步骤中获得的地址:所以...在 addToBeginning(int value, struct node* root){...}
函数中,我将逐步完成:
执行后:
struct node* newNode;
newNode = malloc( sizeof(struct node));
root和newNode的地址和值为:
root = 0x0000000100103c60
root->next = 0x0000000100103c70
root->value = 4
newNode = 0x0000000100103cc0
newNode->next = NULL
newNode->value = 0
执行后:
newNode->value = value;
root和newNode的地址和值为:
root = 0x0000000100103c60
root->next = 0x0000000100103c70
root->value = 4
newNode = 0x0000000100103cc0
newNode->next = NULL
newNode->value = 2
执行后:
newNode->next = root;
root和newNode的地址和值为:
root = 0x0000000100103c60
root->next = 0x0000000100103c70
root->value = 4
newNode = 0x0000000100103cc0
newNode->next = 0x0000000100103c60
newNode->value = 2
执行后:
root = newNode;
root和newNode的地址和值为:
root = 0x0000000100103cc0
root->next = 0x0000000100103c60
root->value = 2
newNode = 0x0000000100103cc0
newNode->next = 0x0000000100103c60
newNode->value = 2
我意识到问题是 *root
是通过引用传递的,所以我需要做的是更改存储在 0x0000000100103c60
位置的对象的值,所以任何关于如何做到这一点的建议将不胜感激。
最佳答案
在函数中
void addToBeginning(int value, struct node* root){
struct node* newNode;
(...)
root = newNode;
}
struct node *root2;
addToBeginning(2, root2);
您将新地址分配给本地根指针。该指针与您的原始根指针具有相同的值,但它是它的副本。因此,在函数返回后更改函数内部的变量对原始根没有影响。
相反,您必须逐个指针传递指针:
void addToBeginning(int value, struct node **root){
struct node* newNode;
(...)
*root = newNode;
}
struct node *root2;
addToBeginning(2, &root2);
这可能令人惊讶。当你想改变原始变量时,你不是总是将指针传递给函数吗?嗯,是的,但是它指向的是变量——而不是指针本身。在这里,假设您的原始函数采用指针(不是指向指针的指针),您仍然可以使用 *root2 = x
更改 root2 指向的原始节点或使用 root2 更改该节点的成员->成员 = y
。它会起作用,因为您更改了指向的变量(即使它们是指针 - 您可以更改这些指针 [它们指向的地址] 因为您有一个指向它们的指针并且您取消引用该指针)。
同样适用于作为变量的指针。如果要更改原始指针,则必须指向它并更改指向的变量,在这种情况下为原始指针。
关于c - c中的链表添加到前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29319021/
很高兴和你分享一些有关写python代码的经验,简直就像是品尝一口甜甜的草莓冰淇淋。每当我开始写python代码的时候,就仿佛是开启了一段奇妙的冒险,每一行代码都是我的剧情发展,每一个bug都是我的挑
我有一张看起来像这样的 table , Date Value 01/01/2010 03:59:00 324.44 01/02/2010 09:31:00
我已尽我所能检查但未找到任何 kwds允许您在 y=a-x 上画一条线(例如 pandas )散点图(不一定是最佳拟合线)并将其带到后面(或前面)。 #the data frame ax=df.plo
我已尽我所能检查但未找到任何 kwds允许您在 y=a-x 上画一条线(例如 pandas )散点图(不一定是最佳拟合线)并将其带到后面(或前面)。 #the data frame ax=df.plo
我正在尝试在书签中使用 jquery UI 作为 slider 。并且 jquery ui 要求在普通 jquery 文件之后包含该文件。 所以到目前为止我所尝试的只是将脚本附加到 header ,同
我正在尝试将 div (.portrait_text) 添加到容器 (.gallery_container) 中: 每个图像都会添加到其相应的 .gallery_container 前面。但我也想将
因此,为了避免让自己头疼(反而制造头疼),我试图将一个字符串数组成员放在同名的结构变量前面,但它不起作用并给我一个错误:std::string {aka class std::basic_string
嗨,我的索引页面上的下拉菜单有问题,下拉元素隐藏在我的图像 slider 下方,它位于我的导航栏正下方,我希望能够看到下拉菜单元素,任何帮助将不胜感激非常感谢; 这是我的导航栏 html:
我想在 div 前面移动一个按钮。 http://demo.gbaus.com/index.html在网站中,获取报价按钮不可点击,除非您点击最底部。我希望将它移到前面,以便您可以单击它。 posot
我有一个以时隙为键的 map ,指向分配的客户。并非所有时隙都有指定的客户,它可能既稀疏又密集,所以我坚持使用 map。执行。如果存在分配,则仅存在键。 计数器从槽 1 计数到槽 x,并在每个槽检查分
我有三个 Controller 。一个是 HomeViewController 启动 BlahPageViewController 并且它是单独的页面。其他两个 Controller (BlahPag
我有一个文本区域。我可以设置它的文本 $("#mytextarea").text("foo") 我可以像这样添加到文本区域: $("#mytextarea").prepend("foo") 但是我不能
我喜欢在绘图时生成我自己的网格线,这样我就可以控制刻度线等,我正在用“hist”绘图程序来解决这个问题。 hist(WindSpeed, breaks=c(0:31), freq=TRUE,
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
当我用 Java 发送电子邮件时,如果单词“From”是任何行的第一个单词,则在该单词的开头附加一个“>”字符,我该如何阻止这种情况? 这是我的文字: The following transactio
我有这一行输出 span 标记的名称值: $(this).text($(this).attr("name")); 在“名称”值之前添加字符(特别是美元符号 ($))的最佳方式是什么。 最佳答案 尝试:
在我调用 segue 返回到以前的 View Controller 之一后,我一直在努力解决我的选项卡栏被隐藏的问题。 我读到,在segue之后, View 覆盖了标签栏。有没有办法将标签栏放在 Vi
我的目标是有一个窗口,其中背景有 2 个不同颜色的面板。它们各自覆盖屏幕的特定百分比,并且会定期变化。我通过创建一个 JSplitPane 来做到这一点。但现在我想添加一个 JLabel 在屏幕中间的
我试图让我的导航栏在滚动时出现在正文的顶部。目前它在下面,如图所示。 我还有一个抽屉导航,它在引入 ScrollView 后就停止工作了……我觉得这可能是因为当我单击“汉堡包”图标时,它实际上位于 S
我之前问过类似的问题,但可能不清楚。 我有一个在 Amazon Elastic beanstalk 上运行的 Web 服务 (tomcat 8),它运行良好。然后我在 DomainA.com 上运行网
我是一名优秀的程序员,十分优秀!