以下插入单链表的方法有哪些优点和缺点?
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;
}
答案 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以更好地了解调用者函数和被调用函数之间的情况。因此,在某些情况下,第一个函数会快一点,而在某些情况下第二个函数会更快一些。并且 - 一些编译器甚至会将您的函数编译为完全相同的汇编代码。