- 441.00 KB
- 2022-04-22 11:52:37 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'数据结构目录一、1.1比较2个线性链表的C函数……………………………………………………………31.2写一个倒置顺序存贮的线性表的C函数…………………………………………………31.3写一个在线性表中,使线性表中没有值相同的结点的函数。…………………………41.4编写一个求解给定多项式的值的C函数。………………………………………………51.5实现多项式乘法……………………………………………………………………………61.7车厢出站问题………………………………………………………………………………91.8编写对任一栈作进栈和出栈运算的C函数……………………………………………101.10写出表达式等价的后缀表达式。………………………………………………………121.11编写一个统计给定的线性链表的结点个数的C函数。………………………………151.12编写一个将给定的线性链表逆转的C函数。…………………………………………161.13编写一个插入值的c函数。……………………………………………………………181.14编写一个删除链表中结点的前趋结点的C函数。……………………………………191.15试编写一个将两个链表归并成一个线性链表的C函数。……………………………201.17用环形链表解1。6题…………………………………………………………………231.18将给定的线性链表改成环形链表……………………………………………………241.19将给定的线性链表改成一个带表头的环形链表……………………………………251.20编写用hash函数h(Xi)=Xi,对X1,X2……X800进行hash存储的程序…261.21求广义表的深度。……………………………………………………………………272.1试编写一个在两个顺序字符串中寻找最大公共子串的C函数。……………………292.2试编写一个实现STRINS(S1,I,S2)的C函数。…………………………………312.3按照2.2题的要求,编一个实现STRDEL(S,I,J)的C函数。…………………323.1编写一个二分插入排序的C程序………………………………………………………333.2编写一个对给定链表进行插入排序的C程序。………………………………………343.5采用顺序存储实现,即用数组存放排序过程中以排好序的链表的头指针。………363.6采用顺序存储的结构即数组实现。……………………………………………………383.7编写一个实现快速排序的非递归的C函数。…………………………………………393.8对于分别写出用下列排序方法对线性表进行排序的结果。…………………………404.3将n阶三对角阵(即半带宽为1的带状矩阵)A按行序列序存放在一维数组b[3*n-2]中。若aij(|i-j|<=1)存放在b[k]中,请求出求解k的计算公式。…………………………………424.4如果把广义的Anab按行序列序存放在一维数组b[(a+b-1)*n-(a+b-2)]中,元素aij存放在b[k]中,那么请写出计算k的计算公式。……………………………………………………424.5试编写一个求解两个三元数组相加的C函数。………………………………………424.6试编写一个将十字链表转置的C函数.…………………………………………………445.1请分别给出对树进行前序、后序、层次序遍历后的结点序列。……………………455.2试叙述将m棵有序树组成的有序树林转换成相应的二叉树的逆变换。……………465.3试编写一个把树中每个结点的左右子结点进行对换的C函数。……………………475.4编写一个利用栈来实现后序遍历一棵给定的二叉树的C函数。……………………495.5题目:……………………………………………………………………………………51试为下面各小题分别编写一个C函数:(1)按前序输出T的结点值。(2)按后序输出T的结点值。(3)输出树T的叶子结点值。88
数据结构(1)求出树T的次数。5.6试编写一个把树T按标准形式进行存贮的C函数。…………………………………535.7已知树T中结点的中序和后序,编写一个把T按标准形式存储的C函数…………545.8判断给定的二叉树是否为完全二叉树…………………………………………………555.9判断两棵给定的二叉树是否相似………………………………………………………555.10把树T转换成由标准形式进行存储的树T’…………………………………………555.11试编写一个寻找结点a的父结点的C函数。…………………………………………565.12试编写一个按前序遍历穿线树的C函数。……………………………………………586.1画出由集合中结点所构成的查找树,画出删除后的查找树。………………………606.2试编写一个用平分法构造出由集合中结点所构成的丰满查找树的C函数。………606.5编写一个判断给定二叉树T是否为平衡树的C函数。………………………………626.6试画出Adelson插入方法的右改组的转换图。………………………………………656.9试画出用Hu-Tucker算法构造出的最佳叶子查找树。………………………………666.10画出每次插入后的B-树……………………………………………………………676.12修改皇后问题…………………………………………………………………………706.13马的周游路线…………………………………………………………………………767.1对于图题7.1(P235)的无向图,给出:……………………………………………79(1)表示该图的邻接矩阵。(2)表示该图的邻接表。(3)图中每个顶点的度。7.2对于图题7.1的无向图,给出:………………………………………………………79(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。7.3对于图题7.3的有向图,给出:………………………………………………………84(1)表示该图的邻接矩阵。(2)表示该图的邻接表。(3)图中每个顶点的入度和出度。7.4对于图题7.3的有向图,给出:………………………………………………………85(1)从顶点1出发,按深度优先搜索法遍历图时的所得的顶点序列。(2)从顶点1出发,按广度优先搜索法遍历图时的所得的定点序列。7.5对于图题7.1的无向图,试问它是(1)连通图吗?(2)完全图吗?……………857.6对于图题7.3的有向图,试问它是(1)弱连通图吗?(2)强连通图吗?……867.7图题7-7是有向图,试问其中哪个图是………………………………………………86(1)弱连通的?(2)强连通的?7.8具有N个顶点的连通无向图至少有几条边?…………………………………………867.9具有N个顶点的强连通有向图至少有几条边?………………………………………867.10分别写出用深度和广度优先搜索法遍历完全无向图的顶点序列。………………877.11改写以深度优先搜索法遍历给定的连通图的dfs程序。……………………………877.12在图题7.1中,从顶点1出发,分别画出其dfs生成树和bfs生成树。………8888
数据结构1.1:比较2个线性链表的C函数1.存储法:用两个数组存放线性表。2.存储结构:一般的顺序存储方式。3.源程序:intcomp(inta[],intas,intb[],intbs){inttmp=as>bs?as:bs;inti;for(i=0;ib[i])return1;if(a[i]bs)return1;if(bs>as)return-1;return0;}4.测试用例:1.A[3]={1,2,3}B[3]={1,2,3}output:0;2.A[3]={1.2.3}B[3]={1,1,3}output:1;3.A[3]={1,2,3}B[3]={1,2,4}output:-14.A[3]={1,2,3}B[4]={1,2,3,0}output:-1;5.A[4]={1,2,3,0}B[3]={1,2,3}output:1;6.A[4]={1,2,3,0}B[3]={1,3,2}output:-1;1.2写一个倒置顺序存贮的线性表的C函数。要求用最少的附加存贮空间来完成。·分析:假设用数组a存贮一组int类型的数据,每次将a[0]取出,其余数依次前移,然后将a[0]放到尚未倒置的数据元素的最后,直至整个数组完成倒置。·算法:(1)取t=a[0],余下的a[1],a[2],...a[n-1]依次前移一个位置;(2)a[n-1]=t;(3)对由a[0],a[1]...a[n-2]组成的数组重复上述步骤。·程序:#include#defineN10voidreverse(a,n)inta[];intn;{intt,i,j=0;while(j#defineM100intsq_delete(intlist[],int*p_m,inti){intj;if(i<0||i>=*p_m)return(1);for(j=i+1;j<*p_m;j++)88
数据结构list[j-1]=list[j];(*p_m)--;return(0);}voiddel(intlist[],int*p_n){inti,j;for(i=0;i<((*p_n)-1);i++)for(j=i+1;j<(*p_n);j++)if(list[i]==list[j]){sq_delete(list,p_n,j);j--;}}main(){intlist[M],i,n;printf("Inputthenumberofthedata:n");scanf("%d",&n);for(i=0;istructnode{intexp;intdata;structnode*next;};typedefstructnodeNODE;88
数据结构intsearch(intexp,NODE*c,NODE**pc,NODE**qc){*pc=NULL;*qc=c;if(c==NULL)return(0);while((*qc)->exp>exp){*pc=*qc;*qc=(*qc)->next;}if((*qc)->exp==exp)return(1);return(0);}NODE*multi(NODE*a,NODE*b){NODE*pa,*pb,*pc,*qc,*p,*c=NULL;intexp,data,flag;for(pa=a;pa!=NULL;pa=pa->next)for(pb=b;pb!=NULL;pb=pb->next){exp=pa->exp+pb->exp;data=pa->data*pb->data;if(data){flag=search(exp,c,&pc,&qc);if(flag)if(!(data+qc->data)){pc->next=qc->next;free(qc);}else(qc->data)+=data;else{p=(NODE*)malloc(sizeof(NODE));p->data=data;p->exp=exp;if(!pc)c=p;elsepc->next=p;p->next=qc;}}}return(c);}NODE*creat(){NODE*root,*p,*q;charch;inti;printf("Doyouwanttocreatanullone(Y/N)?n");scanf("%c",&ch);getchar();if(ch=="y"||ch=="Y")return(NULL);p=NULL;88
数据结构ch="y";for(i=0;ch=="y"||ch=="Y";i++){q=(NODE*)malloc(sizeof(NODE));if(p==NULL)root=q;elsep->next=q;printf("nPleaseinputtheDATAofnode%d:n",i);scanf("%d",&(q->data));getchar();printf("PleaseinputtheEXPofnode%d:n",i);scanf("%d",&(q->exp));getchar();printf("Doyouwanttocontinue(Y/N)?n");scanf("%c",&ch);getchar();p=q;}p->next=NULL;return(root);}voidprint(NODE*root){inti=0;if(!root)printf("n0");while(i++,root!=NULL){printf("nNODE%d:tDATA:%dtEXP:%d",i,root->data,root->exp);root=root->next;}}main(){charch;NODE*a,*b,*c;clrscr();printf("NowpleaseinputA:n");a=creat();printf("NowpleaseinputB:n");b=creat();printf("nA:n");print(a);printf("nB:n");88
数据结构print(b);c=multi(a,b);printf("nnnC:n");print(c);}五:测试数据:输入:A:5X^6+3X^4+2XB:7X^3+3X^2+5输出:C:35X^9+15X^8+21X^7+34X^6+29X^4+6X^3+10X输入:A:0B:5X^3+2X^2输出:0输入:A:3X^2+5X^1B:3X^1-5C:01.7假设右边轨道排列有编号为1,2,3,…,n的n节车厢,它们依次被拖进站,从左边轨道依次出站的号的排列顺序有an种情况。那么an是用下列方法所形成的所有可能排列顺序的总数:某时刻站中只剩下编号为k+1的车厢,而此时左边轨道是已出站的编号为1,2,3,…,k的车厢,则排列顺序有ak种;右边轨道是尚未进站的编号为k+1,k+2,…,k+n的n-k-1节车厢,则可能有的排列顺序有an-k-1种。因此给出了前k节车厢已出站的情况下所有的排列顺序,我们应该取遍k(0≤k≤n)的所有可能值,获得akan-k-1这样形式的所有项,然后把它们相加起来,可得到如下的关系式:a0=1;a1=1;an=a0an-1+a1an-2+...+an-1a0(n>1)an=∑akan-k-1(0≤k≤n-1)为了求解排列顺序的数目,先求解这个递推关系:令g(x)=a0+a1x+…+anx?n>1即g(x)=∑akxk(k≥0)让g(x)自乘得g2(x)=g(x)g(x)=(a0+a1x+a2x2+...)(a0+a1x+a2x2+...)88
数据结构=a0a0+(a0a1+a1a0)x+(a0a2+a1a1+a2a0)x2+...=Σ(Σakan-k)x?(0≤n,0≤k≤n)由上式可知,g2(x)的xn项的系数正好是an+1。因此有g2(x)=∑an+1x?(n≥0)如果我们用x乘g2(x),则有xg2(x)=a1x+a2x2...两边都加上a0,又因为a0=1,故有 1+xg2(x)=∑akxk(k≥0)1+xg2(x)=g(x)求解得g(x)=[1±√(1-4x)]/2x因为a0=1,所以g(x)=1-√(1-4x)]/2x再根据二项式定理,将(1-4x)1/2展开,得g(x)=1/2x[1-∑(1n/2)(-4x)n](n≥0)令n=m+1,则有g(x)=∑(1/2m+1)(-1)m22m+1xm(m≥0)比较可知an是上式中x?项的系数。所以an=(1n+1/2)(-1)n22n+1化简得an=1/(n+1)(2nn)n节车厢出站有1/(n+1)(2nn)种排列顺序。所以,当n=3时,有5种排列顺序,分别为①②③,①③②,②①③,②③①,③②①;当n=4时,有14种排列顺序。存储结构可采用栈实现。1_8.假设2个栈共享一个数组stack[n],编写对任一栈作进栈和出栈运算的C函数,push(x,i)和pop(i),i=1,2。这里i=1表示左边的栈,=2则表示右边的栈。要求整个数组元素都被占用时才产生溢出。存储结构:用一个数组存放2个栈。如图:(M为数组元素个数)32↑↑↑↑tail1=0head1head2tail2=M-1head1,head2分别为栈1,栈2中下个元素入栈的位置,tail1,tail2为两个栈底。分析与算法步骤:因为tail1=0,tail2=M-1,一般情况下不会变动,所以省去这2个量。初始值:head1=0,head2=M-1;1.执行入栈时:88
数据结构(1)若head1-1+1=head2+1,即head1=head2+1时,整个数组满,溢出。(2)若对栈1入栈,把元素存入stack[head1],head1++;(3)若对栈2入栈,把元素存入stack[head2],head2――;2.执行出栈时:(1)对栈1:若head1=0,栈空,出栈失败;否则head1――;(2)对栈2:若head2=M-1,栈2空,出栈失败;否则head2++;tc程序:include#defineM10inthead1=0,head2=M-1;intstack[M];voidpush(intx,inti){if(head1==head2+1){printf("thestackisfull.failtopush.n");return;}if(i==1)stack[head1++]=x;elsestack[head2--]=x;}voidpop(inti){if(i==1){if(head1==0){printf("thestackisempty.failtopop.n");return;}*p=stack[--head1];}else{if(head2==M-1){printf("thestackisempty.failtopop.");return;}*p=stack[++head2];}}88
数据结构main(){intx,i,No=1;for(i=0;i=0;i--)printf("%d",stack[i]);printf("n");for(i=head2+1;i