C 如何在空列表中插入新节点?
我试图从Deitels第5版c书中理解这段代码 如果我在链表中插入一个新节点,为什么要设置nextPtr=*sPtr。第一个节点的nextPtr不应该为NULL吗 还有*sPtr=newPtr意味着什么C 如何在空列表中插入新节点?,c,C,我试图从Deitels第5版c书中理解这段代码 如果我在链表中插入一个新节点,为什么要设置nextPtr=*sPtr。第一个节点的nextPtr不应该为NULL吗 还有*sPtr=newPtr意味着什么 struct listNode { char data; struct listNode *nextPtr; }; void insert(ListNodePtr *sPtr, char value) { ListNodePtr newPtr; /* pointer to a
struct listNode {
char data;
struct listNode *nextPtr;
};
void insert(ListNodePtr *sPtr, char value)
{
ListNodePtr newPtr; /* pointer to a new node */
ListNodePtr previousPtr; /* pointer to a previous a node in list */
ListNodePtr currentPtr; /* pointer to current node in list */
newPtr = malloc(sizeof(ListNode)); /* create node */
if (newPtr != NULL){ /* is space available */
newPtr->data = value;
newPtr->nextPtr = NULL;
previousPtr = NULL;
currentPtr = *sPtr;
while (currentPtr != NULL && value > currentPtr->data){
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}
/* insert new node at beginning of list */
if (previousPtr == NULL){
newPtr->nextPtr = *sPtr;
*sPtr = newPtr;
} else { /* insert new node between previosuPtr and currentPtr */
previousPtr->nextPtr = newPtr;
newPtr->nextPtr = currentPtr;
}
}
}
新节点插入到列表的开头,因此“下一步”指向列表的开头,列表的开头设置为指向新节点,例如: 如果你有 b->c 要插入a,首先指向b a->b->c 然后将列表设置为指向
列表->a->b->c新节点插入列表的开头,因此next指向列表的开头,列表的开头设置为指向新节点,例如: 如果你有 b->c 要插入a,首先指向b a->b->c 然后将列表设置为指向
list->a->b->c第一个节点不应该将它的
nextPtr
设置为NULL
,这将是最后一个节点(毕竟您需要能够从第一个节点到第二个节点)。第一个节点的nextPtr
指向第二个节点,第二个节点有一个指向第三个节点的指针,依此类推。因此,当您在列表的开头插入时,您会让新节点的nextPtr
指向列表的旧开头,即*sPtr
。然后,通过执行*sPtr=newPtr
将指向列表开头的指针设置为指向新节点,第一个节点不应将其nextPtr
设置为NULL
,这将是最后一个节点(毕竟,您需要能够从第一个节点到达第二个节点)。第一个节点的nextPtr
指向第二个节点,第二个节点有一个指向第三个节点的指针,依此类推。因此,当您在列表的开头插入时,您会让新节点的nextPtr
指向列表的旧开头,即*sPtr
。然后,通过执行*sPtr=newPtr
将指向列表开头的指针设置为指向新节点。如果您指的是行newPtr->nextPtr=*sPtr
,则这是新数据值小于列表中已有值的情况下的代码,并且必须在开头插入节点。新节点nextPtr
必须指向列表中以前的第一个节点(newPtr->nextPtr=*sPtr
),并且开始必须更改为新节点(*sPtr=newPtr
)。代码在我看来很好。如果您指的是行newPtr->nextPtr=*sPtr
,那么这是新数据值小于列表中已有值的情况下的代码,并且必须在开头插入节点。新节点nextPtr
必须指向列表中以前的第一个节点(newPtr->nextPtr=*sPtr
),并且开始必须更改为新节点(*sPtr=newPtr
)。代码在我看来很好。我明白了。这开始有意义了。@user995864:首先,我认为应该是(*sPtr)->nextPtr
,因为sPtr
是指向列表指针的指针。如果在开头插入新值,(*sPtr)->nextPtr
将指向插入之前的任何*sPtr
。对于空列表(*sPtr),在插入开始时将NULL
,因此在这种情况下(*sPtr)->nextPtr
将在插入后NULL
。确定。我在想*sPtr在一个空节点列表上有一个值。忘记第一个插入的值为null。这完全澄清了这一点!非常感谢!我讨厌做一个新手,但我到那里的速度太慢了!我懂了。这开始有意义了。@user995864:首先,我认为应该是(*sPtr)->nextPtr
,因为sPtr
是指向列表指针的指针。如果在开头插入新值,(*sPtr)->nextPtr
将指向插入之前的任何*sPtr
。对于空列表(*sPtr),在插入开始时将NULL
,因此在这种情况下(*sPtr)->nextPtr
将在插入后NULL
。确定。我在想*sPtr在一个空节点列表上有一个值。忘记第一个插入的值为null。这完全澄清了这一点!非常感谢!我讨厌做一个新手,但我到那里的速度太慢了!