c - 释放链表中的前一个节点
问题描述
我编写了一个函数来遍历链表,找到“int频率”最小值的节点,并在它遍历整个列表后删除该节点。我的错误来自节点:'prev'。当我运行代码时,我收到一条错误消息:“prev 是一个空指针”。但是,如果我从节点声明中删除 '= NULL' 部分,我会收到一个编译错误,上面写着:“prev 未初始化”。
这是因为我需要将 prev 分配/指向列表中的现有节点之一吗?如果是这样,我将如何将它指向我要删除的节点之前的节点?(我认为这是按照我的代码中的方式完成的,但显然不是。)
结构定义:
struct LetterFrequencyPair
{
char character;
int frequency;
//Creating a pointer to point to the next child in the list
struct BinaryTreeNode* next;
};
struct BinaryTreeNode
{
//create a pointer to point to the LetterFrequencyPair
struct LetterFrequencyPair* letter_frequency_pair;
//create pointers to the children of the node
struct BinaryTreeNode* leftChild;
struct BinaryTreeNode* rightChild;
};
struct BinaryTreeNode* ret_lowestF()
{
int val = 1000;
struct LetterFrequencyPair* temp;
struct LetterFrequencyPair* temp1 = NULL;
struct LetterFrequencyPair* prev = NULL;
struct LetterFrequencyPair* low = malloc(sizeof(struct
LetterFrequencyPair));
struct BinaryTreeNode* lowest = malloc(sizeof(struct BinaryTreeNode));
temp = root;
if (temp == NULL)
{
printf("List is empty.\n");
}
else
{
while (temp != NULL)
{
printf("%c\t%d\n", temp->character, temp->frequency);
if (val >> temp->frequency)
{
low = temp;
lowest->letter_frequency_pair = low;
val = low->frequency;
temp1 = temp;
prev->next = temp1;
}
temp = temp->next;
}
}
prev->next = temp1->next;
temp1->next = NULL;
free(temp1);
printf("lowest frequency node is: %c\t%d\n", low->character, low-
>frequency);
return lowest;
}
解决方案
当我运行代码时,我收到一条错误消息:“prev 是一个空指针”。但是,如果我从节点声明中删除 '= NULL' 部分,我会收到一个编译错误,上面写着:“prev 未初始化”。
嗯,是。尽管在几个地方您尝试分配给prev->next
,但您没有在任何地方分配给prev
它自己,除非您想计算它的初始化器。当该变量为NULL
时,或者当它根本没有定义值时,它不指向任何对象。在这种情况下,没有prev->next
.
看起来您想用来prev
跟踪当前最小值之前的节点。当列表的头节点是当前最小值时,这会带来一些问题。这可以通过在这种情况下设置prev
并NULL
为该特殊情况编写额外的代码来解决,但是通过引入人工前驱来回避问题会更容易和更清晰:
struct LetterFrequencyPair head = { .next = root };
struct LetterFrequencyPair *prev = &head;
请注意,无需动态分配头节点。就此而言,您不需要任何动态分配。目前,您的代码泄漏了它low
最初分配给指向的内存,并且lowest
对原始最低节点的分配和释放是浪费的。
您最终删除的节点可能会变成我们的第一个节点。在删除时您不需要特殊处理;在这种情况下,它应该自然而然地head.next
被设置(通过prev
)指向新的第一个节点。但是,最后,您需要将其复制回来:
root = head.next;
如果第一个节点不是被删除的节点,则该分配没有净效应。
您的代码还有很多其他问题,远远超出了问题的范围,但这应该可以帮助您入门。
推荐阅读
- r - 从带有反应变量的渲染图中排除数据点
- scala - 如何使用while循环将数据收集到单个列表中?
- django - ImageField url 属性
- python - Python Pandas DataFrame 中具有 IF 条件的 Lambda 函数行为异常
- c - 如何通过 liburing 实现每秒零纳秒的计时器?
- flutter - Flutter:TextFormField:调用setState()后光标重置为开始
- security - 如何保护我的应用程序中写入的数据,如密码
- java - H2 java.lang.ClassNotFoundException 用于在类路径中传递的触发器
- python - Python3 search by value in nested dictionaries and lists then get other nearest keys/values pair
- swift - How to put a sentence in a every line of List in Swift?