我想删除一个链表中的节点,但是它没有按预期工作。我也不确定如何在某些时候释放要删除的节点。来源:
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;
}
关于c - 通过引用传递给函数的链表中节点的删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22942494/