以下在单链表中插入的方法的优缺点是什么?
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;
}
返回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;
}
}
在表达式中使用这些修改后的函数仍然是可能的,但是你必须通过三元操作符调用它们,这将增加表达式的长度和复杂性。
至于你们两种情况的呼叫效率,也没有明确的答案。您的代码可能由针对各种硬件的各种编译器编译—例如,请参阅x86调用约定,以更好地理解调用者函数和被调用者函数之间发生的事情。所以,在某些情况下,第一个函数会快一点,在其他情况下,第二个函数会快一点。有些编译器甚至会将两个函数编译成完全相同的汇编代码。