簡體   English   中英

通過引用傳遞給函數的鏈表中節點的刪除

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

我想刪除一個鏈表中的節點,但是它沒有按預期工作。 我也不確定如何在某些時候釋放要刪除的節點。 來源:

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);
}

函數printAllNode只是循環遍歷節點和打印value 代碼的輸出類似於:

1
2
3
head element detected
1
2
3

如您所見,什么也沒消失。 我該如何解決? 我非常不確定如何處理那些指向指針的指針。

#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