从结构体,指针到NULL,然后返回

问题描述 投票:0回答:1
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). 这样做很好,但指针回(left)从 posNULL doesn't work.What did I do work; Is it even possible? 先谢谢你:)

c pointers linked-list null
1个回答
2
投票

目前版本的 insert_Element 功能不工作,除非 headNULLpos 不是 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;
}

-1
投票

有可能你只是需要分配你的... ... Element *pos. 其实pos等于null,逻辑上没有指针左右,就像在一个不存在的房子里找厕所一样。

© www.soinside.com 2019 - 2024. All rights reserved.