2015年江西省数据库入门入门

发布时间:   来源:文档文库   
字号:
14voidLinkList_reverse(Linklist&L
//链表的就地逆置;为简化算法,假设表长大于2{
p=L->next;q=p->next;s=q->next;p->next=NULL;while(s->next{
q->next=p;p=q;
q=s;s=s->next;//L的元素逐个插入新表表头}
q->next=p;s->next=q;L->next=s;}//LinkList_reverse2t是给定的一棵二叉树,下面的递归程序count(t用于求得:二叉树t中具有非空的左,右两个儿子的结点个数N2;只有非空左儿子的个数NL;只有非空右儿子的结点个数NR和叶子结点个数N0N2NLNRN0都是全局量,且在调用count(t之前都置为0.typedefstructnode
{intdata;structnode*lchild,*rchild;}node;intN2,NL,NR,N0;voidcount(node*t
{if(t->lchild!=NULLif(1___N2++;elseNL++;elseif(2___NR++;else(3__;
if(t->lchild!=NULL(4____;if(t->rchild!=NULL(5____;}
26.树的先序非递归算法。voidexample(bbtree*b;
{btree*stack[20],*pinttop;if(b!=null
{top=1;stack[top]=b;while(top>0
{p=stack[top];top--;printf(%d,p->data;if(p->rchild!=null{(1___;(2___;}
if(p->lchild!=null(3___;(4__;}}}}
3(1p->rchild(2p->lchild(3p->lchild(4ADDQ(Q,p->lchild(5ADDQ(Q,p->rchild
25.(1t->rchild!=null(2t->rchild!=null(3N0++(4count(t->lchild(5count(t->rchild

26..(1top++(2stack[top]=p->rchild(3top++(4stack[top]=p->lchild
27.(1*ppos//根结点2rpos=ipos(3rposipos(4ipos(5ppos+1
4题目中要求矩阵两行元素的平均值按递增顺序排序,由于每行元素个数相等,按平均值排列与按每行元素之和排列是一个意思。所以应先求出各行元素之和,放入一维数组中,然后选择一种排序方法,对该数组进行排序,注意在排序时若有元素移动,则与之相应的行中各元素也必须做相应变动。
voidTranslationfloat*matrixintn
//本算法对n×n的矩阵matrix,通过行变换,使其各行元素的平均值按递增排列。{inti,j,k,l
floatsummin//sum暂存各行元素之和float*p,*pi,*pk;for(i=0;i
{sum=0.0;pk=matrix+i*n;//pk指向矩阵各行第1个元素.
for(j=0;j求一行元素之和.*(p+i=sum;//将一行元素之和存入一维数组.}//fori
for(i=0;i用选择法对数组p进行排序{min=*(p+i;k=i;//初始设第i行元素之和最小.
for(j=i+1;j记新的最小值及行号.if(i!=k//若最小行不是当前行,要进行交换(行元素及行元素之和{pk=matrix+n*k;//pk指向第k行第1个元素.pi=matrix+n*i;//pi指向第i行第1个元素.for(j=0;j交换两行中对应元素.
{sum=*(pk+j;*(pk+j=*(pi+j;*(pi+j=sum;}
sum=p[i];p[i]=p[k];p[k]=sum;//交换一维数组中元素之和.}//if}//fori
free(p;//释放p数组.}//Translation
[算法分析]算法中使用选择法排序,比较次数较多,但数据交换(移动较少.若用其它排序方,虽可减少比较次数,但数据移动会增多.算法时间复杂度为O(n2.
5#definemaxsize栈空间容量
voidInOutS(ints[maxsize]
//s是元素为整数的栈,本算法进行入栈和退栈操作。
{inttop=0;//top为栈顶指针,定义top=0时为栈空。for(i=1;i<=n;i++//n个整数序列作处理。{scanf(%d,&x;//从键盘读入整数序列。
if(x!=-1//读入的整数不等于-1时入栈。if(top==maxsize-1{printf(“栈满\n;exit(0;}elses[++top]=x;//x入栈。

else//读入的整数等于-1时退栈。
{if(top==0{printf(“栈空\n;exit(0;}
elseprintf(“出栈元素是%d\n,s[top--]}}
}//算法结
6、本题应使用深度优先遍历,从主调函数进入dfs(v,开始记数,若退出dfs(前,已访问完有向图的全部顶点(设为n个),则有向图有根,v为根结点。将n个顶点从1n号,各调用一次dfs(过程,就可以求出全部的根结点。题中有向图的邻接表存储结构、记顶点个数的变量、以及访问标记数组等均设计为全局变量。建立有向图g的邻接表存储结构参见上面第2题,这里只给出判断有向图是否有根的算法。
intnum=0visited[]=0//num记访问顶点个数,访问数组visited初始化。constn=用户定义的顶点数;
AdjListg;//用邻接表作存储结构的有向图gvoiddfs(v
{visited[v]=1;num++;//访问的顶点数+1
if(num==n{printf(%d是有向图的根。\n,v;num=0;}//ifp=g[v].firstarc;while(p
{if(visied[p->adjvex]==0dfs(p->adjvex;p=p->next;}//while
visited[v]=0;num--;//恢复顶点v}//dfs
voidJudgeRoot(
//判断有向图是否有根,有根则输出之。{staticinti;
for(i=1;i<=n;i++//从每个顶点出发,调用dfs(各一次。{num=0;visited[1..n]=0;dfs(i;}}//JudgeRoot
算法中打印根时,输出顶点在邻接表中的序号(下标),若要输出顶点信息,可使用g[i].vertex
7、设T是一棵满二叉树,编写一个将T的先序遍历序列转换为后序遍历序列的递归算法。8将顶点放在两个集合V1V2。对每个顶点,检查其和邻接点是否在同一个集合中,如是,则为非二部图。为此,用整数12表示两个集合。再用一队列结构存放图中访问的顶点。
intBPGraph(AdjMatrixg
//判断以邻接矩阵表示的图g是否是二部图。
{ints[];//顶点向量,元素值表示其属于那个集合(值12表示两个集合)intQ[];//Q为队列,元素为图的顶点,这里设顶点信息就是顶点编号。
intf=0,r,visited[];//fr分别是队列的头尾指针,visited[]是访问数组for(i=1;i<=n;i++{visited[i]=0;s[i]=0;}//初始化,各顶点未确定属于那个

集合
Q[1]=1;r=1;s[1]=1;//顶点1放入集合S1while(f
{v=Q[++f];if(s[v]==1jh=2;elsejh=1;//准备v的邻接点的集合号if(!visited[v]
{visited[v]=1;//确保对每一个顶点,都要检查与其邻接点不应在一个集合中for(j=1,j<=n;j++
if(g[v][j]==1{if(!s[j]{s[j]=jh;Q[++r]=j;}//邻接点入队列elseif(s[j]==s[v]return(0;}//非二部图}//if(!visited[v]}//while
return(1;}//是二部图
[算法讨论]题目给的是连通无向图,若非连通,则算法要修改。

本文来源:https://www.2haoxitong.net/k/doc/d5326b9dbe23482fb5da4cb4.html

《2015年江西省数据库入门入门.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式