【问题标题】:Understanding Node assignments in Linked List了解链表中的节点分配
【发布时间】:2023-03-19 10:17:01
【问题描述】:

所以我目前正在学习 C 中的链接列表,我对创建链接列表和插入节点时使用的一些分配有一些疑问。我希望了解内存是如何在后台工作的。

struct node {
    int data;
    struct node *next
}
    
void createList(int n, struct node *head)
{
    struct node *temp, *newnode;
    
    //Assignment 1
    temp = head;
    
    //Assignment2
    temp->next = newnode
    //somethings
}

一些上下文:head 不包含任何数据。它只是第一个入口点节点,它指向包含任何数据的第一个节点? temp用于遍历,newnode是新创建的节点,后面改成temp

上述两个作业在内存方面是如何工作的? 在作业 1 中,我是在复制内容还是两个名称指向同一个位置? 作业 2 也有同样的疑问。

已更新,重要代码如下。

int menu()
{
    int choice = 0;

    printf("\n\t\tMENU\n1.Create Linked List");
    printf("\n2.Display Linked List");
    printf("\nAny other number to exit\n");
    printf("\nEnter Choice : ");
    scanf("%d", &choice);

    return choice;
}

void createList(int n, struct node *head)
{
    int data;
    struct node *temp, *newNode;
    temp = head; // 'head' node with no data pointing towards 'temp'
    for (int i = 1; i <= n; i++)
    {
        newNode = malloc(sizeof(struct node));

        printf("Enter Data %d : ", i);
        scanf("%d", &data);

        newNode->data = data; // First Node
        newNode->next = NULL;

        temp->next = newNode;
        temp = temp->next;
    }
}

void displayList(struct node *head)
{
    struct node *temp;
    temp = head->next; // Link to First Node
    int i = 1;
    printf("\nStart Display\n");
    while (temp != NULL)
    {
        printf("\nData %d : %d\n", i, temp->data);
        temp = temp->next;
        i++;
    }
}

void main()
{
    int choice, n;

    struct node *head;
    head = malloc(sizeof(struct node));
    head->next = NULL;

label:
    choice = menu();
    switch (choice)
    {
    case 1:
        printf("Enter Number of Entries : ");
        scanf("%d", &n);
        createList(n, head);
        goto label;
        break;

    case 2:
        displayList(head);
        goto label;
        break;

    default:
        printf("Wrong Choice");
        exit(0);
        break;
    }
}

编辑 2: 另一个疑问:

temp = temp->next

这用于遍历,但它是如何工作的。 “下一个”是“结构节点”中的一个子位置,它的地址指向下一个节点,对吗? 那么这个分配在内存位置会发生什么?

非常感谢您的帮助,因为这个主题变得非常难以理解。

【问题讨论】:

  • 在两个赋值中唯一被复制的是指针。第二个赋值 temp-&gt;next = newnode; 无效,因为 newnode 包含未初始化的值。
  • 什么时候赋值 'temp=head' 是否有两个不同的指针命名为 'temp' 或 'head' 或者它们都指向内存中的相同位置?
  • @ThomasAMathew 相同位置。
  • @Imonninger 。谢谢
  • head 在传递给createList 之前如何初始化?

标签: c pointers struct linked-list variable-assignment


【解决方案1】:

在这两个赋值中,存储在右侧对象中的值被分配给左侧的对象。

例如如果指针头是空指针那么在赋值之后

temp = head;

指针 temp 也将是一个空指针。

如果指针 head 指向某个 struct node 类型的对象(节点)(存储节点的地址),那么在赋值之后指针 temp 也将指向该对象(节点)。即它将存储节点的相同内存地址。

为了更清楚,请考虑以下代码 sn-p。

int x = 10;
int *p = &x;
int *q;

q = p;

赋值后,指针 p 和 q 都指向变量 x。因此,使用其中任何一个指针,您都可以访问变量 x,例如

printf ( "x = %d\n", *q );

*q = 20;

printf ( "x = %d\n", *p );

至于函数的附加代码

void createList(int n, struct node *head)
{
    int data;
    struct node *temp, *newNode;
    temp = head; // 'head' node with no data pointing towards 'temp'
    for (int i = 1; i <= n; i++)
    {
        newNode = malloc(sizeof(struct node));

        printf("Enter Data %d : ", i);
        scanf("%d", &data);

        newNode->data = data; // First Node
        newNode->next = NULL;

        temp->next = newNode;
        temp = temp->next;
    }
}

如果指针头最初不指向虚拟节点并且等于 NULL,则它具有未定义的行为。

【讨论】:

  • 感谢您的回答。一些澄清:说如果“头”有数据,下一个指向别的东西。如果 'temp = head' ,现在 temp 指向 head 指向的位置。或者现在是否有两个不同的地方分别命名为“temp”或“head”?
  • @ThomasAMathew temp 和 head 是两个“不同的地方”,因为它们在赋值后定义在不同的内存范围位中,它们具有相同的值..
  • 谢谢弗拉德。如果您不介意,请稍微澄清一下。函数'createList',它是如何工作的?该代码有效,但是当我分配'temp = head'时。这是否意味着 'head' 具有某个位置的内存地址(因为它是一个指针),并且分配是否将内存地址放入 'head' 到 'temp' ?我对此是否正确?假设'head'是否包含地址:#r450(位置名称),现在'temp'包含相同的'temp'也有值#r450,因此'temp'和'head'都指向同一个位置?希望你能理解。谢谢你的指导,我在这里真的很挣扎。
  • @ThomasAMathew 将存储在一个对象中的值分配给另一个对象。分配后,两个对象具有相同的值。什么不清楚?
  • 嗨弗拉德,当我声明 'temp' 和 'head' 时,它们是指针变量,对吗?如果“head”指向某个内存位置,并且如果我执行“temp=head”,这两个变量仍然是内存中两个不同的位置,对吗?他们不是一个地方的两个名字吧?注意:我对这些概念的逻辑理解可能大错特错,因此请尽可能澄清任何概念。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2020-12-08
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2016-03-07
相关资源
最近更新 更多