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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第五章答案.docx

1、数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第五章答案5.3/* 题目:设有三对角矩阵A,将其三对角线上元素逐行存于数组B中求: 1:用i,j表示k的下标变换公式 k = 2*i+j (下标从0开始) 2:用k表示i,j的下标公式 (下标从0开始) i = (k+1)/3 :(此处取整) j = k-2*i; = k-(k+1)/3*2 (此处别化简) 什么是三对角矩阵? 在线性代数中,一个三对角矩阵是矩阵的一种, 它“几乎”是一个对角矩阵。准确来说:一个三对角矩阵的非零系数在主对角线上, 或比主对角线低一行的对角线上,或比主对角线高一行的对角线上。例如,下面的是三对角矩阵:1 4 0 0

2、3 4 1 00 2 3 40 0 1 3*/ /*下面是具体的实现*/# include # define size 50/函数的声明void translate(int *b, int asizesize, int n);main() int n; int i, j, k = 0; int asizesize; int bsize; printf(输入矩阵的阶数n); scanf(%d, &n); printf(输入%d个数据n, 2*(n-1)+(n-1)+1); /2*(n-1)+(n-1)+1的来历是由上面的公式(2*i+j)推来 /三对角矩阵的最后一个元素一定在(n-1, n-1)

3、位置,既然 /一维组的下标与i,j有关,那么k最大也会在i=n-1, j=n-1处 /一维数组的下标k随着i,j连续增加的 /往三对角矩阵中输入数据 while(k2*(n-1)+(n-1)+1) for(i = 0; in; i+) for(j = 0; jn; j+) if(i=(k+1)/3) & (j=k-(k+1)/3*2) scanf(%d, &aij); k+; else aij = 0; printf(你输入的三对角矩是n); for(i = 0; in; i+) for(j = 0; jn; j+) printf(%d , aij); printf(n); /将三对角矩阵中的

4、元素输入到一位数组b中 translate(b, a, n); printf(压缩后的结果n); for(i = 0; i2*(n-1)+(n-1)+1; i+) printf(%d , bi); printf(n); /进行压缩void translate(int *b, int asizesize, int n) int i, j, k = 0; while(k2*(n-1)+(n-1)+1) for(i = 0; in; i+) for(j = 0; jn; j+) if(k=2*i+j & 0!=aij) bk+ = aij; /*输入矩阵的阶数4输入10个数据1 2 3 4 5 6

5、7 8 9 3你输入的三对角矩是1 2 0 03 4 5 00 6 7 80 0 9 3压缩后的结果1 2 3 4 5 6 7 8 9 3Press any key to continue*/5.5/*题目:设定二维整数数组B0.m-1,0.n-1的数据在行列上都按从小到大的顺序排序, 且整型变量x中的数据在B中存在。试设计一个算法 找出一对满足Bij=i,j值,要求比较次数不超过m+n设计; 狼影时间:2012.9.30*/*!下面是自己的看法,若有不对之处(或有更好的方式),请留言本空间,万分感谢既然有序,就要好好利用一下喽,首先想到的就是二分查找,那怎么个二分法呢? 我的方法是将二维当做

