如何将新节点插入空列表?

时间:2012-01-26 02:11:51

标签: c

我正在尝试从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;
    }

}
}

3 个答案:

答案 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)。代码看起来很好。