[英]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.