什么是更好的方式?

时间:2017-04-25 22:45:55

标签: c pointers

这是我认为更好的方法。

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;
}

2 个答案:

答案 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的值更改为其他内容。

但是在你的方法中你可以做到这一点。因此能够改变头部(主要)内容(功能操作后的问题)你的头部可能指向新节点.........