早上解决了昨天的那个队列的问题,结果发现错误的原因是出队列的那个函数存在着问题,具体的原因是那个队列的头是不应该存任何数据的,如果队列要换头的话就应该是front->next作为换头的语句Q->front->next=p->next 而不是之前的Q->front = p->next。中间调试了很久一直调试不出来,C出现的问题的时候,虽然可以调试,但是调试的时候很难看出问题,需要一步步仔细的检查。然后就是研究了下指针数组,数组指针,用指针实现数组。也就是昨天的那一块用数组的方式实现层序遍历。具体代码如下。// 分配内存
struct TreeNode* ** traversalNode = (struct TreeNode* **)malloc(*returnSize * sizeof(struct TreeNode* *));
int **traversalVal = (int**)malloc(*returnSize * sizeof(int*));
*columnSizes = (int*)malloc(*returnSize * sizeof(int));
指针一开始不容易理解,但只要理解了,其实这三种格式都是一样的,就是在分配内存,先说最简单的就是最下面的那一行代码,这就是一个一唯数组,首先就是开一块能存储8个int的大小的空间,然后把指向该空间的首地址传递给 *columnSizes,然后我们访问数组的每一个元素就*columnSizes[0]~*columnSizes[7]访问。平常我们说数组就是指针,int a[5];*a, *(a+1);可以这样转化。当然我觉得*(*columnSizes+1)也可实现。
再来说上面的那几行,其实也是一样的,无非这里开辟内存的空间变成了int,然后这里面存了比如说有`8 * sizeof(int),同理是开辟了一块存储8int大小的地址这可以时说是我们二维数组中的第一维度的存储空间。然后把这个存储空间的首地址赋值给了int *traversalVal。但是这里要考虑到一个问题,我们为什么要这样做,和int a[9][10]有什么区别吗?好了问题来了,当我们这样做有什么不同吗?答案是有,目前我能想到的就是,这样做能够更好的利用空间。怎么说呢,他能保证数组的每块空间都能利用到。(因为我们在操作的时候只知道一个树的深度,但不知道树每层有多少个节点),也就是说我们只能确定a[n]数组的第一个维度。当我们需要确定数组的第二个维度的时候,只需要traversalVal[0] = (int)malloc(n * sizeof(int));这句话的意思就是说把存了这么多n*int存储空间的首地址指向给traversalVal[0];现在这块内容就变成了n个int的首地址了(就是说traversalVal[0]是这块内容的指针,指向这块内容的地址)。然后也就是说traversalVal[n]`指向的内容(内容只要是Int就行,多大的int不做限制)的地址。
Update your browser to view this website correctly. Update my browser now