我有一个链表结构,我想将一个节点(另一个结构)指针传递给一个函数(该节点是链表的一部分,但我将节点单独传递给删除器函数
我希望它将下一个节点数据复制到自身(覆盖其数据),并删除下一个节点,从而删除自身(这部分正在工作)。我让它检查传递的节点是否是列表中的最后一个节点,如果是,则删除自身。
我不知道如何从堆栈中删除结构(我知道我可以使用堆内存 malloc() 和 free() 它)。
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int data;
struct node * next;
}node;
typedef struct {
struct node * head;
}linked_list;
void print_list(linked_list * list) {
node *current = list->head;
while (current) {
printf("Current node has %dn",current->data);
current = current->next;
}
}
void delete_node(node * n) {
node * next = n->next;
if (next) {
n->data = next->data;
n->next = next->next;
}
else {
*n = NULL; /*This of course won't compile because assigning void* (null) to node variable
but if i make n point to NULL, nothing will happen because i'm inside a function
and the pointer is duplicated (the passed pointer will still work) */
}
}
void main(){
node first;
node second;
first.data = 1;
first.next = &second;
second.data = 2;
second.next = NULL;
linked_list l;
l.head = &first;
print_list(&l);
delete_node(&second);
print_list(&l);
}
正如其他人所说,你不能。
如果您希望能够在列表中存储已分配(按malloc
)和未分配(静态或自动)存储对象,并具有从列表中删除对象并释放它们的"删除"功能,则需要存储为每个列表成员的一部分,指示它是否在分配的存储中, 并且只释放那些。
另请注意,如果在从列表中删除具有自动存储的结构的生命周期结束,您将遇到大麻烦!如果处理这个问题对您来说完全令人困惑,那么您可能最好为所有列表成员使用分配的存储(malloc
)。
:)
在大多数计算机体系结构上,局部变量要么直接在 CPU 寄存器上分配,要么在堆栈上分配。对于在堆栈上分配的局部变量,堆栈的顶部(用于保存函数调用的返回地址的同一堆栈)纵以在函数进入时为它们腾出空间,并在函数退出时恢复以"释放"内存。 所有这些堆栈管理都由编译器自动处理。
您可以使用"free"运算符来释放/删除内存中分配的malloc对象。为此,您可以在代码中编写:
free(n);