/*
达内学习 数据结构 day20 2013-9-25
*/
函数返回数据的方式,
1 用return
2 用指针类型参数 返回
链表的元素插入
1 新建一个结点,指定数据、前结点、和后结点
2 判断新建的结点是否是首结点(prev==NULL),如果NULL就是首结点,设置list->head = 新结点 ;如果不是 改变prev->next = 新结点
3 把新结点的后节点->prev = 新结点(追加没有后结点)
练习:
单向链表
节点:两个成员:数据和next
链表:两个成员:head和tail:
1 实现list_init()、list_deinit(),list_append(),list_size(),list_printf(),和list_rprintf()函数,分别用于单向链表的追加测长,正向反向打印
2 实现list_reverse()函数 用于将单向链表逆转
3 实现list_middle()函数 用于获取单向链表的中间值,其平均时间复杂度不能超过O(N)(循环次数不能超过长度)
提示:反向打印,逆转单向链表可以使用堆栈或者递归
两个节点指针,一个递增1,另一个递增2,当递归2的指针到结束,递增1的指针的中间
递归的使用原则
1 有退出条件,否则 死循环
2 使用递归后,应该 是简化问题,而不是复杂化
递归的核心思想:
假定有一个函数已经你解决了问题(递归函数),在解决问题时就可以调用递归函数 ,比如反向打印问题
假定rprint函数已经解决了反响打印 ,打印当前就变成:
fprint(n-1),printf(n);
二叉树
二叉树是树状结构的最间模型,每个节点对多有两个子节点,每个子节点仅有一个父及诶单,整课树只有一个根节点
树具有递归的结构特征,用递归的方法处理,可以简化算法
三种遍历
前序 DLR
中序 LDR
后序 LRD
满二叉树 就是所有层节点都满了
完全二叉树 就是除了最后一层多有层都满了,而且最后一层左边满了
二叉树实现:
顺序标-必须是完全二叉树,莫不是完全二叉树必须用虚结点补成完全二叉树才能存储,有可能造成很大的内存浪费
链式表-更好的实现方式