在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);
}
我正在尝试制作从第一个 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);
}