如何在函数内使指针(到结构)为空

一个class轮问题:
有人可以解释为什么thisNode=NULL在函数中不起作用以及如何以其他方式实现相同的结果。

介绍:
在我开始研究数据结构时,我最近开始使用指针构建了很多。

历史:
我编写了堆栈,队列,二叉搜索树和表达式树,并将很快开始编写avl树。 作为一名学生,我仍然没有意识到许多概念,并希望得到任何帮助。

方法:
我总是找到其他方法来实现我所需的结果(使头节点归零),比如在main函数中将其置零,或者最终不将它归零并将其保持为具有空数据的头/根节点,然后添加其他(有用的)节点。 (仅用作头部或指向结构的指针)

混乱:
我不明白为什么在函数中对指向struct的指针归零不起作用,但是更改结构数据成员的值之类的其他事情也没有问题。

例如:

 thisNode->nextNode->data = thisNode->data; *//this does works* thisNode = NULL; *//this doesn't work* 

图片: headNode_is_not_getting_nulled

题:
有人可以解释为什么thisNode=NULL在函数中不起作用以及如何以其他方式实现相同的结果。

问题领域:

 void stackPop(stackNode *headNode){ if (headNode!=NULL){ if (headNode->nextNode!=NULL){ stackNode *tempNode = getLatestStackNode(headNode); tempNode->prevNode->nextNode=NULL; tempNode->prevNode==NULL; tempNode->data=='.'; tempNode=NULL; free(tempNode); }else if (headNode->nextNode==NULL){ headNode->data='\0'; headNode = NULL; free(headNode); } }else{ printf("\nstack currently has no nodes\n"); } } 

整个堆栈代码:

 #include  #include  typedef struct stackNode{ char data; struct stackNode *nextNode; struct stackNode *prevNode; }stackNode; stackNode* createStackNode(char value){ stackNode *newStackNode = (stackNode*) malloc(sizeof(stackNode)); newStackNode->nextNode=NULL; newStackNode->prevNode=NULL; newStackNode->data=value; return newStackNode; } stackNode* getLatestStackNode(stackNode *headNode){ stackNode *tempNode = headNode; while (tempNode->nextNode!=NULL){ tempNode=tempNode->nextNode; } return tempNode; } stackNode* stackPush(stackNode *headNode, char value){ if (headNode==NULL){ return createStackNode(value); } else { stackNode *tempNode = getLatestStackNode(headNode); tempNode->nextNode = createStackNode(value); tempNode->nextNode->prevNode=tempNode; return tempNode->nextNode; } } void stackPop(stackNode *headNode){ if (headNode!=NULL){ if (headNode->nextNode!=NULL){ stackNode *tempNode = getLatestStackNode(headNode); tempNode->prevNode->nextNode=NULL; tempNode->prevNode==NULL; tempNode->data=='.'; tempNode=NULL; free(tempNode); }else if (headNode->nextNode==NULL){ headNode->data='\0'; headNode = NULL; free(headNode); } }else{ printf("\nstack currently has no nodes\n"); } } char stackPeek(stackNode *headNode){ stackNode *tempNode = getLatestStackNode(headNode); return tempNode->data; } void stackPeekPrint(stackNode *headNode){ stackNode *tempNode = getLatestStackNode(headNode); printf("\n%c\n",tempNode->data); } void isNULL(stackNode *headNode){ if (headNode==NULL){ printf("\nIt is NULL\n"); } else if (headNode!=NULL) { printf("\nIt isn't NULL\n"); } } int main(){ stackNode *x = stackPush(NULL,'x'); stackPush(x,'u'); stackPush(x,'w'); stackPop(x); stackPop(x); stackPop(x); stackPeekPrint(x); isNULL(x); } 

在C中,所有参数都按值传递。 在stackPopheadNode作为参数传递,因此对它的任何更改都不会反映在调用函数中。

您需要从main传入x的地址,以便可以修改它。

所以将stackPop更改为:

 void stackPop(stackNode **headNode){ // takes a pointer-topointer if (*headNode!=NULL){ if ((*headNode)->nextNode!=NULL){ stackNode *tempNode = getLatestStackNode(*headNode); tempNode->prevNode->nextNode=NULL; // no need to clear fields before freeing free(tempNode); }else if ((*headNode)->nextNode==NULL){ // no need to clear fields before freeing free(*headNode); // free first, then set to NULL *headNode = NULL; } }else{ printf("\nstack currently has no nodes\n"); } } 

并称之为:

 stackPop(&x); 

您实际上是按值传递headNode(即传入指针的副本)。 您需要传入指向headNode的指针