大数据结构实验报告材料.docx
- 文档编号:9643895
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:22
- 大小:111.74KB
大数据结构实验报告材料.docx
《大数据结构实验报告材料.docx》由会员分享,可在线阅读,更多相关《大数据结构实验报告材料.docx(22页珍藏版)》请在冰豆网上搜索。
大数据结构实验报告材料
本科生实验报告
(二)
姓名:
学院:
专业:
班级:
实验课程名称:
数据结构
实验日期:
2013年5月25日
指导教师及职称:
实验成绩:
开课时间:
2012~2013学年第二学期
实验题目
数据结构实验
小组合作
姓名
班级
学号
3
一、实验目的
数组和广义表:
实验6.1:
求5*5阶螺旋方阵;
实验6.2:
求一个矩阵的马鞍点;
实验6.3:
求两个对称矩阵之和与乘积;
实验6.4:
实现稀疏矩阵(采用三元组表示)的基本运算;
实验6.5:
实现广义表的基本运算。
二.实验环境
计算机Visualc++6.0
三、实验内容与步骤
6.1以下是一个5*5的螺旋矩阵。
设计一个程序exp6-1.cpp输出该形式的n*n(n<10)阶方阵(顺时针方向旋进)。
12345
161718196
152425207
142322218
131211109
主程序如下:
#include"stdafx.h"
#include
#defineMaxLen10
voidfun(inta[MaxLen][MaxLen],intn)
{
inti,j,k=0,m;
if(n%2==0)//m=én/2ù
m=n/2;
else
m=n/2+1;
for(i=0;i { for(j=i;j { k++; a[i][j]=k; } for(j=i+1;j { k++; a[j][n-i-1]=k; } for(j=n-i-2;j>=i;j--) { k++; a[n-i-1][j]=k; } for(j=n-i-2;j>=i+1;j--) { k++; [j][i]=k; } } } voidmain() { intn,i,j; inta[MaxLen][MaxLen]; printf("输入n(n<10): "); scanf("%d",&n); fun(a,n); printf("%d阶数字方阵如下: \n",n); for(i=0;i { for(j=0;j printf("%4d",a[i][j]); printf("\n"); } } 运行结果: 6.2: 如果矩阵A中存在这样的一个元素A[i][j]满足条件: A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称为该矩阵的一个马鞍点。 设计一个程序exp6-2.cpp计算出m*n的矩阵A的所有马鞍点。 主程序如下: #include #defineM4 #defineN4 voidMinMax(intA[M][N]) {inti,j; boolhave=false; intmin[M],max[N]; for(i=0;i { min[i]=A[i][0]; for(j=1;j if(A[i][j] min[i]=A[i][j]; } for(j=0;j {max[j]=A[0][j]; for(i=1;i if(A[i][j]>max[j]) max[j]=A[i][j]; } for(i=0;i for(j=0;j if(min[i]==max[j]) {printf("A[%d][%d]=%d\n",i,j,A[i][j]);//显示马鞍点 have=true; } if(! have) printf("没有鞍点\n"); } voidmain() {inti,j; intA[M][N]={{9,7,6,8},{20,26,22,25},{28,36,25,30},{12,4,2,6}}; printf("A矩阵: \n"); for(i=0;i {for(j=0;j printf("%4d",A[i][j]); printf("\n"); } printf("A矩阵中的马鞍点: \n"); MinMax(A);//调用MinMax()找马鞍点 } 运行结果: 6.3: 已知A和B为两个n*n阶的对称矩阵,输入时,对称矩阵只输入下三角形元素,存入一维数组,如图6.5所示(对称矩阵M存储在一维数组A中),设计一个程序exp6-3.cpp实习如下功能: (1)求对称矩阵A和B的和。 (2)求对称矩阵A和B的乘积。 A: 图6.5对称矩阵的存储转换形式主程序如下: #include #defineN4 #defineM10 intvalue(inta[],inti,intj) { if(i>=j) returna[(i*(i-1))/2+j]; else returna[(j*(j-1))/2+i]; } voidmadd(inta[],intb[],intc[][N]) { inti,j; for(i=0;i for(j=0;j c[i][j]=value(a,i,j)+value(b,i,j); } voidmult(inta[],intb[],intc[][N]) { inti,j,k,s; for(i=0;i for(j=0;j { s=0; for(k=0;k s=s+value(a,i,k)*value(b,k,j); c[i][j]=s; } } voiddisp1(inta[]) { inti,j; for(i=0;i { for(j=0;j printf("%4d",value(a,i,j)); printf("\n"); } } voiddisp2(intc[][N]) { inti,j; for(i=0;i { for(j=0;j printf("%4d",c[i][j]); printf("\n"); } } voidmain() { inta[M]={1,2,3,4,5,6,7,8,9,10}; intb[M]={1,1,1,1,1,1,1,1,1,1}; intc1[N][N],c2[N][N]; madd(a,b,c1); mult(a,b,c2); printf("a矩阵: \n");disp1(a); printf("b矩阵: \n");disp1(b); printf("a+b: \n");disp2(c1); printf("a×b: \n");disp2(c2); printf("\n"); } 运行结果: 6.4: : 假设n*n的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能: (1)生成如下两个稀疏矩阵矩阵的三元组a和b: (2)输出a转置矩阵的三元组; (3)输出a+b的三元组; (4)输出a*b的三元组。 主程序如下: #include #defineN4 typedefintElemType; #defineMaxSize100//矩阵中非零元素最多个数 typedefstruct {intr;//行号 intc;//列号 ElemTyped;//元素值 }TupNode;//三元组定义 typedefstruct {introws;//行数值 intcols;//列数值 intnums;//非零元素个数 TupNodedata[MaxSize]; }TSMatrix;//三元组顺序表定义 voidCreatMat(TSMatrix&t,ElemTypeA[N][N]) { inti,j; t.rows=N;t.cols=N;t.nums=0; for(i=0;i { for(j=0;j if(A[i][j]! =0) { t.data[t.nums].r=i;t.data[t.nums].c=j; t.data[t.nums].d=A[i][j];t.nums++; } } } voidDispMat(TSMatrixt) { inti; if(t.nums<=0) return; printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums); printf("\t------------------\n"); for(i=0;i printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d); } voidTranMat(TSMatrixt,TSMatrix&tb) { intp,q=0,v;//q为tb.data的下标 tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums; if(t.nums! =0) { for(v=0;v for(p=0;p if(t.data[p].c==v) { tb.data[q].r=t.data[p].c; tb.data[q].c=t.data[p].r; tb.data[q].d=t.data[p].d; q++; } } } boolMatAdd(TSMatrixa,TSMatrixb,TSMatrix&c) { inti=0,j=0,k=0; ElemTypev; if(a.rows! =b.rows||a.cols! =b.cols) returnfalse;//行数或列数不等时不能进行相加运算 c.rows=a.rows;c.cols=a.cols;//c的行列数与a的相同 while(i { if(a.data[i].r==b.data[j].r)//行号相等时 { if(a.data[i].c { c.data[k].r=a.data[i].r;//将a元素添加到c中 c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; k++;i++; } elseif(a.data[i].c>b.data[j].c)//a元素的列号大于b元素的列号 { c.data[k].r=b.data[j].r;//将b元素添加到c中 c.data[k].c=b.data[j].c; c.data[k].d=b.data[j].d; k++;j++; } else//a元素的列号等于b元素的列号 { v=a.data[i].d+b.data[j].d; if(v! =0)//只将不为0的结果添加到c中 { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=v; k++; } i++;j++; } } elseif(a.data[i].r { c.data[k].r=a.data[i].r;//将a元素添加到c中 c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; k++;i++; } else//a元素的行号大于b元素的行号 { c.data[k].r=b.data[j].r;//将b元素添加到c中 c.data[k].c=b.data[j].c; c.data[k].d=b.data[j].d; k++;j++; } c.nums=k; } returntrue; } intgetvalue(TSMatrixc,inti,intj) { intk=0; while(k =i||c.data[k].c! =j)) k++; if(k return(c.data[k].d); else return(0); } boolMatMul(TSMatrixa,TSMatrixb,TSMatrix&c) { inti,j,k,p=0; ElemTypes; if(a.cols! =b.rows)//a的列数不等于b的行数时不能进行相乘运算 returnfalse; for(i=0;i for(j=0;j { s=0; for(k=0;k s=s+getvalue(a,i,k)*getvalue(b,k,j); if(s! =0)//产生一个三元组元素 { c.data[p].r=i; c.data[p].c=j; c.data[p].d=s; p++; } } c.rows=a.rows; c.cols=b.cols; c.nums=p; returntrue; } voidmain() { ElemTypea1[N][N]={{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}}; ElemTypeb1[N][N]={{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}}; TSMatrixa,b,c; CreatMat(a,a1); CreatMat(b,b1); printf("a的三元组: \n");DispMat(a); printf("b的三元组: \n");DispMat(b); printf("a转置为c\n"); TranMat(a,c); printf("c的三元组: \n");DispMat(c); printf("c=a+b\n"); MatAdd(a,b,c); printf("c的三元组: \n");DispMat(c); printf("c=a×b\n"); MatMul(a,b,c); printf("c的三元组: \n");DispMat(c); } 运行结果: 6.5: 编写一个程序exp6-5.cpp,实现广义表的各种运算,并在此基础上设计一个主程序完成如下功能: (1)建立广义表g=“(b,(b,a,(#),d),((a,b),c,((#))))”的链式存储结构; (2)输出广义表g的长度; (3)输出广义表g的深度; (4)输出广义表g的最大原子。 主程序如下: #include #include typedefcharElemType; typedefstructlnode {inttag;//节点类型标识 union { ElemTypedata; structlnode*sublist; }val; structlnode*link;//指向下一个元素 }GLNode; GLNode*CreateGL(char*&s)//返回由括号表示法表示s的广义表链式存储结构 {GLNode*g; charch=*s++;//取一个字符 if(ch! ='\0')//串未结束判断 {g=(GLNode*)malloc(sizeof(GLNode));//创建一个新节点 if(ch=='(')//当前字符为左括号时 {g->tag=1;//新节点作为表头节点 g->val.sublist=CreateGL(s);//递归构造子表并链到表头节点 } elseif(ch==')') g=NULL;//遇到')'字符,g置为空 elseif(ch=='#')//遇到'#'字符,表示空表 g->val.sublist=NULL; else//为原子字符 {g->tag=0;//新节点作为原子节点 g->val.data=ch; } } else//串结束,g置为空 g=NULL; ch=*s++;//取下一个字符 if(g! =NULL)//串未结束,继续构造兄递节点 if(ch==',')//当前字符为',' g->link=CreateGL(s);//递归构造兄递节点 else//没有兄弟了,将兄弟指针置为NULL g->link=NULL; returng;//返回广义表g } intGLLength(GLNode*g)//求广义表g的长度 { intn=0; g=g->val.sublist;//g指向广义表的第一个元素 while(g! =NULL) { n++; g=g->link; } returnn; } intGLDepth(GLNode*g)//求广义表g的深度 { intmax=0,dep; if(g->tag==0) return0; g=g->val.sublist;//g指向第一个元素 if(g==NULL)//为空表时返回1 return1; while(g! =NULL)//遍历表中的每一个元素 { if(g->tag==1)//元素为子表的情况 { dep=GLDepth(g);//递归调用求出子表的深度 if(dep>max)max=dep;//max为同一层所求过的子表中深度的最大值 } g=g->link;//使g指向下一个元素 } return(max+1);//返回表的深度 } voidDispGL(GLNode*g)//输出广义表g {if(g! =NULL)//表不为空判断 {//先输出g的元素 if(g->tag==0)//g的元素为原子时 printf("%c",g->val.data);//输出原子值 else//g的元素为子表时 {printf("(");//输出'(' if(g->val.sublist==NULL)//为空表时 printf("#"); else//为非空子表时 DispGL(g->val.sublist);//递归输出子表 printf(")");//输出')' } if(g->link! =NULL) {printf(","); DispGL(g->link);//递归输出g的兄弟 } } } ElemTypemaxatom(GLNode*g)//求广义表g中最大原子 { ElemTypemax1,max2; if(g! =NULL) { if(g->tag==0) { max1=maxatom(g->link); return(g->val.data>max1? g->val.data: max1); } else { max1=maxatom(g->val.sublist); max2=maxatom(g->link); return(max1>max2? max1: max2); } } else return0; } voidmain() { GLNode*g; char*str="(b,(b,a,(#),d),((a,b),c,((#))))"; g=CreateGL(str); printf("广义表g: ");DispGL(g);printf("\n"); printf("广义表g的长度: %d\n",GLLength(g)); printf("广义表g的深度: %d\n",GLDepth(g)); printf("最大原子: %c\n",maxatom(g)); } 运行结果: 四、实验过程与分析 1.通过实验6.1的学习,了解了如何求5*5阶螺旋方阵,并且方阵是建立在数组的基础上,且从中掌握了数组的基本运算如Value(A,index1,index2,…,indexd): A是已存在的d维数组,index1,index2,…,indexd是指定的d个下标值,且这些下标均未越界。 其运算结果是返回由上述下标指定的A中的对应;Assign(A,e,index1,index2,…,indexd): A是已存在的d维数组,e为元素变量,index1,index2,…
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 材料