ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:25.82KB ,
资源ID:21595332      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21595332.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构上机例题及答案文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构上机例题及答案文档格式.docx

1、 if (t=0)p=p-t=1;next=p- p-next=s- s=p; t=0; return (hb);2.5设线性表中的数据元素是按值非递减有序排列的,试以不同的存储结构,编写一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。 顺序表; 解:本题的算法思想是:先找到适当的位置,然后后移元素空出一个位置,再将 x 插入,并返回向量的新长度。实现本题功能的函数如下: int insert(vector A,int n,ElemType x) /*向量 A 的长度为 n*/ int i,j; if (x=An-1) An=x /*若 x 大于最后的元素,则将其插入到最后*/ e

2、lse i=0; while (x=Ai) i+; /*查找插入位置 i*/ for (j=n-1;j=i;j-) Aj+1=Aj; /*移出插入 x 的位置*/ Ai=x; n+; /*将 x 插入,向量长度增 1*/ return n; 单链表。本题算法的思想是先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点。 node *insertorder(head,x) node *head; ElemType x; node *s,*p,*q;s=(node *)malloc(sizeof(node); /*建立一个待插入的结点*/ data

3、=x;if (head=NULL | xdata) /*若单链表为空或 x 小于第一个结点的 date 域*/ next=head; /*则把 s 结点插入到表头后面*/ head=s;else q=head; /*为 s 结点寻找插入位置,p 指向待比较的结点,q 指向 p 的前驱结点*/ p=q-while (p!=NULL & xdata) /*若 x 小于 p 所指结点的 data 域值*/ data) /*则退出 while 循环*/ q=p; /*将 s 结点插入到 q 和 p 之间*/ q-return(head);2.6假设有A和B分别表示两个递增有序排列的线性表集合(即同一表

4、中元素值各不相同), 求A和B的交集C, 表C中也依值递增有序排列。试以不同的存储结构编写求得C的算法。void SqList_Intersect_True(SqList &A,SqList B)/求元素递增排列的线性表A和B的元素的交集并存回A中i=1;j=1;k=0;while(A.elemi&B.elemj)if(A.elemiB.elemj) j+;else if(A.elemi!=A.elemk)A.elem+k=A.elemi; /当发现了一个在A,B中都存在的元素i+;j+; /且C中没有,就添加到C中/whilewhile(A.elemk) A.elemk+=0;/SqList

5、_Intersect_True 单链表chnode *or(chnode *head1,chnode *head2) chnode *p1,*p2,*q2,*h,*p; h=p=malloc(sizeof(chnode); p1=head1- while(p1) p2=head2; q2=p2- while(q2-=p1-data)&q2) p2=q2; q2=q2- if(p1-data=q2-data) p2-next=q2- if(q2) while(p-next)next=q2; p=q2; q2- p1=p1- return(h);2.7设计一个算法求两个递增有序排列的线性表A和B

