posted @ 2013-03-27 19:31 俊介三在前进 阅读(143) 评论(0) 推荐(0)
摘要:
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。思路:可以看到双链表的排序是二叉树中序遍历的结果。因此,我们可以中序遍历二叉树,每次访问一个节点,就把它添加进我们的双链表来,注意,添加的意思是是改变一个指针而已,不需要额外的空间。。当然,需要记录一下双链表的头,以及每一次双链最后那个node。见代码:#include <stdio.h>#include <stdlib.h>#include <stack& 阅读全文
摘要:
给一个字符串,求它的全排列。如输入“abc”输出“abc” "acb" "bac" "bca" "cab" "cba"思路1:例如“abc”的情况,假如再来个“d”,那么怎么办呢?就是把“d”插入到原来排列的所有狭缝中。思路2:对于每个,都有可能放在第一位,因此先放“a”在首位,后面跟着b和c的全排列。对于每个都如此操作即可。思路2性能比较好,因为不用把中间结果保存着,再插入某个字母,又返回一个中间结果~#include <stdio.h>#include <string.h& 阅读全文
posted @ 2013-03-26 20:57 俊介三在前进 阅读(168) 评论(0) 推荐(0)
摘要:
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#define max(a,b) (a)>(b)?(a):(b)int arr[100][100];int find(int* arr, int len){ int i; int max = arr[0]; for(i=1;i<len;i++){ arr[i] = max(arr[i],arr[i-1]+arr[i]); if(max<arr[i]) max = arr[i]; } r 阅读全文
posted @ 2013-03-26 16:11 俊介三在前进 阅读(150) 评论(0) 推荐(0)
摘要:
尾递归(tail recursive)是指把结果保存在参数中,而不是每次都要重新计算子结果的值。相当于把中间过程保存了以提高计算效率#include <stdio.h>int fac(int n){ if(n==0 || n==1) return 1; else return fac(n-1)*n;}//tail recursive//满足两点:1递归调用在函数最后执行;2它的返回值不属于表达式的一部分。int fac2(int n, int a){ if(n==0 ||n==1) return a; else return fac2(n-1,n*a);}int mai... 阅读全文
posted @ 2013-03-24 16:08 俊介三在前进 阅读(128) 评论(0) 推荐(0)
摘要:
插入排序、快速排序、归并排序、冒泡排序、选择排序、希尔排序。如下:#include <stdio.h>void swap(int& a, int& b){ int temp = a; a = b; b = temp;}void print(int* arr, int len){ int i; for(i=0;i<len;i++){ if(i==0) printf("%d",arr[i]); else printf(" %d",arr[i]); } puts("");}//insert sort. fi 阅读全文
posted @ 2013-03-24 15:25 俊介三在前进 阅读(161) 评论(0) 推荐(0)
摘要:
二叉树的定义,及前、中、后、层、递归、非递归遍历。如下:#include <stdio.h>#include <stdlib.h>#include <stack>#include <queue>using namespace std;struct Node{ int data; Node* left; Node* right; Node(){} Node(int d){ data = d; left = NULL; right = NULL; }};//pre order travelvoid preorder(No... 阅读全文
posted @ 2013-03-23 23:30 俊介三在前进 阅读(156) 评论(0) 推荐(0)
摘要:
有单循环和双循环链表两种。就是最后一个Node又指回头一个Node而形成一个环。它的一个例子是:LRU(最近最少使用)页面置换算法的其中一种实现-第二次机会置换法。当空闲页面链表为空时,系统将如何分配新的页帧?第二次机会置换法,它的工作方式是:维护一个当前存在于物理内存中的页面循环链表。假设链表中的每个元素只存储一个页码和一个引用值,引用值要么为1要么为0.在实践中,每个元素还会包含其他的信息。所有的页面初始的引用值都为0,每当系统访问页面时。该页面的应用值就设置为1.当需要某个页帧时操作系统就使用它维护的循环链表以及引用值来判断哪些页面应该释放其页帧。为了确定这一点开始遍历链表直到找到一个引 阅读全文
posted @ 2013-03-23 20:06 俊介三在前进 阅读(213) 评论(0) 推荐(0)
摘要:
双链表相对于单链表来说,多了只想前一个Node的指针。假如有N个node的话,多了N个指针,换来了比单链更灵活的遍历(可以倒着来了),是不是需要这样,it all depends.双链表实验:one way or round trip? round trip!#include <stdio.h>#include <stdlib.h>struct DList{ int data; DList* prev; DList* next; DList(){} DList(int d){ data = d; prev = NULL; ... 阅读全文
posted @ 2013-03-23 19:43 俊介三在前进 阅读(143) 评论(0) 推荐(0)
摘要:
单链表就是每个Node都有一个数据项和一个指向下一个Node的指针。优点显而易见:便于删除某个节点、添加某个节点;存储这个结构不需要连续的地址。其中一个例子是:页帧的管理。虚拟内存技术是一种地址空间的映射机制,它允许进程不必完全加载到物理内存也能运行。进程以为自己使用内存连续的地址,实际上内存为每个进程都配备了页表,它把进程以为的地址(连续的虚拟地址)和实际的物理地址(一般都是零零散散的吧)一一对应起来。但这样,当进程引用某个虚拟地址,根据这个页表查找,发现不在物理页帧上,就会产生页错误并为之在物理内存中分配一个页帧,至于什么进程页何时移除物理内存,又是另一个问题,有相应的机制。单链表的基本操 阅读全文
posted @ 2013-03-23 19:26 俊介三在前进 阅读(135) 评论(0) 推荐(0)
浙公网安备 33010602011771号