我无法理解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
代表什么?
答案 0 :(得分:1)
当您调用create
时,您必须区分3个案例:
input
值小于或等于最小的现有元素 - >它成为新的名单input
值大于最小的现有元素 - >它被插入到列表中的一个位置为了找到要插入的位置,代码从列表start *pStart
开始并继续,直到找到插入位置。
pNew
表示您要插入的项目,它与查找插入位置无关。
答案 1 :(得分:0)
你的pNew
不是第一个头节点,实际上它是最后一个头节点,如果头后只有一个节点,那么它就是第一个和最后一个头节点。
使用pCurrent = *pStart;
时,指针变量*pStart
中的内存地址已分配给pCurrent
,现在因为*pStart
看起来像链接列表的头部,所以pCurrent
在pCurrent = *pStart;
代码行执行后,它也指向链表头部。
答案 2 :(得分:0)
pNew
被添加到某个位置,因此列表仍然排序。 pCurrent
是pNew
之后的节点,因此我们从头开始,并在while循环中搜索正确的位置。