大数据结构实验报告材料.docx

上传人:b****7 文档编号:9643895 上传时间:2023-02-05 格式:DOCX 页数:22 大小:111.74KB
下载 相关 举报
大数据结构实验报告材料.docx_第1页
第1页 / 共22页
大数据结构实验报告材料.docx_第2页
第2页 / 共22页
大数据结构实验报告材料.docx_第3页
第3页 / 共22页
大数据结构实验报告材料.docx_第4页
第4页 / 共22页
大数据结构实验报告材料.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

大数据结构实验报告材料.docx

《大数据结构实验报告材料.docx》由会员分享,可在线阅读,更多相关《大数据结构实验报告材料.docx(22页珍藏版)》请在冰豆网上搜索。

大数据结构实验报告材料.docx

大数据结构实验报告材料

本科生实验报告

(二)

姓名:

学院:

专业:

班级:

实验课程名称:

数据结构

实验日期:

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,…

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

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

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