Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在空列表中插入新节点?_C - Fatal编程技术网

C 如何在空列表中插入新节点?

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

我试图从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 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。这完全澄清了这一点!非常感谢!我讨厌做一个新手,但我到那里的速度太慢了!