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

标签 c

我试图理解 Deitels 第 5 版 c 书中的这段代码。

如果我要在链表中插入一个新节点,为什么要设置 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;
    }

}
}

最佳答案

第一个节点不应该将它的 nextPtr 设置为 NULL,那将是最后一个节点(毕竟你需要能够从第一个到第二个节点)。第一个节点的nextPtr 指向第二个节点,第二个节点有指向第三个节点的指针,依此类推。因此,当您在列表的开头插入时,您让新节点的 nextPtr 指向列表的旧开头,即 *sPtr。之后,通过执行 *sPtr=newPtr 将指向列表开头的指针设置为指向新节点。

关于c - 如何将新节点插入空列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9013212/

相关文章:

c# - Windows 上等效的 UpdateSystemActivity 是什么

c - 打印字符数组时 Valgrind 读取大小为 8 的内容无效

c - 存储和打印大于 2^64 的整数值

c - C 程序中的堆栈。弹出操作不起作用

c++ - 未初始化的值用法,使用sprintf或strcat时出错

c - 这个随机数 C 代码函数是如何工作的?

c++ - Qt Creator 链接错误 : undefined reference to `KFUNC'

.net - 如何使用c++或vb.net在windows中获取当前打开的应用程序?

c - 需要透明类型的好处和情况是什么?

c - C 语言中未声明的实体如何管理内存?