我正在尝试从Deitels第5版c book中理解这段代码。
如果我在链表中插入新节点,为什么我要设置nextPtr = * sPtr。第一个节点不应该有一个NULL的nextPtr吗?
* 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;
}
}
}
答案 0 :(得分:1)
新节点插入列表的开头,因此接下来指向列表的开头,列表的开头设置为指向新节点,例如:
如果你有 B-&以及c
你要插入一个,首先指向b A-> B-&以及c
然后设置列表指向a 列表 - > A-> B-&以及c
答案 1 :(得分:1)
第一个节点的nextPtr
不应设置为NULL
,这将是最后一个节点(毕竟您需要从第一个节点到第二个节点)。第一个节点的nextPtr
指向第二个节点,该节点具有指向第三个节点的指针,依此类推。因此,当您在列表的开头插入时,您可以让新节点的nextPtr
指向列表的旧开头,即*sPtr
。然后,通过执行*sPtr=newPtr
设置指向列表开头的指针指向新节点。
答案 2 :(得分:1)
如果您的意思是行newPtr->nextPtr = *sPtr
,那么这是新数据值小于列表中已有数据的情况的代码,并且必须在开头插入节点。新节点nextPtr
必须指向曾经是列表中的第一个节点(newPtr->nextPtr = *sPtr
),并且开头必须更改为新节点(*sPtr = newPtr
)。代码看起来很好。