1、设一组有序的记录关键字序列为(13,18,24,35,47,50,62,83,90),查找方法用二分查找,要求计算出查找关键字62时的比较次数并计算出查找成功时的平均查找长度。2、设有一组初始记录关键字为(45,80,48,40,22,78),要求构造一棵二叉排序树并给出构造过程。
3、本题应使用深度优先遍历,从主调函数进入dfs(v)时,开始记数,若退出dfs()前,已访问完有向图的全部顶点(设为n个),则有向图有根,v为根结点。将n个顶点从1到n编号,各调用一次dfs()过程,就可以求出全部的根结点。题中有向图的邻接表存储结构、记顶点个数的变量、以及访问标记数组等均设计为全局变量。
建立有向图g的邻接表存储结构参见上面第2题,这里只给出判断有向图是否有根的算法。
int num=0,visited=0 //num记访问顶点个数,访问数组visited初始化。const n=用户定义的顶点数;
adjlist g用邻接表作存储结构的有向图g。void dfs(v)
visited [v]=1; num++;访问的顶点数+1
if (num==n) /ifp=g[v].firstarc;while (p)
if (visied[p->adjvex]==0) dfs (p->adjvex);p=p->next;} while
visited[v]=0; num--;恢复顶点v}//dfs
void judgeroot()
/判断有向图是否有根,有根则输出之。}/judgeroot
算法中打印根时,输出顶点在邻接表中的序号(下标),若要输出顶点信息,可使用g[i].vertex。
4、题目中要求矩阵两行元素的平均值按递增顺序排序,由于每行元素个数相等,按平均值排列与按每行元素之和排列是一个意思。所以应先求出各行元素之和,放入一维数组中,然后选择一种排序方法,对该数组进行排序,注意在排序时若有元素移动,则与之相应的行中各元素也必须做相应变动。
void translation(float *matrix,int n)
/本算法对n×n的矩阵matrix,通过行变换,使其各行元素的平均值按递增排列。//for i
for(i=0; ifor(j=i+1;j
sum=p[i]; p[i]=p[k]; p[k]=sum; /交换一维数组中元素之和。}/if}//for i
free(p); 释放p数组。}/translation
算法分析]算法中使用选择法排序,比较次数较多,但数据交换(移动)较少。若用其它排序方法,虽可减少比较次数,但数据移动会增多。算法时间复杂度为o(n2).
5、矩阵中元素按行和按列都已排序,要求查找时间复杂度为o(m+n),因此不能采用常规的二层循环的查找。可以先从右上角(i=a,j=d)元素与x比较,只有三种情况:一是a[i,j]>x,这情况下向j小的方向继续查找;二是a[i,j]void search(datatype a[ ]int a,b,c,d, datatype x)
/n*m矩阵a,行下标从a到b,列下标从c到d,本算法查找x是否在矩阵a中。else if (a[i][j]>x) j--;else i++;
if(flag) printf(“a[%d][%d]=%d”,i,j,x假定x为整型。else printf(“矩阵a中无%d元素”,x);}算法search结束。
算法讨论]算法中查找x的路线从右上角开始,向下(当x>a[i,j])或向左(当x6、因为后序遍历栈中保留当前结点的祖先的信息,用一变量保存栈的最高栈顶指针,每当退栈时,栈顶指针高于保存最高栈顶指针的值时,则将该栈倒入辅助栈中,辅助栈始终保存最长路径长度上的结点,直至后序遍历完毕,则辅助栈中内容即为所求。void longestpath(bitree bt)//求二叉树中的第一条最长路径长度。
bitree p=bt,l,s;l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点。
int i,top=0,tag,longest=0;while(p ||top>0)
while(p) 沿左分枝向下。
if(tag[top]==1) /当前结点的右分枝已遍历。
if(!s[top]->lc &&s[top]->rc) /只有到叶子结点时,才查看路径长度if(top>longest) /保留当前最长路径到l栈,记住最高栈顶指针,退栈}
else if(top>0) 沿右子分枝向下}//while(p!=null||top>0)}/结束longestpath7、将顶点放在两个集合v1和v2。对每个顶点,检查其和邻接点是否在同一个集合中,如是,则为非二部图。
为此,用整数1和2表示两个集合。再用一队列结构存放图中访问的顶点。int bpgraph (adjmatrix g)
/判断以邻接矩阵表示的图g是否是二部图。
int s;顶点向量,元素值表示其属于那个集合(值1和2表示两个集合)int q;q为队列,元素为图的顶点,这里设顶点信息就是顶点编号。
int f=0,r,visited;f和r分别是队列的头尾指针,visited是访问数组for (i=1;i<=n;i++)初始化,各顶点未确定属于那个集合。
q[1]=1; r=1; s[1]=1;//顶点1放入集合s1while(f //邻接点入队列else if (s[j]==s[v]) return(0);}非二部图}//if (!visited[v])}while
return(1); 是二部图。
算法讨论]题目给的是连通无向图,若非连通,则算法要修改。
C语言2023年福建省选择题
1 c源程序需经过 d 生成可执行文件。2 c 为合法的浮点型常量。a e 8 b 1e 8.5 c 1.0e 8 d 1.25e 3 若已定义 int a,b 则逗号表达式a 5,b 3,a a b的值是 b a 8 b 40 c 28 d 15 4 运算符 d 不能用于非整型数据运算。a b c...
2023年福建省数据分析入门
for i 1 i n i for j 1 j n j if w i k w k j m maxint设定m为机器内最大整数。for i 1 i n i 求最长路径中最短的一条。s 0 for j 1 j n j 求从某村庄i 1 i n 到其它村庄的最长路径。if w i j s s w i j ...
2023年江苏省C语言入门
1 设一棵树t中边的集合为,要求用孩子兄弟表示法 二叉链表 表示出该树的存储结构并将该树转化成对应的二叉树。2 根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量pre 初值为null 和全局变量flag,初值为true。若非二叉...