在教科书" C"中的数据结构基础知识中, (作者:Horowitz Sahni Anderson-Freed)
他们提供以下代码
作为插入节点的方法
在链表中的某个任意节点x之后:
void insertNode(nodePtr *listPtr, nodePtr insertLoc, int data)
{
nodePtr temp = (nodePtr)malloc(sizeof(*temp));
temp->data = data;
if(*listPtr) // not empty
{
temp->next = insertLoc->next;
insertLoc->next = temp;
}
else //empty
{
temp->next = NULL;
*listPtr = temp;
}
}
因此,以下调用将导致:
nodePtr head = NULL;
insertNode(&head,head,10); // 10
insertNode(&head,head,20); // 10 -> 20
insertNOde(&head,head,30); // 10 -> 30 -> 20
我的问题: 如何在列表的前面插入节点?
答案 0 :(得分:2)
链接列表是一种非常简单的数据结构,其中每个节点都包含一个有效负载(在您的情况下为int)和一个指向下一个节点的指针。该列表由指向特殊" NIL"的指针终止。节点,在C中通常只是一个NULL指针。
要预先添加到列表中,您只需创建一个新节点并将其NEXT指针指定给前一个节点。
另外,不要忘记检查malloc的返回值。或者使用glib中的g_malloc自动执行此操作。
nodePtr cons(nodePtr tail, int data)
{
nodePtr head = malloc(sizeof(*nodePtr));
assert(head);
head->data = data;
head->next = tail;
return head;
}
答案 1 :(得分:2)
书中的功能是完全疯狂的,恕我直言。 (也许这本书是关于C ++的?)
可能在顶部插入的一个可能的替代函数是在条件中使用insertLoc而不是listPtr:
void insertNode(nodePtr *listPtr, nodePtr insertLoc, int data)
{
nodePtr temp = malloc(sizeof *temp );
temp->data = data;
if (insertLoc) // Position requested
{
temp->next = insertLoc->next;
insertLoc->next = temp;
}
else // No: insert at top
{
temp->next = *listPtr;
*listPtr = temp;
}
}
答案 2 :(得分:0)
我更改了函数,因此NULL insertLoc表示插入为头
void insertNode(nodePtr *listPtr, nodePtr insertLoc, int data)
{
nodePtr temp = (nodePtr)malloc(sizeof(*temp));
temp->data = data;
if(*listPtr) // not empty
{
if (!insertLoc) {
temp->next = *listPtr;
*listPtr = temp;
} else {
temp->next = insertLoc->next;
insertLoc->next = temp;
}
}
else //empty
{
temp->next = NULL;
*listPtr = temp;
}
}