6、的差集。(每个单链表中不存在重复的元素)提示:即在A中而不在B中的结点的集合。typedef int elemtype;typedef struct linknodeelemtype data;struct linknode *next; nodetype;nodetype *subs(nodetype *heada, nodetype *headb)nodetype *p, *q, *r, *s;s=(nodetype *)malloc(sizeof(nodetype);next=heada;heada=s;p=heada-next;r=heada;r-next=NULL;q=headb;w

7、hile (q! q-=p-data) q=q-if (q!s=p-free(p);p=s;elsenext=p;r=p;s=heada;heada=heada-free(s);return heada;2.8设有线性表A=(a1 ,a2 ,.,am ),B=(b1 ,b2 ,.,bn )。试写一合并A、B为线性表C的算法,使得 (a1 ,b1 ,.,am ,bm ,bm+1 ,.,bn ) 当mn时 C (a1 ,b1 ,.,an ,bn ,an+1 ,.,am ) 当mn时A、B和C均以单链表作存储结构,且C表利用A和B中结点空间。假设 A,B 和 C 链表分别具有头结点的指针 a,b 和

8、 c。node *link(a,b) node *a,*b;node *r,*s,*p,*q,*c;c=(node *)malloc(sizeof(node); /*建立一个头结点*/ r=c;p=a;q=b;=NULL | q!=NULL) if (p!=NULL) /*如果 A 链表还存在可取的结点,则复制一个同样的结点链接到 C 中*/ data=p-data;r=s;=NULL) /*如果 B 链表还存在可取的结点,则复制一个同样的结点链接到 C 中*/ data=q-q=q-s=c;c=c- /*删除头结点*/ free(s);return(c);2.9试用两种线性表的存储结构来解决

9、约瑟夫问题。设有n个人围坐在圆桌周围,现从第s个人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,如此重复直到所有的人全部出列为止。例如当n=8,m=4,s=1,得到的新序列为:4,8,5,2,1,3,7,6。写出相应的求解算法。先构造一个循环链表nodetype *crea(int n) nodetype *s,*r,*h; int I; for (i=1;inext=h;return h;void jese (nodetype *h,int m) nodetype *p=h,*q; while (p-=p) for (i=1;m-1; if (p- q=p

10、- printf(“%d”,q-data);next=q- free(q); printf(“%d”,p-2.10已知单链表中的数据元素含有三类字符(即:字母字符、数字字符和其它字符),试编写算法构造三个环形链表,使每个环形链表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。void split (nodetype *ha,nodetype *hb,nodetype *hc) char c; nodetype *ra,*rb,*rc,*p=ha- ra=ha;ra- rb=hb;rb- rc=hc;rc- while (p!=ha) c=p- if (c=a

11、&c=A&=Z) ra-ra=p; else if(c=0&=9) rb-rb=p; else rc-rc=p; ra-next=ha;next=hb;next=hc;2.11假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知p为指向链表中某结点的指针,试编写算法在链表中删除结点p 的前趋结点。nodetype *delprev(nodetype *p) nodetype *r=p,*q=r- while (q- r=r-q=r- r- return(p);2.12假设有一个单向循环链表,其结点含三个域:pre、data和next, 每个结点的pre值为空指针,试编写算法将此链表

12、改为双向环形链表。分析:在遍历单链表时,可以利用指针记录当前访问结点和其前驱结点。知道了当前访问结点的前驱结点位置,就可以给当前访问结点的前驱指针赋值。这样在遍历了整个链表后,所有结点的前驱指针均得到赋值。Typedef struct lnodeelemtype data; struct lnode pre,next;lnode,*linklist;void singletodouble(linklist h)linklist pre,p;pre=h;while(p!=h)pre=pre; pre=p;2.13设有一个二维数组Amn,假设A00存放位置在644(10),A22存放位置在676(

13、10),每个元素占一个地址空间,求A33(10)存放在什么位置?分析 根据二维数组的地址计算公式:LOC(i,j)=LOC(0,0 )+n*i+j*s,首先要求出数组第二维的长度,即n值。解 因为LOC(2,2)=LOC(0,0 )+ 2*n+2=644+2*n+2=676 所以n=(676-2-644)/2=15LOC(3,3)=LOC(0,0 )+3*15+3=644+45+3=6922.14 设稀疏矩阵采用十字链表结构表示。试写出实现两个稀疏矩阵相加的算法。依题意,C=A+B,则 C 中的非零元素 cij只可能有 3 种情况:或者是 aij+bij,或者是 aij(bij=0)或者是 b

14、ij(aij=0)。因此,当 B 加到 A 上时,对 A 矩阵的十字链表来说,或者是改变结点的 val 域值(a+b0),或者不变(b=0),或者插入一个新结点(a=0),还可能是删除一个结点(aij+bij=0)。整个运算可从矩阵的第一行起逐行进行。对每一行都从行表头出发分别找到 A 和 B 在该行中的第一个非零元素结点后开始比较,然后按 4 种不同情况分别处理(假设 pa 和 pb 分别指向 A 和 B 的十字链表中行值相同的两个结点):若 pa-col=pb-col 且 pa-val+pb-val0,则只要将 aij+bij的值送到 pa 所指结点的值域中即可。(2)若 pa-val=0

15、,则需要在 A 矩阵的十字链表中删除pa 所指结点,此时需改变同一行中前一结点的 right 域值,以及同一列中前一结点的 down域值。(3)若 pa-colcol0(即不是表头结点),则只需要将 pa 指针往右推进一步,并重新加以比较。(4)若 pa-colcol 或 pa-col=0,则需要在 A 矩阵的十字链表中插入一个值为bij 的结点。实现本题功能的程序如下:#include #define MAX 100 struct matnode *createmat(struct matnode *h) /*h 是建立的十字链表各行首指针的数组*/ int m,n,t,s,i,r,c,v;

16、struct matnode *p,*q;printf(行数 m,列数 n,非零元个数 t:);scanf(%d,%d,%d,&m,&n,&t);p=(struct matnode *)malloc(sizeof(struct matnode);h0=p;row=m;col=n;s=mn ? m:n; /*s 为 m、n 中的较大者*/ for (i=1;=s;i+) hi=p;hi-1-tag.next=p;row=p-col=0;down=p-right=p;hs-tag.next=h0;=t;t 第%d 个元素(行号 r,列号 c,值 v):,i);r,&c,&v);row=r;col=

17、c;tag.val=v;q=hr;while (q-right!=hr &right-c) q=q-right;right=q-q=hc;while(q-down!=hc &down-rowdown=p;return(h0);void prmat(struct matnode *hm) n 按行表输出矩阵元素:nrow=%d col=%dn,hm-row,hm-col);p=hm-tag.next;=hm) q=p-=q) t%d,%d,%dn,q-row,q-col,q-tag.val);struct matnode *colpred(i,j,h) /*根据 i(行号)和 j(列号)找出矩阵

18、第 i 行第 j 列的非零元素在十字链表中的前驱结点*/ int i,j; struct matnode *h;struct matnode *d;d=hj;while (d-col!=0 & d-i) d=d-return(d);struct matnode *addmat(ha,hb,h) struct matnode *ha,*hb,*h;struct matnode *p,*q,*ca,*cb,*pa,*pb,*qa;if (ha-row!=hb-row | ha-col) printf(两个矩阵不是同类型的,不能相加nexit(0);ca=ha-cb=hb-do pa=ca-pb=c

19、b-qa=ca;while (pb-=0) if (pa-col & pa-qa=pa;pa=pa-else if (pa-col | pa-col=0) *p=*pb;right=pa;qa-qa=p;q=colpred(p-row,col,h);pb=pb-pa-tag.val+=pb-tag.val;tag.val=0) right=pa-q=colpred(pa-down=pa-free(pa); else qa=pa;ca=ca-cb=cb- while (ca-row=0);main() struct matnode *hm,*hm1,*hm2;struct matnode *hM

20、AX,*h1MAX;第一个矩阵:hm1=createmat(h);第二个矩阵:hm2=createmat(h1);hm=addmat(hm1,hm2,h);prmat(hm);第二章上机内容 1.设计一个程序,生成两个按值非递减有序排列的线性表LA和LB,再将LA和LB归并为一个新的线性表LC,且LC中的数据仍按值非递减有序排列,输出线性表LA,LB,LC。#include “stdio.h”#include “alloc.h”typedef struct node char data; struct node *next; listnode;typedef struct node *link;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1