稀疏矩阵十字链表的存储.docx

上传人:b****1 文档编号:10765064 上传时间:2023-05-27 格式:DOCX 页数:13 大小:39.64KB
下载 相关 举报
稀疏矩阵十字链表的存储.docx_第1页
第1页 / 共13页
稀疏矩阵十字链表的存储.docx_第2页
第2页 / 共13页
稀疏矩阵十字链表的存储.docx_第3页
第3页 / 共13页
稀疏矩阵十字链表的存储.docx_第4页
第4页 / 共13页
稀疏矩阵十字链表的存储.docx_第5页
第5页 / 共13页
稀疏矩阵十字链表的存储.docx_第6页
第6页 / 共13页
稀疏矩阵十字链表的存储.docx_第7页
第7页 / 共13页
稀疏矩阵十字链表的存储.docx_第8页
第8页 / 共13页
稀疏矩阵十字链表的存储.docx_第9页
第9页 / 共13页
稀疏矩阵十字链表的存储.docx_第10页
第10页 / 共13页
稀疏矩阵十字链表的存储.docx_第11页
第11页 / 共13页
稀疏矩阵十字链表的存储.docx_第12页
第12页 / 共13页
稀疏矩阵十字链表的存储.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

稀疏矩阵十字链表的存储.docx

《稀疏矩阵十字链表的存储.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵十字链表的存储.docx(13页珍藏版)》请在冰点文库上搜索。

稀疏矩阵十字链表的存储.docx

稀疏矩阵十字链表的存储

电子信息学院

实验报告书

课程名:

数据结构

题目:

稀疏矩阵十字链表的存储

实验类别:

设计

班级:

BX1001

学号:

41

姓名:

赵艳

 

2011年10月24日

1、实验题目

(1)掌握稀疏矩阵十字链表存储的方法。

(2)掌握稀疏矩阵的显示,查找等基本算法。

2、实验内容

(1)创建空的稀疏矩阵十字链表存储结构。

(2)稀疏矩阵十字链表的数据输入。

(3)稀疏矩阵十字链表的数据显示。

(4)稀疏矩阵十字链表的数据查找。

3、实验要求

(1)利用C(C++)语言完成算法设计和程序设计。

(2)上机调试通过实验程序。

(3)输入右侧矩阵A,检验程序运行结果。

(4)给出具体的算法分析,包括时间复杂度和空间复杂度等。

(5)撰写实验报告。

4、实验步骤与源程序

实验步骤

先定义各个需要的函数组成部分,然后依次构建四个子函数,分别是新建十字链表、显示十字链表、输入链表元素、查找链表元素;然后是通过主函数对各个子函数的调用,来实现题目的目的。

整个程序中主要用到指针定位,for循环,还有switch选择语句。

其中对指针的运用很难,很难定位指针,而且指针太多,繁杂。

源代码

#include

#include

#include

#include

structlinknode

{

introws,cols;

linknode*down,*right;

unionvnext

{

intv;

linknode*next;

}node;

};

linknode*CreateMatlind();

linknode*InputMatlind(linknode,int);

voidShowMatlind(linknode);

voidSearchMatlind(linknode*hm,ints);

linknode*CreateMatlind()

