C语言 使用MALLOC/FREE从单链表中删除一个节点



我正在编写从单链表中删除节点的常用方法,但我不确定我删除它们的方式(通过使用FREE())是否正确。我想真正删除节点,释放内存。我已经提供了Node的结构定义以及如何创建Node结构。

我知道在Java中任何时候没有指向数据,它是自动清理的。我想对于C,我必须用free,但我用对了吗?例如下面,当我"释放"电流时,我能让电流引用其他东西吗?最好的方法是什么?

谢谢,我希望我的问题是清楚的!
typedef struct Node {
    int data;
    struct Node *next;
} Node;
struct Node* newNode(int value) {
    struct Node* node = (Node *)malloc(sizeof(struct Node));
    if (node == NULL) {
        // malloc fails. deal with it.
    } else {
        node->data = value;
        node->next = NULL;
    }
    return node;
}
void delete(int value, struct node *head) {
    struct Node* current = head;
    struct Node* previous = NULL;
    while (current != NULL) {
        if (current->data == value) {
            if (previous == NULL) {
                current = current->next;
                free(head);
            } else {
                previous->next = current->next;
                free(current);
                current = previous->next;
            }
        } else {
            previous = current;
            current = current->next;
        }
    }    
}

正确。当您使用free并提供一个指针时,指针当前所指向的数据将从内存中释放。指针本身存储在其他地方,可以用来指向不同的数据后"释放"。在删除非头节点(previous->next = current->nextcurrent = previous->next)时,在上一个节点和下一个节点之间创建链接是正确的。

我建议您的代码的一个补充是,在释放head之后,您应该将头部指针重新分配给新的头部帖子删除,在这种情况下,这将是当前的。

希望这对使用free()命令有帮助

struct Node
{
     int data;
     struct Node *next;
}
Node* Delete(Node *head, int position)
{
  Node *temp1 = head;
  if(position==0){
      head = temp1->next;
      free(temp1);
      return head;
  }
  Node *temp2;
  while(position>1){
      temp1 = temp1->next;
      position--;
  }      
  temp2= temp1->next;
  temp1->next = temp2->next;
  free(temp2);
  return head;
}

相关内容

  • 没有找到相关文章