我有一个链表结构,我想将一个节点(另一个结构)指针传递给一个函数(该节点是链表的一部分,但我将该节点单独传递给删除函数
我希望它将下一个节点数据复制到自身(覆盖其数据),并删除下一个节点,从而删除自身(此部分正在工作).. 我检查了传递的节点是否是列表中的最后一个节点,如果是,则删除自身。
我不知道如何从堆栈中删除结构(我知道我可以使用堆内存来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 %d\n",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);
}
答案 0 :(得分:1)
正如其他人所说,你不能。
如果您希望能够在列表中存储已分配的(通过malloc
)和未分配的(静态或自动)存储对象,并具有“删除”功能,可从列表中删除对象并释放它们,你需要存储一个标志,作为每个列表成员的一部分,指示它是否在分配的存储中,并且只释放它们。
另请注意,如果自动存储结构的生命周期在您从列表中删除之前结束,那么您将遇到大麻烦!如果处理这个问题对你来说很困惑,那么你可能会为所有列表成员使用分配的存储空间(malloc
)做得更好。
答案 1 :(得分:0)
你不能:)
在大多数计算机体系结构中,局部变量直接分配在CPU寄存器或堆栈上。对于在堆栈上分配的局部变量,当函数进入时,操作堆栈的顶部(用于保存函数调用的返回地址的相同堆栈)为它们腾出空间,并且它被恢复为“释放”函数退出时的内存。所有这些堆栈管理都由编译器自动处理。