数据结构之链表小结

1.做题考虑全面,空输入,只有一个输入,只有两个输入,相邻的情况,头的情况,末尾的情况!要全面!全面!

2.擅长分类讨论并且在讨论的时候归纳出共同点再动手会简单很多,代码也会好写、好看很多。

3.单向链表想要从后往前操作有两种方法:递归和栈

4.malloc申请的空间及时用free释放,否则容易内存泄漏

5.指针始终是指向空间的,多个指针也只是指向的同一个共享空间

typedef struct node{
   int val;
   struct node *left;
   struct node *right;

}Node,*PNode;


1).PNode p;只是代表申请了一个指针变量,但是没有赋值,也就是没有指向的空间,是野指针,不能用。

2).PNode p1;
  PNode p2 = p1;
  PNode p2 = (PNode)malloc(sizeof(Node));
  p2->val = 1;
注意上面这么写是不能成功的,p1是没有值的。因为:
指针在直接等号赋值的时候,其实是空间的共享,所以p2重新申请空间p1是不会变化的,还是指向自己的空间。

3).PNode *p1 = (PNode*)malloc(sizeof(PNode));
  PNode p2 = (*p1);
  PNode p2 = (PNode)malloc(sizeof(Node));
  p2->val = 1;

上面的操作还是错的,p1并不会有值,还会报错。因为PNode *p1虽然申请了空间,但是
(*p1)却是没有空间的,这样相当于指针没有申请空间,所以错误同上面一样。
正解:
(*p1) = (PNode)malloc(sizeof(Node));
!!!!!!!!!!!!!!!!!总之记住空间共享!!!!!!!!!!!除此没有联系!!!!!!!!!!!!!!!

6.Debug模式可以正常运行,Release模式崩溃,可能是:

变量没有初始化,数组或者指针访问越界,数组空间申请的时候申请小了

(如int *A = (int *)malloc(sizejof(int)这里本来想申请10个空间结果写漏了))

7.常见的指针报错

Ox00000000一般是NULL,也就是0,空指针
Oxcccccccc野指针
0xcdcdcdcd - Created but not initialised
创建但没有初始化
0xdddddddd - Deleted
删除(较少见,我没有见过)
0xfeeefeee - Freed memory set by NT's heap manager
堆管理器释放的内存区域
0xcccccccc - Uninitialized locals in VC6 when you compile w/ /GZ
当编译时没有初始化的局部变量
0xabababab - Memory following a block allocated by LocalAlloc()

局部变量内存块.(越界,例如数组最大为2,访问了3,4,5等)

8.单向链表注意快、慢指针的方法运用,可以解决很多问题。

猜你喜欢

转载自blog.csdn.net/c_living/article/details/80977819