我一直在研究C中的链表和关于追加功能,我遇到了以下代码:
struct node
{
int data;
struct node *next;
}*head;
void append(int num)
{
struct node *temp,*right;
temp= (struct node *)malloc(sizeof(struct node));
temp->data=num;
right=(struct node *)head;
while(right->next != NULL){
right=right->next;
}
right->next =temp;
right=temp;
right->next=NULL;
}
为了保存一行代码,不能只将 NULL 添加到 temp < / strong>的 下一个 属性?像这样:
void append(int num)
{
struct node *temp,*right;
temp= (struct node *)malloc(sizeof(struct node));
temp->data=num;
temp -> next = NULL;
right=(struct node *)head;
while(right->next != NULL){
right=right->next;
}
right->next =temp;
}
答案 0 :(得分:2)
是的,你是对的。事实上,我将通过编写分配和初始化数据的单独函数来进一步减少代码长度,如下所示:
struct node * getnode(int date){
struct node *temp = malloc(sizeof(struct node));
temp->data = data;
temp->next = NULL;
return temp;
}
// assuming list have more than one elements: demo code
void append(struct node *head, int num){
struct node *right = head;
while(right->next != NULL){
right=right->next;
}
right->next = getnode(num);
}
此get节点函数在代码的其他部分非常有用,例如insertatfist()
,insert()
顺便说一下:Don't cast the returned address of malloc()
and calloc()
.
您可能想编写也设置下一个节点地址的struct node* getnode(int data, struct node* next)
函数。
称之为:
要插入最后一个节点:
curt->next = getnode(num, NULL);
在curt
节点和curt->next
之间插入。
curt->next = getnode(num, curt->next);
答案 1 :(得分:1)
以这种方式肯定可以这样做,但是,我看到第一种方法中的代码对我的眼睛更具可读性(更小)。但是你不会节省太多。
但是不要试图对所有程序进行这些优化,使可读性比保存几行代码更重要。原因是编译器无论如何都要进行优化。
答案 2 :(得分:0)
如果你想“保存线条”,你也可以使用calloc而不是malloc,它将你的字节归零, 但那很清楚。
它确实为您节省了一行代码,并且它可以说得更清楚。 我认为您提出的代码更改是一种改进,因为它将新节点的创建与放置它分开。
如果这是生产代码,我可能会让睡觉的狗撒谎。但是,虽然我们都在这里讨论是如何实现相同的功能。
struct node
{
int data;
struct node *next;
};
struct node* init_node(int num)
{
struct node * temp = malloc(sizeof(struct node));
temp->data = num;
return temp;
}
void append(struct node* n, struct node* list)
{
while(list->next != NULL){
list=list->next;
}
list->next =n;
n->next=NULL;
}