在C中给出一个列表:

struct listNode
{
    int val;
    struct listNode *nextPtr;
};
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;


如果在将新项目插入到由指向最后一项(*sPtr)的指针给定的列表中的过程中,那么是一个新节点,我想修改指针*sPtr使其指向新节点,并且然后使新节点成为最后一个节点,是否可以像下面这样编写?

ListNodePtr newPtr;
newPtr=malloc(sizeof(ListNode));
if(newPtr!=NULL)
{
    newPtr->val=whatever;
    newPtr->nextPtr=NULL;
    *sPtr->nextPtr=newPtr;
    *sPtr=*sPtr->nextPtr;
}

最佳答案

您必须先检查最后一项(sPtr)是否为null,然后再取消对其进行引用,因为列表首先为空(假设未使用虚拟根节点)

同样,您可以将最后一个项目设置为*sPtr = newPtr而不是*sPtr = *sPtr->nextPtr。下一个指针是newPtr,因此将其分配给newPtr可以使事情更清晰,更不易出错

更新的版本将是:

ListNodePtr newPtr;
if((newPtr = malloc(sizeof(ListNode)))) {
  newPtr->val     = whatever;
  newPtr->nextPtr = NULL;

  if (*sPtr)
    (*sPtr)->nextPtr = newPtr;

  *sPtr = newPtr;
}

10-04 13:32