1、编程实现单链表的就地逆置。
23.在数组 a[1..n]中有n个数据,试建立一个带有头结点的循环链表,头指针为h,要求链中数据从小到大排列,重复的数据在链中只保存一个。
2、对二叉树的某层上的结点进行运算,采用队列结构按层次遍历最适宜。
int leafklevel(bitree bt, int k) /求二叉树bt 的第k(k>1) 层上叶子结点个数。
if(bt==null ||k<1) return(0);
bitree p=bt,qq是队列,元素是二叉树结点指针,容量足够大。
int front=0,rear=1,leaf=0; /front 和rear是队头和队尾指针, leaf是叶子结点数。
int last=1,level=1; q[1]=p; /last是二叉树同层最右结点的指针,level 是二叉树的层数。
while(front<=rear)
p=q[++front];
if(level==k &&p->lchild &&p->rchild) leaf++;叶子结点。
if(p->lchild) q[++rear]=p->lchild左子女入队。
if(p->rchild) q[++rear]=p->rchild右子女入队。
if(front==last) last移到指向下层最右一元素。
if(level>k) return (leaf层数大于k 后退出运行。
}//while }/结束leafklevel
3、数组a和b的元素分别有序,欲将两数组合并到c数组,使c仍有序,应将a和b拷贝到c,只要注意a和b数组指针的使用,以及正确处理一数组读完数据后将另一数组余下元素复制到c中即可。
void union(int a,b,c,m,n)
/整型数组a和b各有m和n个元素,前者递增有序,后者递减有序,本算法将a和b归并为递增有序的数组c。
i=0; j=n-1; k=0;//i,j,k分别是数组a,b和c的下标,因用c描述,下标从0开始。
while(i=0)
if(a[i]while(iwhile(j>=0) c[k++]b[j--]
算法结束。4、要求二叉树按二叉链表形式存储。15分。
1)写一个建立二叉树的算法。(2)写一个判别给定的二叉树是否是完全二叉树的算法。
bitree creat建立二叉树的二叉链表形式的存储结构。
elemtype x;bitree bt;
scanf(“%d”,&x); 本题假定结点数据域为整型。
if(x==0) bt=null;
else if(x>0)
else error(“输入错误”);
return(bt);
//结束 bitree
int judgecomplete(bitree bt) /判断二叉树是否是完全二叉树,如是,返回1,否则,返回0
int tag=0; bitree p=bt, q;q是队列,元素是二叉树结点指针,容量足够大。
if(p==null) return (1);
queueinit(q); queuein(q,p); 初始化队列,根结点指针入队。
while (!queueempty(q))
p=queueout(q出队。
if (p->lchild &&tag) queuein(q,p->lchild); 左子女入队。
else /judgecomplete
4、根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量pre(初值为null)和全局变量flag,初值为true。若非二叉排序树,则置flag为false。
#define true 1
#define false 0
typedef struct node
*btree;
void judgebst(btree t,int flag)
/ 判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论。
if(t!=null &&flag)
//不是完全二叉树
judgebst (t->rlink,flag);/中序遍历右子树。
//judgebst算法结束。
5、 连通图的生成树包括图中的全部n个顶点和足以使图连通的n-1条边,最小生成树是边上权值之和最小的生成树。故可按权值从大到小对边进行排序,然后从大到小将边删除。每删除一条当前权值最大的边后,就去测试图是否仍连通,若不再连通,则将该边恢复。
若仍连通,继续向下删;直到剩n-1条边为止。
void spntree (adjlist g)
//用“破圈法”求解带权连通无向图的一棵最小代价生成树。
typedef struct node; /设顶点信息就是顶点编号,权是整型数。
node edge;
scanf( "d%d",&e,&n) ;输入边数和顶点数。
for (i=1;i<=e;i输入e条边:顶点,权值。
scanf("%d%d%d" ,edge[i].i ,&edge[i].j ,&edge[i].w);
for (i=2;i<=e;i++)按边上的权值大小,对边进行逆序排序。
//fork=1; eg=e;
while (eg>=n破圈,直到边数e=n-1.
if (connect(k)) 删除第k条边若仍连通。
edge[k].w=0; eg--;测试下一条边edge[k],权值置0表示该边被删除。
k++;下条边。
while
//算法结束。
connect()是测试图是否连通的函数,可用图的遍历实现,6、假设k1,…,kn是n个关键词,试解答:
试用二叉查找树的插入算法建立一棵二叉查找树,即当关键词的插入次序为k1,k2,…,kn时,用算法建立一棵以llink / rlink 链接表示的二叉查找树。
7、证明由二叉树的中序序列和后序序列,也可以唯一确定一棵二叉树。
29. ①试找出满足下列条件的二叉树。
1)先序序列与后序序列相同 2)中序序列与后序序列相同。
3)先序序列与中序序列相同 4)中序序列与层次遍历序列相同
8、因为后序遍历栈中保留当前结点的祖先的信息,用一变量保存栈的最高栈顶指针,每当退栈时,栈顶指针高于保存最高栈顶指针的值时,则将该栈倒入辅助栈中,辅助栈始终保存最长路径长度上的结点,直至后序遍历完毕,则辅助栈中内容即为所求。
void longestpath(bitree bt)//求二叉树中的第一条最长路径长度。
bitree p=bt,l,s;l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点。
int i,top=0,tag,longest=0;
while(p ||top>0)
//沿左分枝向下。
if(tag[top]==1) /当前结点的右分枝已遍历。
/保留当前最长路径到l栈,记住最高栈顶指针,退栈。
else if(top>0) 沿右子分枝向下。
青海省高级抹灰工试题
一 单项选择题 共 25 题,每题 2 分,每题的备选项中,只有 1 个事最符合题意 1 礓礤坡道小斜面抹上后,视干湿度如何,可以在小斜面上洒上 水泥砂子干粉吸一下水,而后用木抹子搓平,用钢抹子压光。a 1 0.5 b 1 1c 1 1.5 d 1 2 2 聚醋酸乙烯乳液为白色水溶液胶体。乳液有效期...
青海省高级钳工考试试卷
本卷共分为1大题50小题,作答时间为180分钟,总分100分,60分及格。一 单项选择题 共25题,每题2分,每题的备选项中,只有1个事最符合题意 1 当磨损限度相同时,刀具寿命越长,表示刀具磨损发生 a 越快b 越慢c 不变d 很快。2 不适宜扩孔和铰孔的钻床是 a 台钻b 立钻c 摇臂钻。d z...
青海省高级机修钳工理论试题
本卷共分为1大题50小题,作答时间为180分钟,总分100分,60分及格。一 单项选择题 共25题,每题2分,每题的备选项中,只有 1 个事最符合题意 1 下列钢材中,钢的硬度最高。a t10b 20c 45d 65mn 2 最大极限尺寸 基本尺寸。a 大于b 小于c 等于d 大于 小于或等于。3 ...