数据结构 课程设计 十字链表

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计十字链表

xx学院

一、问题的分析和任务定义:

该设计是采用十字链表表示稀疏矩阵,并实现矩阵的加法运算。还要检查有关运算的条

件,并对错误的条件产生报警。

根据对该程序任务的理解,对本程序分别从以下几个方面进行分析: 1.输入数据的的类型和输入的范围

该程序首先输入稀疏矩阵的行数和列数,再输入一个有非零元素的行号,有非零元素的

列号,再输入非零元素的值,然后输入当前行下一个元素所在的列,如果该行只有一个非零

元素就直接输入-1结束当前行的一组数据,如果还有其他的非零元素的话就输入当前行下

一个非零元素所在的列,就这样,直到该当前行的非零元素输入完。然后再输入当前列下一

个非零元素的所在的行,其步骤与前一步相同。其输入值都为稀疏矩阵的数据,类型都为整

型。

2.输出数据的形式

这样得到一个稀疏矩阵a,以同样的方法就可以得到另一个稀疏矩阵b,最后就可以得到稀疏矩阵a和稀疏矩阵b的和矩阵.输出是以稀疏矩阵的标准形式输出的。输出值的有两种:

一种是字符,一种是整数。输出的字符型数据是稀疏矩阵的代号,输出的整型数据为稀疏矩

阵的值。

3.测试数据

测试数据一:测试数据二:稀疏矩阵的行数与列数:3 3 稀疏矩阵的行数与列数:3 3 矩阵a:矩阵b:矩阵a:矩阵b: 2 0 0 0 0 2 2 0 0 0 0 0

0 0 6 3 0 0 0 0 0 0 0 0

7 0 0 2 0 5 0 0 0 7 0 0

二、概要设计和数据结构的选择:

1.算法(程序)中用到的所有各种数据类型的定义:

定义整型数据为int m,int n,分别代表矩阵的行和列;

定义十字链表类型结点OLnode *h,*p分别代表为头结点开辟空间和指向下一结点;

在主函数中定义OLnode *a,*b,分别表示a,b两个稀疏矩阵。 2.各程序模块之间的层次关系:

程序中用到的函数:

1 OLnode *create(int m,int n); 创建以十字链表表示的一个元素全为零的稀疏矩阵。

2 int insert(OLnode *a ,int row,int col,int val); 创建稀疏矩阵结点插入函数。

3 OLnode *shuru(); 创建稀疏矩阵的输入函数。

4 void shuchu(OLnode *a); 创建稀疏矩阵的输出函数。

5 OLnode

*add(OLnode *a,OLnode *b);创建对两个相同行列数矩阵进行加法运算函数。

6 void main();创建该程序的主函数。

3.程序中数据结构的选择:如下定义:

typedef struct lnode //十字链表结点类型

{

int row,col;

int val;

struct lnode *rptr ,*cptr ;

}OLnode;

其中row,col和val域分别用来存储非零元素的行号、列号和元素值rptr域用来存储指向同一行下一个结点的指针,cptr域用来指向同一列下一个结点的指针,如果不存在下

一个结点,则相应的指针域为空。

1

4.流程图:

根据利用十字链表表示稀疏矩阵,并实现矩阵的加法运算的算法,可以设计如下流程图:

该流程图体现了本实验问题的算法设计思想:首先,定义十字链表结点的类型并利用十字链

表建立相应的稀疏矩阵,然后再将建立好的两个相同行列数的稀疏矩阵进行求和运算并输出

最终结果。

定义十字链表结点类型

建立十字链表表示稀疏矩阵

稀疏矩阵a 稀疏矩阵b

稀疏矩阵a,b求和

输出结果

结束

图1. 程序流程图三、详细设计和编码:

1.建立一个十字链表表示的稀疏矩阵,定义为m行n列,并为头结点开辟空间,同时定义该稀疏矩阵不会多于100列,每个行链表是一个环,使全部行链表头结点构成环;再定义该

稀疏矩阵不会多于100行,每个列链表是一个环,使全部列链表头结点构成环OLnode *create(int m,int n) //m行n列

{ OLnode *h,*p;

int k;

h=(OLnode *)malloc(sizeof(OLnode)); //为头结点开辟空间 h->row=m;h-

>col=n;h->val=0; //行,数和非零元素元素值 h->rptr=(OLnode

*)malloc(sizeof(OLnode)*n);

h->cptr=(OLnode *)malloc(sizeof(OLnode)*m);

for(p=h->cptr,k=0;k

{

p->col=100; //定义该稀疏矩阵不会多于100列 p->rptr=p; //每个行链表是一个环

p->cptr=kcptr ; //使全部行链表头结点构成环 }

for(p=h->rptr ,k=0;k

{

2

p->row=100; //该稀疏矩阵不会多于100行

p->cptr=p; //每个列链表是一个环 p->rptr=krptr; //使全部列链表头结点构成环

}

return h;

}

2.在十字链表中插入一个结点,对于不合理的行列号返回错误。然后分别对行和列进行插

int insert(OLnode *a ,int row,int col,int val)

{

OLnode *p,*q,*r,*u,*v; /* 在十字链表中插入一个结点*/

if(row>=a->row||col>=a->col) return -2; /* 不合理的行列号 */

r=(OLnode *)malloc(sizeof(OLnode));

r->row=row;r->col=col;r->val=val;

p=a->cptr +row;q=p->rptr ;

while(q->colrptr ;}

if(q->col==col) return -1; //该行已有col行元素

u=a->rptr +col;v=u->cptr ;

while(v->row

{u=v;v=v->cptr ;}

if(v->row==row) return -1; //该列已有row行元素

p->rptr=r; r->rptr=q; //插入到行链中 u->cptr=r; r->cptr=v; //插入到列链中 a->val=val;

return 0; //插入成功

相关文档
最新文档