【问题标题】:From struct, pointer to NULL, and back从结构,指向 NULL 的指针,然后返回
【发布时间】:2020-05-01 13:15:28
【问题描述】:
typedef struct Element 
{
    int number;
    struct Element *right;
    struct Element *left;
} Element;

Element *newElement;
Element *head;
Element *pos;     
Element *current; 

void insert_Element()
{
    newElement = malloc(sizeof(Element));

    if (head==NULL)    
    {
      head = newElement;
      current = newElement;
      current->right = pos;
      //pos->left = current;
    }
}

双链表的头部应该有一个指向下一个 (right) 元素的指针(它是 NULL,但也是 pos)。这工作正常,但来自pos/NULL 的指针返回(left) 不起作用。 我做了什么工作;甚至可能吗? 提前谢谢你:)

【问题讨论】:

  • 你在哪里分配pos
  • 无处可去。我不知道你必须这样做。它没有工作。我以为既然我没有分配,那就等于NULL
  • pos->whatever 正在取消引用它。你不能取消引用未分配的指针。
  • newElement 应该是insert_Element() 函数的局部变量。首次创建列表时,需要将headposcurrent 设置为新元素。您还需要设置新元素,以便设置其左右指针。通常,您的 insert_Element() 函数会将值插入到元素中(要存储的数字)。你有太多的全局变量来安慰。尽可能避免使用它们。
  • pos 的目标/作用是什么?

标签: c pointers linked-list null


【解决方案1】:

当前版本的insert_Element 函数不起作用,除非headNULL 并且pos 不是NULL,并且它没有设置新元素的left 成员。 pos 变量的用途尚未说明,但似乎用于指向要插入新元素的元素。我们可以使用pos == NULL 来指示新元素将被放置在列表的末尾。这是执行此操作的版本:

void insert_Element(void)
{
    newElement = malloc(sizeof(Element));
    if (newElement == NULL)
    {
        return;
    }
    newElement->right = pos;
    if (pos != NULL)
    {
        /* insert before pos */
        newElement->left = pos->left;
        pos->left = newElement;
    }
    else if (head != NULL)
    {
        /* add to end of list */
        current = head;
        while (current->right != NULL)
        {
            current = current->right;
        }
        newElement->left = current;
        current->right = newElement;
    }
    else
    {
        /* add to empty list */
        newElement->left = NULL;
    }
    if (pos == head)
    {
        /* make it the start of the list */
        head = newElement;
    }
    /* make it the 'current' element */
    current = newElement;
}

最好不要过多使用全局变量,而是使用函数参数。这是一个不使用全局变量并返回指向列表中新元素的指针(或分配失败时NULL)的版本:

Element *insert_Element(Element **phead, Element *pos)
{
    Element *newElement = malloc(sizeof(Element));
    if (newElement == NULL)
    {
        return NULL;
    }
    newElement->right = pos;
    if (pos != NULL)
    {
        /* insert before pos */
        newElement->left = pos->left;
        pos->left = newElement;
    }
    else if (*phead != NULL)
    {
        /* add to end of list */
        Element *current = *phead;
        while (current->right != NULL)
        {
            current = current->right;
        }
        newElement->left = current;
        current->right = newElement;
    }
    else
    {
        /* add to empty list */
        newElement->left = NULL;
    }
    if (pos == *phead)
    {
        /* make it the start of the list */
        *phead = newElement;
    }
    return newElement;
}

【讨论】:

    【解决方案2】:

    您可能只需要分配给您Element *pos。实际上pos等于NULL,逻辑上没有指针left或right,就​​像在一个不存在的房子里找厕所一样。

    【讨论】:

    • 那么我该如何避免这种情况并真正让它发挥作用呢?
    • 您只需重复其他人在您之前几分钟所说的话,做出回答,我们希望您也提出解决方案;-)
    • @bruno 你说得对,我没有看到比我更好的其他答案。下次我应该添加一个例子吗?
    • @twingoof 是的,这就是评论和答案之间的区别。
    • @bruno 好的,我的错,我不知道,我刚开始寻找是否可以在空闲时间帮助一些人。谢谢你解释我。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多