我正在尝试理解Deitels第五版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;
}
}
}
发布于 2012-01-26 10:21:43
第一个节点不应该将其nextPtr
设置为NULL
,这将是最后一个节点(毕竟,您需要能够从第一个节点获取到第二个节点)。第一个节点的nextPtr
指向第二个节点,该节点有一个指向第三个节点的指针,依此类推。因此,当您在列表的开头插入时,您会让新节点的nextPtr
指向列表的旧开头,即*sPtr
。然后,通过执行*sPtr=newPtr
将指向列表开头的指针设置为指向新节点。
发布于 2012-01-26 10:20:29
新节点被插入到列表的开头,因此next指向列表的开头,并且列表的开头被设置为指向新节点,例如:
如果你有b->c
如果你想插入a,首先指向b a->b->c
然后将列表设置为指向列表->a->b->c
发布于 2012-01-26 10:30:31
如果您指的是行newPtr->nextPtr = *sPtr
,那么这是针对以下情况的代码:新数据值小于列表中已有的任何值,并且必须在开头插入节点。新节点nextPtr
必须指向以前是列表中第一个节点(newPtr->nextPtr = *sPtr
)的节点,并且必须将开头更改为新节点(*sPtr = newPtr
)。代码在我看来没问题。
https://stackoverflow.com/questions/9013212
复制相似问题