{

inti,j,maxlin;

linknode*hm,*cp[100],*p;

printf("\n\t\t请输入稀疏矩阵的行数,列数(用逗号隔开):

");

scanf("%d,%d",&i,&j);

if(i>j)

maxlin=i;

else

maxlin=j;

hm=newlinknode;

cp[0]=hm;

for(intl=1;l<=maxlin;l++)

{

p=newlinknode;

p->rows=0;

p->cols=0;

p->down=p;

p->right=p;

cp[l]=p;

cp[l-1]->node.next=p;

}

cp[maxlin]->node.next=hm;

hm=newlinknode;

hm->rows=i;

hm->cols=j;

returnhm;

}

linknode*InputMatlind(linknode*hm,ints)

{

linknode*cp[100],*p,*q;

intm,n,t;

inti,j,k,maxlin;

i=hm->rows;

j=hm->cols;

if(i>j)

maxlin=i;

else

maxlin=j;

cp[0]=hm;

for(intl=1;l<=maxlin;l++)

{

p=newlinknode;

p->rows=0;

p->cols=0;

p->down=p;

p->right=p;

cp[l]=p;

cp[l-1]->node.next=p;

}

cp[maxlin]->node.next=hm;

for(intx=0;x

{

printf("\n\t\t请输入非零元素的行号,列号和值(用逗号隔开):

");

scanf("%d,%d,%d",&m,&n,&t);

p=newlinknode;

p->rows=m;

p->cols=n;

p->node.v=t;

k=1;

q=cp[m];

while(k)

{

if((q->right==cp[m])||(q->right->cols>n))

{

p->right=q->right;

q->right=p;

k=0;

}

elseif(q->right->cols==n)

{

p->right=q->right->right;

q->right=p;

k=0;

}

elseif(q->right->cols

{

q=q->right;

k=1;

}

}

k=1;

q=cp[n];

while(k)

{

if((q->down==cp[n])||(q->down->rows>m))

{

p->down=q->down;

q->down=p;

k=0;

}

elseif(q->down->rows==m)

{

p->down=q->down->down;

q->down=p;

k=0;

}

elseif(q->down->rows

{

q=q->down;

k=1;

}

}

}

returnhm;

}

voidShowMatlind(linknode*hm)

{

intm,n;

linknode*p,*q;

m=hm->rows;

n=hm->cols;

q=p=hm->node.next;

p=p->right;

cout<

printf("\n\t\t");

for(inti=1;i<=m;i++)

{

for(intj=1;j<=n;j++)

{

if((p->rows==i)&&(p->cols==j))

{

printf("%8d",p->node.v);

}

else

printf("%8c",'0');

if((j==n)&&(p->right==q))

break;

elseif(p->right!

=q)

p=p->right;

}

printf("\n\n\t\t");

p=q;

q=p=p->node.next;

p=p->right;

}

}

voidSearchMatlind(linknode*hm,ints)

{

intm,n,k;

linknode*p,*q;

m=hm->rows;n=hm->cols;

q=p=hm->node.next;

p=p->right;

k=1;

while(k)

{

if((p->node.v)==s)

{

printf("\n\t\t行列值\n");

printf("\n\t\t元素位置:

第%2d行第%2d列%2d\n",p->rows,p->cols,p->node.v);

k=0;

}

elseif(p->right!

=q)

p=p->right;

else

{

p=q;

q=p=p->node.next;

if(p==hm)

{

printf("\n\t\t十字链表中无此元素!

\n");

k=0;

}

p=p->right;

}

}

}

voidmain()

{

ints,k,ch=1;

intchoice;

linknode*hm=NULL;

while(ch)

{

printf("\n");

printf("\n\t\t稀疏矩阵的十字链表存储系统\n");

printf("\n\t\t********************************************");

printf("\n\t\t*1-----新建十字链表*");

printf("\n\t\t*2-----显示十字链表*");

printf("\n\t\t*3-----查找元素*");

printf("\n\t\t*0-----退出*");

printf("\n\t\t********************************************");

printf("\n\n\t\t请输入菜单号:

");

scanf("%d",&choice);

switch(choice)

{

case1:

hm=CreateMatlind();

do

{

printf("\n\t\t请输入稀疏矩阵的非零元素个数:

");

scanf("%d",&s);

if(s>((hm->rows)*(hm->cols)))

{

printf("\n\t\t元素个数错误!

应小于或等于%d个\n",hm->rows*hm->cols);

k=1;

}

else

k=0;

}while(k);

hm=InputMatlind(hm,s);

break;

case2:

if(hm==NULL)

{

printf("\n\t\t链表为空!

\n");

break;

}

else

{

ShowMatlind(hm);

break;

}

case3:

if(hm==NULL)

{

printf("\n\t\t链表为空!

\n");

break;

}

else

{

printf("\n\t\t请输入您要查找的元素:

");

scanf("%d",&s);

SearchMatlind(hm,s);

break;

}

case0:

ch=0;

break;

}

if(choice==1||choice==2||choice==3)

{

printf("\n\t\t");

system("pause");

system("cls");

}

}

}

5、测试数据与实验结果(可以抓图粘贴)

 

6、结果分析与实验体会

本次试验是稀疏矩阵十字链表的存储,通过这个实验,我们可以更好的掌握稀疏矩阵十字链表存储的方法,以及稀疏矩阵的显示,查找等一些基本算法。

在实验中我们先定义对要定义的子函数进行声明,后建立新的存储结构,再后定义不同的子函数来实现稀疏矩阵十字链表的建立、显示、输入数据、查找等基本运算。

在实验编程中,我遇到了很多问题,因为课上有些内容老师还没有仔细的分析,所以有部分内容还是很生疏,自己看的效率也没有听老师接受的多,经过网上搜索和同学讨论等途径,才勉强把问题解决了,通过这次试验编程,也让我了解到了好好听老师课的重要性,还有课前预习,预习中剩下的还有的不明白得地方,在上课老师讲课过程中可以更加有取舍的听。

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

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2