这是我认为更好的方法。
int main()
{
node *head;
insertAfter(&head, 14, 12);
}
void insertAfter(node **head, int item, int after)
{
node *ptr, *loc;
loc = searchUnsorted(*head, after); //copy of *head passed
if(loc == (node *) NULL)
return;
ptr = (node*)malloc(sizeof(node));
ptr -> info = item;
ptr -> next = loc -> next;
loc -> next = ptr;
}
这就是我老师的想法。
int main()
{
node *head;
insertAfter(head, 14, 12);
}
void insertAfter(node *head, int item, int after)
{
node *ptr, *loc;
loc = searchUnsorted(head, after); //copy of *head passed
if(loc == (node *) NULL)
return;
ptr = (node*)malloc(sizeof(node));
ptr -> info = item;
ptr -> next = loc -> next;
loc -> next = ptr;
}
答案 0 :(得分:1)
我认为问题应该是“我应该何时传递指针(即您的教师版本),何时应该将指针传递给指针(即您的版本)”。
在链表的上下文中,如果函数可以交换列表的头部,则将指针传递给指针是有意义的。例如,考虑一个名为insertAtFront(node**head, int item)
的函数,该函数将在当前头部之前插入值,因此必须通知调用者“新”头部。
insertAtFront(node**head, int item) {
node *prevHead = *head;
*head = createNode(item); // assign *head a new value; caller's pointer value will change
*head->next = prevHead;
}
insertAtFrontWrong(node*head, int item) {
node *prevHead = head;
head = createNode(item); // only local variable head will get new value; caller's value will not change
head->next = prevHead;
}
int main() {
node *main_head = createNode(10);
insertAtFront(& main_head,20); // OK; afterwards main_head will point to the new head
insertAtFrontWrong(main_head,30); // Not OK; value of main_head will remain as is
}
但是,如果函数根据定义不交换头部,则不必将指针传递给指针;一个“普通”指针就足够了:
void insertAfterSuperflousIndirection(node **head, int item, int after) {
// use (*head)->... to traverse/change successors
// *head will, however, never be set to a new value, so indirection is superfluous
}
void insertAfter(node *head, int item, int after) {
// use head->... to traverse/change successors
}
所以在你的情况下,如果“insertAfter”永远不会交换头部,我更喜欢老师的版本。
答案 1 :(得分:0)
你是老师试图通过价值传递,你试图通过引用传递。在我看来,你的方法比老师更好。但它确实与您想要做的不同。 如果您希望在被调用函数期间更新您的头指针,那么通过引用传递是好的。这样,被调用者对头指针存储器位置所做的任何更改也会在主体中更新。
假设头 - > 0xabc123(头部的内存地址)和内容0xadf432
你老师的理论
insertAfter()的头部存储head(of main)的内容,即0xadf432。您可以使用节点,但是您无法修改head(of main)的内容,即无法将0xabc123的值更改为其他内容。
但是在你的方法中你可以做到这一点。因此能够改变头部(主要)内容(功能操作后的问题)你的头部可能指向新节点.........