起初的话我是在做单链表的实现遇到的这个问题奥
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);
}
|