何时使用免费的链表删除节点代码?

时间:2018-03-26 01:26:14

标签: c

var myArray = ["Month,Expenditure,Income,Year", "January,187458,297664,1", "February,104967,274354,1", "March,202394,343509,1", "April,187532,94652,1", "May,138745,206456,1", "June,234857,143657,1", "July,193453,203433,1", "August,96343,45064,1", "September,371298,505635,1", "October,63756,85635,1", "November,45363,14355,1", "December,98642,173125,1"];

const select1 = document.querySelector('select[name=xaxis]');
const select2 = document.querySelector('select[name=yaxis]');

myArray[0].split(',').forEach(item => {
    select1.appendChild(document.createElement('option')).textContent = item;
    select2.appendChild(document.createElement('option')).textContent = item;
});

键已排序。 delete接受一个键然后删除它。它有效,但我不明白何时免费使用。

我们必须释放()我们从列表中取消链接的结构项

3 个答案:

答案 0 :(得分:3)

你必须认为“malloc”和“free”与向某人借用东西一样。每当你从某人(malloc)借笔时,你需要稍后(免费)给它。

在您的情况下,您必须在确定没有任何内容可以访问它之后释放您的节点:

#include <stdio.h>
#include <stdlib.h>

struct item {
    int key;
    int data;
    struct item *next;
};

struct item *head = NULL;


void delete(int key)
{
    if(head == NULL) {
        ;
    } else if(head->key == key) {
        head = head->next;
    } else {
        struct item *curr = head;
        struct item *prev = NULL;
        int found = 0;
        while(curr != NULL) {
            if(curr->key == key) {
                found = 1;
                break;
            } else if(curr->key > key) {
                break;
            }
            prev = curr;
            curr = curr->next;
        }
        if(found) {
            prev->next = curr->next;
            free(curr); // Here
        }
    }
}

它与借用机制完全相同:你不能在返回后使用任何东西(使用免费) - 否则会崩溃。

答案 1 :(得分:1)

更新指向下一个项目的指针后,您必须删除当前项目。因为当前项目将不再使用。为避免内存泄漏,您需要删除它。

   if(found) 
   {
            prev->next = curr->next;
            free(curr)
   }

答案 2 :(得分:1)

只要您不再访问该内存,就应该将free()内存分配给指针。但你必须确保你实际上不需要它。例如,在您的代码中:

    if(found) {
        free(curr); // Here
        prev->next = curr->next;
    }

可能看起来会起作用,因为您已找到要删除的节点,但事实上,您仍然需要访问curr指向的数据,以便更新prev->next的值。所以你应该在这里释放它:

    if(found) {
        prev->next = curr->next;
        free(curr); // Here
    }

因为那时你真的不再需要访问curr的内容了。