在C中删除没有头指针的第一个节点

Deleting first node without head pointer in C

我正在尝试制作从第一个 node.I 创建的结构 a

删除的链表代码
struct node{
  int data;
  struct node *next;
};

然后添加了一些节点,没有使用头指针,这是我的主要

int main(){
struct node *first = malloc(sizeof(struct node));
struct node *second = malloc(sizeof(struct node));
struct node *third = malloc(sizeof(struct node));
struct node *forth = malloc(sizeof(struct node));

first->data = 1; //assing data in first node
first -> next = second; // link first node with second node

second -> data = 2;
second -> next = third;

third -> data = 3;
third -> next = forth;

forth -> data = 4;
forth->next = NULL;

printList(first);

// deletefromBeg(first);

    //printList(first);

}

这是我打印列表的 printList 代码

void printList(struct node *n){
while (n != NULL){
    printf("%d\n",n->data);
    n = n -> next;
}
}

但是这个删除代码不起作用。我只想删除我的第一个节点,列表从第二个开始。

void deletefromBeg(struct node *first){
struct node *temp;
temp = first;
first = first->next;
printf("%d",temp->data);
free(temp);
}

函数首先按值获取指针。表示函数先处理指针值的副本

void deletefromBeg(struct node *first){
struct node *temp;
temp = first;
first = first->next;
printf("%d",temp->data);
free(temp);
}

更改值的副本不会影响首先存储在指针中的原始值。

main中定义的指针first和函数的参数first是两个不同的对象。在函数中,您正在更改参数 first,该参数由 main.

中定义的指针 first 的值的副本初始化

你有两种方法。

要么你要return在函数内部获取指针的新值,然后在main like

中先赋值给指针
struct node * deletefromBeg( struct node *first )
{
    if ( first != NULL )
    {
        struct node *temp = first;
        first = first->next;
        free( temp );
    }

    return first;
}

并且在 main 中你调用函数

first = deletefromBeg( first );

或者你应该先通过引用传递指针。在 C 中,通过引用传递对象意味着通过指向对象的指针间接传递对象。

void deletefromBeg( struct node **first )
{
    if ( *first != NULL )
    {
        struct node *temp = *first;
        *first = ( *first )->next;
        free( temp );
    }
}

而在 main 中,函数被调用为

deletefromBeg( &first );

现在有了这个删除功能,您可以删除第一个节点,列表从第二个开始。

void delete(struct node *first) {
*first = *first->next;
free(first);
}