数据结构矩阵实验报告.docx
《数据结构矩阵实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构矩阵实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
![数据结构矩阵实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/1/d160e9e2-138a-4dfb-b9bb-2cc102aa202a/d160e9e2-138a-4dfb-b9bb-2cc102aa202a1.gif)
数据结构矩阵实验报告
一、实验目的和要求
(1)掌握各种特殊矩阵如对称矩阵、上下三角矩阵和对角矩阵的压缩存储方法。
(2)掌握稀疏矩阵的各种存储结构以及基本运算实现算法。
(3)掌握广义表的递归特性、存储结构以及基本运算实现算法。
二、实验环境、内容和方法
实验内容:
①打开VisualC++6.0并输入实验指导书上的程序,并进行调试和运行。
②自行尝试编写第六个实验。
实验方法:
(一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。
(二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。
(三)根据实验内容,编译程序。
实验环境:
WindowsxpVisualC++6.0
三、实验过程描述
实验①以下是一个5*5阶的螺旋方阵。
设计一个程序输出该形式的n*n阶方阵。
12345
161718196
152425207
142322218
131211109
一、打开VisualC++6.0并输入如下程序
#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-i-2;j>=i;j--)
{
k++;
a[n-i-1][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;jprintf("%4d",a[i][j]);
printf("\n");
}
printf("\n");
}
二、,编译并连接此程序,如图
三、运行此程序,如图
实验②假设n*n的稀疏矩阵A采用三元组表示,设计一个程序实现如下功能:
(1)生成如下两个稀疏矩阵的三元组a和b:
a:
1030b:
3000
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])
{
inti,j;
t.rows=N;t.cols=N;t.nums=0;
for(i=0;i{
for(j=0;jif(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;iprintf("\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;
tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;
if(t.nums!
=0)
{
for(v=0;vfor(p=0;pif(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;
while(i{
if(a.data[i].r==b.data[j].r)
{
if(a.data[i].c{
c.data[k].r=a.data[i].r;
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)
{
c.data[k].r=b.data[j].r;
c.data[k].c=b.data[j].c;
c.data[k].d=b.data[j].d;
k++;j++;
}
else
{
v=a.data[i].d+b.data[j].d;
if(v!
=0)
{
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;
c.data[k].c=a.data[i].c;
c.data[k].d=a.data[i].d;
k++;i++;
}
else
{
c.data[k].r=b.data[j].r;
c.data[k].c=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(kreturn(c.data[k].d);
else
return(0);
}
intMatMul(TSMatrixa,TSMatrixb,TSMatrix&c)
{
inti,j,k,p=0;
ElemTypes;
if(a.cols!
=b.rows)
return0;
for(i=0;ifor(j=0;j{
s=0;
for(k=0;ks=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);
}
二、程序运行结果如图
实验③编写一个程序实现广义表的各种运算,并在此基本上设计一个程序完成如下功能:
(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*CreatGL(char*&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;
}
}
elseh=NULL;
ch=*s++;
if(h!
=NULL)
if(ch==',')
h->link=CreatGL(s);
else
h->link=NULL;
returnh;
}
intGLLength(GLNode*g)
{
intn=0;
g=g->val.sublist;
while(g!
=NULL)
{
n++;
g=g->link;
}
returnn;
}
intGLDepth(GLNode*g)
{
intmax=0,dep;
if(g->tag==0)
return0;
g=g->val.sublist;
if(g==NULL)
return1;
while(g!
=NULL)
{
if(g->tag==1)
{
dep=GLDepth(g);
if(dep>max)max=dep;
}
g=g->link;
}
return(max+1);
}
voidDispGL(GLNode*g)
{
if(g!
=NULL)
{
if(g->tag==1)
{
printf("(");
if(g->val.sublist==NULL)printf("");
elseDispGL(g->val.sublist);
}
elseprintf("%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");
}
二、程序运行结果如图