起初的话我是在做单链表的实现遇到的这个问题奥
bool DeleteNode(Linklist L){//删除某个指定的节点
if(L==NULL)
return false;
Linklist q=L->next; //出问题的错误代码
L->data=q->data;
L->next=q->next;
free(q);
return true;
}
后来我进行了调试
发现确实不对
这里的话L是对应应该删除的的节点
这里的话
我只考虑了当L是NULL返回false
然后我就进行一个替换操作
把我传入的节点和后面那个节点交换data
但是
可能我传入的节点后面没有下一个节点了,所以会出现空指针错误
如图奥
所以正确的代码应该是
bool DeleteNode(Linklist L){//删除某个指定的节点
if(L==NULL)
return false;
Linklist q=L->next;
if(q==NULL) //如果下个节点是空直接释放就行了
free(q);
return true;
L->data=q->data;
L->next=q->next;
free(q);
return true;
}
初始化常见错误
这个错误在初始化是真的很常见奥
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTnode{
int data;
struct BiTnode *lchild,*rchild; //左右指针
}BiTnode,* BiTree;
void createroot(BiTree a){
a=(BiTree)malloc(sizeof(BiTnode));
a->data=1;
a->lchild=NULL;
a->rchild=NULL;
}
int main(){
BiTree root = NULL;
createroot(root);
printf("%d",root->data); //错误的地方
}
为什么,看起来操作都正确但是运行不对呢?
进行一下调试奥
在函数creatroot里面我malloc了一个
树节点空间
赋值给了我的主函数里的指针变量
看得到奥左边的a确实发生了改变
我调试到函数的最后一切正常
然后返回主函数
root还是NULL
说明刚刚给root申请的内存空间
在函数进行完后就进行了释放
所以造成了空指针异常
解决方式
1.在主函数malloc申请空间不会导致对应的内存释放
2.在初始化函数返回对应的指针
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTnode{
int data;
struct BiTnode *lchild,*rchild; //左右指针
}BiTnode,* BiTree;
BiTree createroot(BiTree a){
a=(BiTree)malloc(sizeof(BiTnode));
a->data=1;
a->lchild=NULL;
a->rchild=NULL;
return a;
}
int main(){
BiTree root = NULL;
root=createroot(root);
printf("%d",root->data);
}