在C编程中的linked-List末尾追加一个元素

时间:2013-12-31 17:39:28

标签: c null linked-list append

我一直在研究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;
    }

3 个答案:

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