第五章 数组和稀疏矩阵数据结构基本实验算法.docx
- 文档编号:24014535
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:19
- 大小:19.02KB
第五章 数组和稀疏矩阵数据结构基本实验算法.docx
《第五章 数组和稀疏矩阵数据结构基本实验算法.docx》由会员分享,可在线阅读,更多相关《第五章 数组和稀疏矩阵数据结构基本实验算法.docx(19页珍藏版)》请在冰豆网上搜索。
第五章数组和稀疏矩阵数据结构基本实验算法
实验1求5×5阶螺旋方阵
以下是一个5×5阶螺旋方阵。
设计一个算法输出该形式的n×n(n<10)阶方阵(顺时针方向旋进)。
12345
161718196
152425207
142322218
131211109
#include
#defineMaxLen10
voidfun(inta[MaxLen][MaxLen],intn)
{
inti,j,k=0,m;
if(n%2==0)
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-2-i;j>=i;j--)//产生该圈下横行的数字 { k++; a[n-1-i][j]=k; } for(j=n-i-2;j>=i+1;j--)//产生该圈左竖列的数字 { k++; a[j][i]=k; } } } voidmain() { intn,i,j; inta[MaxLen][MaxLen]; printf("\n"); 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"); } printf("\n"); } /////////////////////////////////////////////////////////////////////实验2求一个矩阵的马鞍点 如果矩阵A中存在这样的一个元素A[i][j]满足条件: A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。 编写一个程序计算出m×n的矩阵A的所有马鞍点。 #include #defineM4 #defineN4 voidMinMax(intA[M][N]) { inti,j,have=0; 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 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=1; } 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()找马鞍点 } /////////////////////////////////////////////////////////////////////实验3求两个对称矩阵之和与乘积 已知A和B为两个n×n的对称矩阵,输入时,对称矩阵只输入下三角元素,存入一维数组,如图5.5所示(对称矩阵M存储在一维数组A中),编写一个程序实现如下功能: (1)求对称矩阵A和B的和。 (2)求对称矩阵A和B的乘积。 #include #definen4 #definem10 intvalue(inta[],inti,intj)//返回压缩存储a中A[i][j]的值 { if(i>=j) returna[(i*(i-1))/2+j]; else returna[(j*(j-1))/2+i]; } voidmadd(inta[],intb[],intc[n][n])//求压缩存储a和b的和 { 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][n])//求压缩存储a和b的乘积 { 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[])//输出压缩存储a { inti,j; for(i=0;i { for(j=0;j printf("%4d",value(a,i,j)); printf("\n"); } } voiddisp2(intc[n][n])//输出对称矩阵c { 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("\n"); printf("a矩阵: \n");disp1(a); printf("b矩阵: \n");disp1(b); printf("a+b: \n");disp2(c1); printf("a*b: \n");disp2(c2); printf("\n"); } /////////////////////////////////////////////////////////////////////实验4实现稀疏矩阵(采用三元组表示)的基本运算 假设n×n的稀疏矩阵A采用三元组表示,编写一个程序实现如下功能: (1)生成如下两个稀疏矩阵的三元组a和b。 10333000 01000400 00100010 00110002 (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])//产生稀疏矩阵A的三元组表示 { 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)//求三元组表示t的转置矩阵tb { intp,q=0,v; 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++; } } } intMatAdd(TSMatrixa,TSMatrixb,TSMatrix&c) { inti=0,j=0,k=0; ElemTypev; if(a.rows! =b.rows||a.cols! =b.cols) return0;//行数和列数不等时不能进行相加运算 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++; } else if(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)//只将不是零的结果添加到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++; } } else if(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].r=b.data[j].c; c.data[k].d=b.data[j].d; k++; j++; } c.nums=k; } return1; } intvalue(TSMatrixc,inti,intj) { intk=0; while(k =i||c.data[k].c! =j)) k++; if(k return(c.data[k].d); else return(0); } intMatMul(TSMatrixa,TSMatrixb,TSMatrix&c) { inti,j,k,p=0; ElemTypes; if(a.cols! =b.rows)//a的列数不等于b的列数不能进行相乘运算 return0; for(i=0;i for(j=0;j { s=0; for(k=0;k s=s+value(a,i,k)*value(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; return1; } 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); } /////////////////////////////////////////////////////////////////////实验5实现广义表的基本运算 编写一个程序,实现广义表的各种运算,并在此基础上设计一个主程序完成如下功能: (1)建立广义表g=“(b,(b,a,a),((a,b),c))”的链式存储结构。 (2)输出广义表g的长度。 (3)输出广义表g的深度。 #include #include typedefcharElemType; typedefstructlnode { inttag;//节点类型标识 union { ElemTypedata; structlnode*sublist; }val; structlnode*link;//指向下一个元素 }GLNode; GLNode*CreatGL(char*&s)//由串s建立一个广义表 { GLNode*h; charch; ch=*s++;//取一个扫描字符 if(ch! ='\0')//串未结束判断 { h=(GLNode*)malloc(sizeof(GLNode));//创建一个新节点 if(ch=='(')//当前字符为左括号时 { h->tag=1;//新节点作为表头节点 h->val.sublist=CreatGL(s);//递归构造子表并链接到表头节点 } elseif(ch==')') h=NULL;//遇到“)”字符,字表为空 else { h->tag=0;//新节点作为原子节点 h->val.data=ch; } } else h=NULL;//串结束,子表为空 ch=*s++;//取下一个扫描字符 if(h! =NULL)//串未结束判断 if(ch==',')//当前字符为“,” h->link=CreatGL(s);//递归构造后续子表 else//串结束 h->link=NULL;//处理表的最后一个元素 returnh;//返回广义表指针 } 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)//为空表时返回 return1; while(g! =NULL)//遍历表的每一个元素 { if(g->tag==1)//元素为子表的情况 { dep=GLDepth(g);//递归调用求出子表的深度 if(dep>max)//max为同一层所求过的子表中深度的最大值 max=dep; } g=g->link;//使g指向下一个元素 } return(max+1);//返回表的深度 } voidDispGL(GLNode*g)//输出广义表g { if(g! =NULL)//表不为空判断 { if(g->tag==1)//为表节点时 { printf("(");//输出“(” if(g->val.sublist==NULL)//输出空子表 printf(""); else DispGL(g->val.sublist);//递归输出子表 } else printf("%c",g->val.data);//为原子时输出元素值 if(g->tag==1)printf(")");//为表节点时输出“)” if(g->link! =NULL) { printf(","); DispGL(g->link);//递归输出后续表的内容 } } } voidmain() { GLNode*g; char*str="(b,(b,a,a),((a,b),c))"; g=CreatGL(str); printf("广义表g: ");DispGL(g);printf("\n"); printf("广义表g的长度: %d\n",GLLength(g)); printf("广义表g的深度: %d\n",GLDepth(g)); printf("\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五章 数组和稀疏矩阵数据结构基本实验算法 第五 数组 稀疏 矩阵 数据结构 基本 实验 算法