给出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;
}
答案 0 :(得分:0)
在解除引用之前,您必须检查最后一项(sPtr)是否为空,因为列表最初是空的(假设未使用虚拟根节点)
您也可以设置最后一项*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;
}