代码之家  ›  专栏  ›  技术社区  ›  leifdenby

在C中为链表中的新元素分配内存

  •  0
  • leifdenby  · 技术社区  · 16 年前

    我正试图创建一个链接列表,我已经让它工作了,但我还是有点困惑。我使用以下结构:

    typedef struct _MList
    {
        int dx;
        int dy;
        struct _MList *next;
    } MList_t, *MList_p;
    

    我已经测试了这个结构是否合理,并且我有一个函数可以打印出一个列表:

    void mListPrint(MList_t *mList)
    {
        MList_p node = mList;
        while (node->next != NULL)
        {
            printf("[%i,%i] ",node->dx,node->dy);
            node = node->next;
        }
        printf("[%i,%i]\n",node->dx,node->dy);
    }
    

    以及创建第一个节点的函数:

    MList_t mListNew(int dx, int dy)
    {
        MList_t newNode;
        newNode.dx = dx;
        newNode.dy = dy;
        newNode.next = NULL;    
        return newNode;
    }
    

    这样做很好,我想我会尝试创建一个函数,在列表的末尾添加一个节点。我的第一次尝试是:

    void mListAdd(int dx, int dy, MList_t *mList)
    {
        MList_p node = mList;
    
        while (node->next != NULL)
        {
            node = node->next;  
        }
    
        MList_t newNode = mListNew(dx,dy);
        node->next = &newNode;
    }
    

    这看起来不错,直到我添加了多个元素。经过多次调试,结果发现在mlistadd中创建的“newnode”的内存地址总是相同的。所以这个列表最终链接回了自己。为什么会这样?

    我改为使用指向新节点的指针来实现mlistadd,如下所示:

    void mListAdd(int dx, int dy, MList_t *mList)
    {
        MList_p node = mList;
    
        while (node->next != NULL)
        {
            node = node->next;
        }
        MList_p newNode = malloc(sizeof(MList_t));
        *newNode = mListNew(dx,dy);
        mListPrint(newNode);
        node->next = newNode;
    }
    

    这很有效,但我觉得另一种方法也应该有效。还是我错过了一些明显的东西?我试图通过在Java和ML.中学习不同的数据结构来学习C。

    我对代码的数量感到抱歉,但我认为最好尽可能详细地解释我的问题。感谢您的帮助!

    4 回复  |  直到 16 年前
        1
  •  3
  •   Péter Török    16 年前

    mListNew

    MList_t newNode;
    

    MList_p mListNew(int dx, int dy)
    {
        MList_p newNode = malloc(sizeof(MList_t));
        newNode->dx = dx;
        newNode->dy = dy;
        newNode->next = NULL;    
        return newNode;
    }
    
        2
  •  1
  •   Stephen Cross    16 年前

        3
  •  0
  •   Mawg says reinstate Monica    16 年前

    MList_t mListNew(int dx, int dy)
    {
        MList_t newNode;
        newNode.dx = dx;
        newNode.dy = dy;
        newNode.next = NULL;    
        return newNode;
    }
    

    void mListNew(int dx, int dy, MList_t *newNode)
    {
        newNode->dx = dx;
        newNode->dy = dy;
        newNode->next = NULL;    
    }
    

        4
  •  -1
  •   Erich Kitzmueller    16 年前