6、一维用。时间复杂度是O(log2(m*n)=O(log2m+log2n) O(m+n)*/# include int i=-1, j=-1;/函数声明void print_arry(int a55);void find_x(int a55,int x);main() int x; int a55= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 ; print_arry(a); printf(输入要查找的数n); scanf(%d, &x); /在数组中寻找x f

7、ind_x(a,x); if(-1=i | -1=j) printf(没有要查找的数据n); else printf(x的位置是(%d,%d)n, i, j);/输出数组中的内容void print_arry(int a55) int i,j; for(i = 0; i5; i+) for(j = 0; j5; j+) printf( %2d, aij); printf(n); /寻找x的位置void find_x(int a55,int x) int mid; int x1 = 0,y1 = 24; while(x1a0mid) x1 = mid+1; else y1 = mid-1; /*

8、 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25输入要查找的数21x的位置是(4,0)Press any key to continue*/5.6/* 题目:编写一个算法,计算一个三元组表示的稀疏矩阵的对角线之和 设计:狼影 时间:2012.9.28*/*这里求的是行和列相等的矩阵对角线元素和,如果你会行和列不相等的矩阵对角线元素法,告诉一声啊,万分感激(不用三元组页可以哦!)*/# include # define size 100typedef struct int x;/存放某一个非零元的行 int y;

9、/存放某一个非零元的列 int data;/存放某一个非零元DATA;typedef struct int row; /存储矩阵的总行数 int col; /存储矩阵的总列数 int number; /存储非零元的个数 DATA arrysize; /三元组数组NODE;/函数的声明void reduce(int asizesize, NODE *MA, int n);void print_arry(NODE MA);int cal_sum(NODE MA, int n);main() int n; NODE MA; int i, j; int sum = 0; int asizesize;

10、printf(输入矩阵的阶数n); scanf(%d, &n); /对矩阵进行赋值 printf(输入矩阵元素n); for(i = 0; in; i+) for(j = 0; jcol = n; MA-row = n; MA-number = 0; for(i = 0; in; i+) for(j = 0; jarryMA-number.x = i; MA-arryMA-number.y = j; MA-arryMA-number.data = aij; MA-number+; /打印压缩矩阵void print_arry(NODE MA) int i; if(0 = MA.number)

11、printf(三元组空n); return; for(i = 0; iMA.number; i+) printf(%d, %d)*%dn, MA.arryi.x, MA.arryi.y, MA.arryi.data); /求对角线的和int cal_sum(NODE MA, int n) int sum = 0; int i; if(0=MA.number); else for(i = 0; iMA.number; i+) if(MA.arryi.y=MA.arryi.x | (n-1)=(MA.arryi.x+MA.arryi.y)/是矩阵对角线的条件 sum += MA.arryi.dat

12、a; return sum;/*输入矩阵的阶数3输入矩阵元素1 2 34 5 60 4 0(0, 0)*1(0, 1)*2(0, 2)*3(1, 0)*4(1, 1)*5(1, 2)*6(2, 1)*4对角线的和是9Press any key to continue*/5.8/* 题目:设计一个算法same(*h1, *h2)判断两个广义表相同 设计;狼影 时间:2012.9.29*/*此算法根据线性表推倒而出,若测试有不对之处,请留言本人空间,你的留言将是对本人学习的最大帮助,万分感谢*/# include # include # include # define size 100/节点的定

13、义typedef struct node int tag;/标记 union char data; struct node *sublist; VALUE; struct node *pNext;NODE;/函数的声明NODE *new_node(void);NODE *creat(void);void output(NODE *p);int same(NODE *p1, NODE *p2);char *s;main() NODE *h1; NODE *h2; int n; char s1size; char s2size; /输入广义表的内容 printf(输入广义表1内容,格式为(a,(b

14、,c)n); gets(s1); fflush(stdin); printf(输入广义表2内容,格式为(a,(b,c),(a,f)n); gets(s2); /构造广义表 s = s1; h1 = creat(); s = s2; h2 = creat(); printf(输出广义表的内容是n); /输出广义表(此处只是对广义表的输出,如果只是向完成题目要求并且嫌麻烦,接下来的四句可以省略) output(h1); printf(n); output(h2); printf(n); /* n = same(h1-VALUE.sublist, h2-VALUE.sublist); if(0 =

15、n) printf(两广义表不相等n); else printf(两个广义表相等n);/建立广义表NODE *creat() char ch; NODE *pNew; ch = *s+; if(ch!=0) pNew = new_node(); if( = ch) pNew-tag = 1;/1标记子表 pNew-VALUE.sublist = creat(); /递归的建立子表 else if()=ch) pNew = NULL; else pNew-tag = 0;/0标记原子 pNew-VALUE.data = ch; else pNew = NULL; if(pNew != NULL)

16、 ch = *s+; if(,=ch) pNew-pNext = creat();/建立兄弟表 else pNew-pNext =NULL; return pNew;/创建新的节点NODE *new_node(void) NODE *pNew; pNew = (NODE *)malloc(sizeof(NODE); if(NULL = pNew) printf(内存分配错误n); exit(-1); pNew-pNext =NULL; return pNew;/输出广义表的内容void output(NODE *p) if(NULL != p) if(1 = p-tag) printf();

17、if(NULL = p-VALUE.sublist) printf(); else output(p-VALUE.sublist); else printf(%c, p-VALUE.data); if(1 = p-tag) printf(); if(p-pNext!=NULL) printf(,); output(p-pNext); /判断两个广义表是否相等int same(NODE *p1, NODE *p2) int n = 0; if(NULL=p1 & NULL=p2) n = 1; else if(NULL!=p1&NULL=p2 | NULL=p1&NULL!=p2) n = 0;

18、 else if(1=p1-tag & 1=p2-tag) n = (same(p1-VALUE.sublist, p2-VALUE.sublist)&same(p1-pNext, p2-pNext); if(0=p1-tag&0=p2-tag & p1-VALUE.data=p2-VALUE.data) n = 1; n = same(p1-pNext, p2-pNext); return n;/*输入广义表1内容,格式为(a,(b,c)(a,f),(),(),(),b,f)输入广义表2内容,格式为(a,(b,c),(a,f)(a,f),(),(),()输出广义表的内容是(a,f),(),(

19、),(),b,f)(a,f),(),(),()两广义表不相等Press any key to continue*/*下面是两个链表比较是否相同的递归方法,根据它,来写广义表的比较方法(从某种意义说,广义表也是线性表,它有着和线性表相同的的性质)很多基本算法都可以根据线性表来推出广义表的算法*(仅供参考)*/*typedef struct node int data; struct node *pNext;NODE;/函数的声明NODE *init_list(void);void creat_list(NODE *pHead, int n);int same(NODE *p1, NODE *p2

20、);main() NODE *pHead1, *pHead2; int s; int n, m; pHead1 = init_list(); pHead2 = init_list(); printf(输入第一个链表的个数n); scanf(%d, &n); creat_list(pHead1, n); printf(输入第二个链表的个数n); scanf(%d, &m); creat_list(pHead2, m); s = same(pHead1-pNext, pHead2-pNext); if(1=s) printf(相等n); else printf(不相等n);/初始化头节点NODE *init_list(void) NODE *pHead = (NODE *)malloc(sizeof(NODE); if(NULL = pHead) printf(内存分配失败n); exit(-1); pHead-pNext = NULL; return pHead;/创建链表void creat_list(NODE *pHead,int n) int i; NODE *pNow = pHead, *pNew; printf(输入%d个数据n, n); for(i = 0; ipNext = NULL; scanf(

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

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