了解已排序的链接列表

时间:2016-02-22 12:33:23

标签: c

我无法理解C中已排序的链接列表。

我有以下代码:

void create(ListNode **pStart, int input)
{

    ListNode *pNew;
    ListNode *pPrevious;
    ListNode *pCurrent;

    pNew = malloc(sizeof(ListNode)); 

    if (pNew != NULL)
    {

        pNew->data = input;
        pNew->pNext = NULL;

        pPrevious = NULL;
        pCurrent = *pStart;

        while (pCurrent != NULL && input > pCurrent->data)
        {
            pPrevious = pCurrent;
            pCurrent = pCurrent->pNext;
        }

        if (pPrevious == NULL)
        {
            pNew->pNext = *pStart;
            *pStart = pNew;
        }
        else
        {
            pPrevious->pNext = pNew;
            pNew->pNext = pCurrent;
        }
    }
    else
    {
        printf("%c not inserted. No memory available.\n", input);
    }
    }

我很难理解它所说的部分pCurrent = *pStart;因为技术上不是第一个头部节点吗?什么是pCurrent = *pStart代表什么?

3 个答案:

答案 0 :(得分:1)

当您调用create时,您必须区分3个案例:

  • 列表为空
  • input值小于或等于最小的现有元素 - >它成为新的名单
  • input值大于最小的现有元素 - >它被插入到列表中的一个位置

为了找到要插入的位置,代码从列表start *pStart开始并继续,直到找到插入位置。

pNew表示您要插入的项目,它与查找插入位置无关。

答案 1 :(得分:0)

你的pNew不是第一个头节点,实际上它是最后一个头节点,如果头后只有一个节点,那么它就是第一个和最后一个头节点。

使用pCurrent = *pStart;时,指针变量*pStart中的内存地址已分配给pCurrent,现在因为*pStart看起来像链接列表的头部,所以pCurrentpCurrent = *pStart;代码行执行后,它也指向链表头部。

答案 2 :(得分:0)

pNew被添加到某个位置,因此列表仍然排序。 pCurrentpNew之后的节点,因此我们从头开始,并在while循环中搜索正确的位置。