C 链表实现差异
对于以下链表声明C 链表实现差异,c,C,对于以下链表声明 #include <stdlib.h> #include <stdio.h> typedef struct list { int val; struct list *next; } list; void destroy (list *l) { if (l) { destroy (l->next); free (l); } } 以下主要工作是什么 int main() {
#include <stdlib.h>
#include <stdio.h>
typedef struct list
{
int val;
struct list *next;
} list;
void destroy (list *l)
{
if (l)
{
destroy (l->next);
free (l);
}
}
以下主要工作是什么
int main()
{
list *test;
list *ptr1, *ptr2;
int i;
test = malloc (sizeof (list));
test->val = 0;
ptr2 = test;
for (i = 1; i <= 10; i++)
{
ptr1 = (list *) malloc (sizeof (list));
ptr1->val = i;
ptr2->next = ptr1;
ptr2 = ptr1;
}
ptr1 = test;
while (ptr1)
{
printf ("%d\n", ptr1->val);
ptr1 = ptr1->next ;
}
destroy (test);
return 0;
}
虽然这个甚至不创建列表,但它只创建一个节点
int main()
{
list *test;
list *ptr;
int i;
test = malloc (sizeof (list));
test->val = 0;
ptr = test->next;
for (i = 1; i <= 10; i++)
{
ptr = (list *) malloc (sizeof (list));
ptr->val = i;
ptr = ptr->next;
}
ptr = test;
while (ptr)
{
printf ("%d\n", ptr->val);
ptr = ptr->next ;
}
destroy (test);
return 0;
}
它们不是使用相同的逻辑吗?代码
ptr = test->next;
for (i = 1; i <= 10; i++)
{
ptr = (list *) malloc (sizeof (list));
ptr->val = i;
ptr = ptr->next;
}
代码
ptr = test->next;
for (i = 1; i <= 10; i++)
{
ptr = (list *) malloc (sizeof (list));
ptr->val = i;
ptr = ptr->next;
}
在第二个主要阶段
ptr = test->next;
您正在尝试在没有分配内存的情况下访问测试->下一步。您可以尝试按以下方式更改代码,以使第二个主程序正常工作
test = malloc (sizeof (list));
test->val = 0;
test->next = (list *) malloc (sizeof (list));
ptr = test->next;
for (i = 1; i <= 10; i++)
{
ptr->val = i;
ptr->next = (list *) malloc (sizeof (list));
ptr = ptr->next;
}
在第二个主要阶段
ptr = test->next;
您正在尝试在没有分配内存的情况下访问测试->下一步。您可以尝试按以下方式更改代码,以使第二个主程序正常工作
test = malloc (sizeof (list));
test->val = 0;
test->next = (list *) malloc (sizeof (list));
ptr = test->next;
for (i = 1; i <= 10; i++)
{
ptr->val = i;
ptr->next = (list *) malloc (sizeof (list));
ptr = ptr->next;
}
在第一个有效的示例中,ptr2保留了列表中先前创建的节点,因此可以重写该节点
last_created_node = test;
for (i = 1; i <= 10; i++)
{
// create new node
new_node = (list *) malloc (sizeof (list));
new_node ->val = i;
// chain newly created node onto list so far
// make last created node point to new node
last_created_node->next = new_node ;
// last created node is now new node
last_created_node = new_node ;
}
// terminate the list
last_created_node->next = 0;
在您给出的第二个代码示例中,没有等效于将新节点链接到链上的代码。正如其他人评论的那样,统一化内存也存在问题。最好添加终止条件,如上面我的示例的最后一行所示。在第一个有效的示例中,ptr2保留列表中先前创建的节点,以便可以重写
last_created_node = test;
for (i = 1; i <= 10; i++)
{
// create new node
new_node = (list *) malloc (sizeof (list));
new_node ->val = i;
// chain newly created node onto list so far
// make last created node point to new node
last_created_node->next = new_node ;
// last created node is now new node
last_created_node = new_node ;
}
// terminate the list
last_created_node->next = 0;
在您给出的第二个代码示例中,没有等效于将新节点链接到链上的代码。正如其他人评论的那样,统一化内存也存在问题。最好添加终止条件,如上面示例的最后一行所示。如何更改第二条干管以使其正常工作?假设我不会来第一个main@KudayarPirimbaev我已经更新了我的答案以涵盖这一点。你需要让你的代码看起来更像你发布的工作版本,而不是油嘴滑舌。我如何才能更改第二个main使其工作?假设我不会来第一个main@KudayarPirimbaev我已经更新了我的答案以涵盖这一点。你需要让你的代码看起来更像你发布的工作版本,而不是油嘴滑舌。