【发布时间】:2015-11-06 19:11:12
【问题描述】:
我正在学习 C 语言编程,但遇到了一些麻烦,尤其是在使用指针时。这对我来说有点困难,因为我们在 Java 或 C# 中不使用指针。
我尝试做的是创建一个链表(在互联网上找到的代码)并在其中推送元素。就像下面的代码一样。
发生的情况是,当我取消注释第二行代码时,代码有效,但我收到以下列表作为答案 {0, 1, 2},即使我没有在列表中推送数字 0。我想将其作为答案:{1, 2}。
int main (){
node_t * test_list = NULL;
//test_list = malloc(sizeof(node_t));
push(test_list, 1);
push(test_list, 2);
print_list(test_list);
return 0;
}
代码如下所示:
typedef struct node
{
int val;
struct node * next;
} node_t;
void print_list(node_t * head)
{
node_t * current = head;
while (current != NULL)
{
printf("%d\n", current->val);
current = current->next;
}
}
node_t* new_node(node_t * head)
{
node_t * head2 = malloc(sizeof(node_t));
return head2;
}
void push(node_t * head, int val)
{
if (head == NULL)
{
head = new_node(head);
head->val = val;
head->next = NULL;
}
else
{
node_t * current = head;
while (current->next != NULL)
current = current->next;
/* now we can add a new variable */
current->next = malloc(sizeof(node_t));
current->next->val = val;
current->next->next = NULL;
}
}
在 push 函数中,我决定检查 head 是否等于 NULL。如果是这种情况,我只想创建一个新节点并将其分配给它。我不知道这是否是一个好方法。然而,它不起作用。
如果有人能引导我走上正确的道路,我将不胜感激!
谢谢!
(代码来源:http://www.learn-c.org/en/Linked_lists)
【问题讨论】:
-
您是否在调试器中逐行执行代码?您还尝试在 push() 中为 head 分配一个指针,但这是行不通的。 C 中的所有内容都是按值传递的。
-
^^ 正确的路径是通向 gdb 或其他调试器。
-
push中修改后的head没有找到返回给调用者的方法,因为您传递了一个 copy 。 -
不,我没有使用调试器单步执行代码。但是,如果我从主函数中取消注释以下行
//test_list = malloc(sizeof(node_t));,它会在列表中添加一个额外的元素(元素 0),这是我不想要的。这就是为什么我试图让它与函数new_node(...)一起工作,但它不起作用。 -
建议代码格式的一致性,以便我们人类可以轻松阅读/理解它。 1) 总是在每个左大括号 '{' 之后缩进 2) 在每个右大括号 '}' 之前总是不缩进 3) 永远不要使用制表符进行缩进,因为每个编辑器/文字处理器都有不同的制表符宽度/制表位。 4)在每个代码块周围插入一个空行 5)添加 cmets 以便阅读代码的人知道作者认为他们在做什么
标签: c pointers linked-list