简体   繁体   English

通过引用传递给函数的链表中节点的删除

[英]Deletion of a node in linked list passed to function by reference

I want to delete a node in a linked list but it doesn't work as expected. 我想删除一个链表中的节点,但是它没有按预期工作。 I'm also not sure how to free the to be deleted node at some points. 我也不确定如何在某些时候释放要删除的节点。 Here's the source: 来源:

typedef struct Node {
    struct Node *next;
    //there are much more values here but just take this one for simplicity
    int value;
} Node;


void removeNode(Node **nH, Node **n, Node **nP){
    Node *current = (*n);
    Node *nodeHead = (*nH);
    Node *nodePrev = (*nP);
    if(nodeHead == current){
        puts("head element detected");
        if(current->next == NULL){
            free(current);
            current = NULL;
            nodeHead = NULL;
        } else{
            current = current->next;
        }
    } else {
        if (current->next == NULL){
            nodePrev->next = NULL;
            free(current);
            current = nodePrev;
        } else{
            current = current->next;
        }
    }
}

void validateNodes(Node **newNodes, Node **mainNodes){
    Node *newHead = (*newNodes);
    Node *newTmp = newHead;
    Node *newPrev = NULL;
    //validation of values here
    //for testing just remove the head element
    removeNode(&newHead, &newTmp, &newPrev);
}
void printAllNodes(Node *s){
    for(;;){
        printf("%d\n", s->value);
        if(s->next != NULL)
            s = s->next;
        else
            break;
    }   
}

int main(int argc, char **argv){
    //population of the nodes goes here
    //for now lets assume we have 3 nodes with the values [1, 2, 3]
    printAllNode(newSchedule);
    validateNodes(&newSchedule, &mainSchedule);
    printAllNode(newSchedule);
}

The function printAllNode just loops through the nodes and print value . 函数printAllNode只是循环遍历节点和打印value The output of the code is like: 代码的输出类似于:

1
2
3
head element detected
1
2
3

As you can see nothing is gone. 如您所见,什么也没消失。 How can I fix that? 我该如何解决? I'm very unscure how to handle those pointers to pointers. 我非常不确定如何处理那些指向指针的指针。

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

typedef struct Node {
    struct Node *next;
    int value;
} Node;

void removeNode(Node **nH, Node *n, Node *nP){
    if(*nH == n){
        if(nP)
            nP->next = (*nH)->next;
        else
            *nH = (*nH)->next;
        free(n);
    } else {
        if((*nH)->next)
            removeNode(&(*nH)->next, n, *nH);
    }
}

void validateNodes(Node **newNodes, Node **mainNodes){
    removeNode(newNodes, *newNodes, NULL);
}
void printAllNodes(Node *s){
    while(s){
        printf("%d\n", s->value);
        s = s->next;
    }
}

int main(int argc, char **argv){
    Node *newSchedule, *mainSchedule;
    Node **nodes = malloc(3 * sizeof(Node*));
    int i;
    for(i=0;i<3;++i)
        nodes[i]=malloc(sizeof(Node));
    for(i=0;i<3;++i){
        nodes[i]->value = i+1;
        nodes[i]->next = nodes[i+1];
    }
    nodes[2]->next = NULL;
    newSchedule = nodes[0];
    printAllNodes(newSchedule);
    validateNodes(&newSchedule, &mainSchedule);
    printf("\n");
    printAllNodes(newSchedule);
    //deallocate;
    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM