/*******************************************************************************************//*
代码及编写过程小结:
1.在使用sibling进程链时发现这个链有很严重的不可塑性,属于同一个父进程的所有子进程的sibling链都不相同,长短不一,而且链上的进程也毫无规律(至少我没找到)所以使用sibling链的结果就是只能打印部分进程,做不到遍历,于是放弃sibling
2.于是只剩下了children链可用,不过它的稳定性和一致性还是很让人放心的。但简单的数据结构就意味着要面临复杂的算法问题:
(a)在做深度优先遍历时,通过list_entry()做循环可寻找到叶子节点,但如何向根方向回溯却成了问题,我使用了一个栈来存放祖先节点(从根节点到该节点所经分支上的所有节点),拥有了祖先节点,用几个push,pop回溯和遍历看起来就不是问题了就不是问题了。
(b)拥有了祖先节点,但却无法避免以某一祖先节点为选定节点进入另一树杈时却进入了原来已经扫过的树杈。这里想到两种解决方法,一是将已扫过树杈进行标记,但考虑到需要定义一个结构体,就犹豫了。于是有了第二种方法---在存放祖先节点的栈里并不存放祖先节点,而是存放(祖先节点)->next。至于这种方法的可行性,我用自己幼稚的框图法演绎了无数遍,给自己了一个肯定的答案。不知是不是创新O(∩_∩)O
(c)剩下的就是一些细节问题了,比如递归的出口啊,判断条件啊什么的,应该做的还算规矩……
(d)输出格式的缩进没有加在代码里,但是在我的结构里确实非常好做的,因为我保存了节点所处层次,就是祖先节点栈(其实是数组)里的序号i!相应的,i等于几,就缩进几个空格。
ps:除了没办法运行,我还是挺喜欢我的代码的
*//*******************************************************************************************/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <li