如何从链表中删除第一个节点? (C)

时间:2017-04-19 03:40:15

标签: c linked-list

我在下面有一个函数,它将一个节点添加到链表的末尾。

struct node {
char customer[100];
struct node *next;
}node;

struct node *add_name(struct node *tail, struct node *new_node) 
{
    struct node *temp;
    if(tail==NULL) {
        tail=new_node;
    }
    else {
        temp=tail;
        while (temp->next!=NULL) {
            temp=temp->next;
        }
        temp->next=new_node; //tail points to new node
    }
return tail;
}

我现在正在尝试编写一个将打印然后删除链表的第一个节点的函数。然而,我的问题是我不知道该怎么做,因为我只是看到目前为止的结尾,而不是开始。我知道我需要声明指针*head指向第一个节点,但是我该怎么做呢?我怎么知道它会指向第一个节点?这是我第一次使用链接列表,所以我仍然对它们感到困惑。

1 个答案:

答案 0 :(得分:4)

添加新元素时,不应传递列表的尾部。你需要知道的唯一的事情是它的头。插入应如下所示:

void insert(node **head, char *customer)
{
    node *new_node = malloc(sizeof(node));

    if(!new_node)
    {
        printf("Memory allocation failed!\n");
        exit(1);
    }
    new_node->data = customer;
    new_node->next = NULL;

    node *temp = *head;

    if(!temp)
        *head = new_node;
    else
    {
        while (temp->next != NULL)
        {
            temp = temp->next;
        }
        temp->next = new_node;
    }
    return ;
}

以这种方式插入时,删除可能如下所示:

void deleteHead(node **head)
{
    node *temp = *head;
    temp = temp->next;
    free(head);
    *head = temp;
}

你创建了temp,所以你可以将元素的地址存储在head的旁边,即将成为head。然后你删除头部的什么,并将头部声明为temp->next。现在指向曾经是列表中第二个元素的内容。