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我已经更新了我的答案以涵盖这一点。你需要让你的代码看起来更像你发布的工作版本,而不是油嘴滑舌。