C 当节点已经存在时,插入节点的代码实际上是如何编写的
插入节点后,*sPtr是指向第一个节点的头指针,插入第二个节点的代码实际上是如何工作的?我知道while循环正在遍历节点,检查current是否等于null,这等于*sPtr的内容,以及输入的值是否大于current的数据。但我不明白的是它后面的if-else语句部分。如果我得到它,它会将newPtr放在列表的开头,但是在else部分,前面的ptr->nextPtr=newPtr; newPtr->nextPtr=currentPtr;如何将现有节点*sPtr->[existing node]链接到新创建的已分配jsut的上一个和当前节点C 当节点已经存在时,插入节点的代码实际上是如何编写的,c,pointers,struct,nodes,C,Pointers,Struct,Nodes,插入节点后,*sPtr是指向第一个节点的头指针,插入第二个节点的代码实际上是如何工作的?我知道while循环正在遍历节点,检查current是否等于null,这等于*sPtr的内容,以及输入的值是否大于current的数据。但我不明白的是它后面的if-else语句部分。如果我得到它,它会将newPtr放在列表的开头,但是在else部分,前面的ptr->nextPtr=newPtr; newPtr->nextPtr=currentPtr;如何将现有节点*sPtr->[existing node]链
void insert(ListNode* *sPtr, char value)
{
ListNode* newPtr = malloc(sizeof(ListNode));
if (newPtr != NULL) {
newPtr->data = value;
newPtr->nextPtr = NULL;
ListNode* previousPtr = NULL;
ListNode* 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 previousPtr and currentPtr
previousPtr->nextPtr = newPtr;
newPtr->nextPtr = currentPtr;
}
}
else {
printf("%c not inserted. No memory available.\n", value);
}
}
我不确定我说的是否有道理,但这确实让我困惑。感谢您的解释,提前谢谢!!:) 您的问题将在
else
路径中输入的场景是:在列表尾部添加第二个节点。然后,while循环previousPtr
指向第一个且仅指向列表节点previousPtr=*sPtr
,currentPtr
指向列表末尾currentPtr=NULL
。因此,else
路径将把第一个/头列表节点的下一个指针链接到新的列表节点。新列表节点的下一个指针将指向列表的末尾(NULL
)?因为我试着把它画出来理解它,让我们假设PreviousPtr有a作为数据,new有b作为数据,在else语句中,PreviousPtr有第一个/现有的节点,并指向NewPtr,然后NewPtr->nextPtr现在指向等于NULL的currentPtr。上一个->新->当前。所以*sPtr没有指向任何东西?*sPtr
不会在else
路径中更改,因此插入后指向同一节点。例如,如果列表仅包含一个数据为“a”的节点,而您插入了一个数据为“b”的节点,则*sPtr
在插入前后指向数据为“a”的节点。数据为“b”的节点将仅链接到列表尾部和列表头部,即*sPtr
不会更改。好吧,我想我对节点的理解是错误的,所以当前或以前的节点只是指向节点的指针?它们本身不是节点,只是*sPtr之类的指针?