插入单链表

时间:2014-08-11 13:48:43

标签: data-structures linked-list

以下插入单链表的方法有哪些优点和缺点?

struct node
{
    int data;
    struct node *next;
};

void insert(struct node** head,int val)
{
    struct node *nptr=(struct node*)malloc(sizeof(struct node));
    nptr->data=val;
    nptr->next=*head;
    *head=nptr;
}

struct node* insert(struct node *head,int val)
{
    struct node *nptr=(struct node*)malloc(sizeof(struct node));
    nptr->data=val;
    nptr->next=head;
    return nptr;
}

1 个答案:

答案 0 :(得分:0)

可以在表达式中使用返回node*的函数。例如,为了创建一个包含2个节点的列表,您可以编写(理论上):

node* head = insert(insert(NULL, 1), 2);

但是,在现实生活中,您必须检查malloc的返回值。这意味着需要修改这两个函数以包含此检查。例如,第一个函数的更正确版本是:

bool insert(struct node** head,int val)
{
  struct node *nptr=(struct node*)malloc(sizeof(struct node));
  if (nptr != NULL)
  {
    nptr->data=val;
    nptr->next=*head;
    *head=nptr;
    return true;
  }
  else
  {
    return false;
  }
}

仍然可以在表达式中使用这些修改过的函数,但是你必须通过Ternary Operator调用它们,这将增加表达式的长度和复杂性。

至于你的两个案件的通话效率,也没有明确的答案。您的代码可能由各种编译器针对各种硬件进行编译 - 例如,请参阅x86 calling conventions以更好地了解调用者函数和被调用函数之间的情况。因此,在某些情况下,第一个函数会快一点,而在某些情况下第二个函数会更快一些。并且 - 一些编译器甚至会将您的函数编译为完全相同的汇编代码。