C - 从链表中弹出最后一项

C - Popping last item from linked lists

我正在学习链表,它们给我带来了很多麻烦。 我正在通过此调用调用该函数:

pop(&list);

代码如下:

void pop(NODE** first) {
if(*first != NULL && first!= NULL){
    NODE* ptr = *first;
    while(ptr->next->next != NULL){
        ptr = ptr->next;
    }
    free(ptr->next);
    ptr->next = NULL;   
}

即使我调用它一次,它也会导致内存泄漏错误..

多次调用此函数时,内存泄漏错误较多

提前致谢,Mimpopo。

编辑:节点的定义

typedef struct node {
    int data;
    struct node *next;
} NODE;

完整代码:

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

typedef struct node {
    int data;
    struct node *next;
} NODE;



NODE* insert(NODE *first, int n){
    // create new node
    NODE* new = (NODE*)malloc(sizeof(NODE));
    new->data = n;
    new->next = NULL;

    // if first is NULL, this will be the first
    if(first == NULL)
        return new;

     // otherwise, place it correctly
     NODE* ptr = first;

     // check inserting at the begining
     if(ptr->data > new->data){
        new->next = ptr;
        return new;
     }

     // insert in the middle
     while(ptr->next != NULL){
        if(ptr->next->data > n && ptr->data < n){
            new->next = ptr->next;
            ptr->next = new;
            break;
        }
        ptr = ptr->next;
     }

     // insert at the end of list
     if(ptr->next == NULL){
         ptr->next = new;
     }

    return first;
}

void traverse(NODE *first){
    NODE* ptr = first;
    while(ptr != NULL){
        printf("%d\n", ptr->data);
        ptr = ptr->next;
    }   
}   

NODE* search(NODE *first, int n){
    NODE* ptr = first;
    while(ptr != NULL){
        if(ptr->data == n){
            printf("FOUND %d\n!", n);
            return ptr;
        }
    ptr = ptr->next;
    }
}

int main(){
    NODE* first = NULL;
    NODE* this = NULL;
    first = insert(first, 7);
    first = insert(first, 10);
    first = insert(first, 11);
    first = insert(first, 1);
    first = insert(first, 3);
    first = insert(first, 5);
    first = insert(first, 22);
    first = insert(first, 23);
    first = insert(first, 24);
    first = insert(first, 125);

    pop(&first);




}

你的代码我没有全部看一遍,但是函数可以这样写

void pop( NODE ** first ) 
{
    if ( *first != NULL )
    {
        NODE *prev = NULL;
        NODE *current = *first;

        while ( current->next ) 
        {
            prev = current;
            current = current->next;
        }

        if ( prev != NULL ) prev->next = current->next;
        else ( *first = NULL );

        free( current );
    }
}

至于你的函数实现,那么它有很多错误。例如在这个声明中

if(*first != NULL && first!= NULL){

你应该交换第一个和第二个比较。那就是条件看起来像

if(first != NULL && *first!= NULL){

在此声明中

while(ptr->next->next != NULL){

您必须确保 ptr->next 不等于 NULL。

也没有检查删除的节点是否是列表的第一个节点。

考虑到函数insert也是错误的。您只考虑此代码段中的一个条件

 while(ptr->next != NULL){
    if(ptr->next->data > n && ptr->data < n){
        new->next = ptr->next;
        ptr->next = new;
        break;
    }
    ptr = ptr->next;
 }

不过也可以这样

    ptr->next->data >= n && ptr->data < n

    ptr->next->data > n && ptr->data <= n